Nexcessnet_Turpentine - Version 0.7.1

Version Notes

Supports Magento v1.6 and later

Download this release

Release Info

Developer Chris Wells
Extension Nexcessnet_Turpentine
Version 0.7.1
Comparing to
See all releases


Code changes from version 0.7.0 to 0.7.1

app/code/community/Nexcessnet/Turpentine/Block/Management.php CHANGED
@@ -24,7 +24,7 @@ class Nexcessnet_Turpentine_Block_Management
24
 
25
  public function __construct() {
26
  $this->_controller = 'varnish_management';
27
- // $this->setTemplate( 'turpentine/varnish_management.phtml' );
28
  parent::__construct();
29
  }
30
 
24
 
25
  public function __construct() {
26
  $this->_controller = 'varnish_management';
27
+
28
  parent::__construct();
29
  }
30
 
app/code/community/Nexcessnet/Turpentine/Block/Poll/ActivePoll.php CHANGED
@@ -21,11 +21,19 @@
21
 
22
  class Nexcessnet_Turpentine_Block_Poll_ActivePoll extends Mage_Poll_Block_ActivePoll {
23
 
24
- public function setTemplate($template)
25
- {
26
- $this->_template = $template;
27
- $this->setPollTemplate('turpentine/ajax.phtml', 'poll');
28
- $this->setPollTemplate('turpentine/ajax.phtml', 'results');
29
- return $this;
30
- }
 
 
 
 
 
 
 
 
31
  }
21
 
22
  class Nexcessnet_Turpentine_Block_Poll_ActivePoll extends Mage_Poll_Block_ActivePoll {
23
 
24
+ public function setTemplate($template)
25
+ {
26
+ if ((Mage::getConfig()->getModuleConfig('Mage_Poll')->is('active', 'true')) &&
27
+ (!Mage::getStoreConfig('advanced/modules_disable_output/Mage_Poll')))
28
+ {
29
+ $this->_template = $template;
30
+ $this->setPollTemplate('turpentine/ajax.phtml', 'poll');
31
+ $this->setPollTemplate('turpentine/ajax.phtml', 'results');
32
+ }
33
+ else
34
+ {
35
+ // Mage_Poll is disabled, so do nothing
36
+ }
37
+ return $this;
38
+ }
39
  }
app/code/community/Nexcessnet/Turpentine/Helper/Data.php CHANGED
@@ -130,7 +130,7 @@ class Nexcessnet_Turpentine_Helper_Data extends Mage_Core_Helper_Abstract {
130
  public function urlBase64Encode($str) {
131
  return str_replace(
132
  array('/', '+'),
133
- array('.', '-'),
134
  base64_encode($str) );
135
  }
136
 
@@ -143,7 +143,7 @@ class Nexcessnet_Turpentine_Helper_Data extends Mage_Core_Helper_Abstract {
143
  public function urlBase64Decode($str) {
144
  return base64_decode(
145
  str_replace(
146
- array('.', '-'),
147
  array('/', '+'),
148
  $str ) );
149
  }
130
  public function urlBase64Encode($str) {
131
  return str_replace(
132
  array('/', '+'),
133
+ array('_', '-'),
134
  base64_encode($str) );
135
  }
136
 
143
  public function urlBase64Decode($str) {
144
  return base64_decode(
145
  str_replace(
146
+ array('_', '-'),
147
  array('/', '+'),
148
  $str ) );
149
  }
app/code/community/Nexcessnet/Turpentine/Model/Observer/Esi.php CHANGED
@@ -226,12 +226,19 @@ class Nexcessnet_Turpentine_Model_Observer_Esi extends Varien_Event_Observer {
226
  $debugHelper->logInfo(
227
  'Checking ESI block candidate: %s',
228
  $blockObject->getNameInLayout() ? $blockObject->getNameInLayout() : $blockObject->getModuleName() );
229
- }
 
 
 
 
230
  if ($esiHelper->shouldResponseUseEsi() &&
231
  $blockObject instanceof Mage_Core_Block_Template &&
232
  $esiOptions = $blockObject->getEsiOptions()) {
233
 
234
  if ((isset($esiOptions['disableEsiInjection'])) && ($esiOptions['disableEsiInjection'] == 1)) {
 
 
 
235
  return;
236
  }
237
 
@@ -325,6 +332,8 @@ class Nexcessnet_Turpentine_Model_Observer_Esi extends Varien_Event_Observer {
325
  $methodParam = $esiHelper->getEsiMethodParam();
326
  $esiData = new Varien_Object();
327
  $esiData->setStoreId(Mage::app()->getStore()->getId());
 
 
328
  $esiData->setNameInLayout($blockObject->getNameInLayout());
329
  $esiData->setBlockType(get_class($blockObject));
330
  $esiData->setLayoutHandles($this->_getBlockLayoutHandles($blockObject));
226
  $debugHelper->logInfo(
227
  'Checking ESI block candidate: %s',
228
  $blockObject->getNameInLayout() ? $blockObject->getNameInLayout() : $blockObject->getModuleName() );
229
+
230
+ $debugHelper->logInfo( "-- block testing: shouldResponseUseEsi = " . $esiHelper->shouldResponseUseEsi());
231
+ $debugHelper->logInfo( "-- block testing: instanceof Mage_Core_Block_Template = " . $blockObject instanceof Mage_Core_Block_Template );
232
+ $debugHelper->logInfo( "-- block testing: Esi Options = " . print_r($blockObject->getEsiOptions(), true) );
233
+ }
234
  if ($esiHelper->shouldResponseUseEsi() &&
235
  $blockObject instanceof Mage_Core_Block_Template &&
236
  $esiOptions = $blockObject->getEsiOptions()) {
237
 
238
  if ((isset($esiOptions['disableEsiInjection'])) && ($esiOptions['disableEsiInjection'] == 1)) {
239
+ if ($esiHelper->getEsiBlockLogEnabled()) {
240
+ $debugHelper->logInfo("-- ESI Injection disabled");
241
+ }
242
  return;
243
  }
244
 
332
  $methodParam = $esiHelper->getEsiMethodParam();
333
  $esiData = new Varien_Object();
334
  $esiData->setStoreId(Mage::app()->getStore()->getId());
335
+ $esiData->setDesignPackage( Mage::getDesign()->getPackageName() );
336
+ $esiData->setDesignTheme( Mage::getDesign()->getTheme( 'layout' ) );
337
  $esiData->setNameInLayout($blockObject->getNameInLayout());
338
  $esiData->setBlockType(get_class($blockObject));
339
  $esiData->setLayoutHandles($this->_getBlockLayoutHandles($blockObject));
app/code/community/Nexcessnet/Turpentine/Model/Varnish/Admin/Socket.php CHANGED
@@ -407,12 +407,12 @@ class Nexcessnet_Turpentine_Model_Varnish_Admin_Socket {
407
  $regexp = '~^cli_buffer\s+(\d+)\s+\[bytes\]~';
408
  if ($this->getVersion() === '4.0') {
409
  // Varnish4 supports "16k" style notation
410
- $regexp = '~^cli_buffer\s+Value is:\s+(\d+)([k|m|g]{1})?\s+\[bytes\]~';
411
  }
412
  if (preg_match($regexp, $cliBufferResponse['text'], $match)) {
413
  $realLimit = (int) $match[1];
414
  if (isset($match[2])) {
415
- $factors = array('k'=>1, 'm'=>2, 'g'=>3);
416
  $realLimit *= pow(1024, $factors[$match[2]]);
417
  }
418
  } else {
@@ -499,6 +499,9 @@ class Nexcessnet_Turpentine_Model_Varnish_Admin_Socket {
499
  "Got unexpected response code from Varnish: %d\n%s",
500
  $response['code'], $response['text'] ));
501
  } else {
 
 
 
502
  return $response;
503
  }
504
  }
407
  $regexp = '~^cli_buffer\s+(\d+)\s+\[bytes\]~';
408
  if ($this->getVersion() === '4.0') {
409
  // Varnish4 supports "16k" style notation
410
+ $regexp = '~^cli_buffer\s+Value is:\s+(\d+)([k|m|g|b]{1})?\s+\[bytes\]~';
411
  }
412
  if (preg_match($regexp, $cliBufferResponse['text'], $match)) {
413
  $realLimit = (int) $match[1];
414
  if (isset($match[2])) {
415
+ $factors = array('b'=>0, 'k'=>1, 'm'=>2, 'g'=>3);
416
  $realLimit *= pow(1024, $factors[$match[2]]);
417
  }
418
  } else {
499
  "Got unexpected response code from Varnish: %d\n%s",
500
  $response['code'], $response['text'] ));
501
  } else {
502
+ if (Mage::getStoreConfig('turpentine_varnish/general/varnish_log_commands')) {
503
+ Mage::helper('turpentine/debug')->logDebug('VARNISH command sent: ' . $data);
504
+ }
505
  return $response;
506
  }
507
  }
app/code/community/Nexcessnet/Turpentine/Model/Varnish/Configurator/Abstract.php CHANGED
@@ -110,8 +110,8 @@ abstract class Nexcessnet_Turpentine_Model_Varnish_Configurator_Abstract {
110
  * @return string
111
  */
112
  protected function _getVclTemplateFilename($baseFilename) {
113
- $extensionDir = Mage::getModuleDir('', 'Nexcessnet_Turpentine');
114
- return sprintf('%s/misc/%s', $extensionDir, $baseFilename);
115
  }
116
 
117
  /**
@@ -130,12 +130,31 @@ abstract class Nexcessnet_Turpentine_Model_Varnish_Configurator_Abstract {
130
  *
131
  * @return string
132
  */
133
- protected function _getCustomIncludeFilename() {
 
 
134
  return $this->_formatTemplate(
135
- Mage::getStoreConfig('turpentine_varnish/servers/custom_include_file'),
136
  array('root_dir' => Mage::getBaseDir()) );
137
  }
138
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
139
  /**
140
  * Format a template string, replacing {{keys}} with the appropriate values
141
  * and remove unspecified keys
@@ -173,7 +192,11 @@ abstract class Nexcessnet_Turpentine_Model_Varnish_Configurator_Abstract {
173
  */
174
  protected function _getAdminFrontname() {
175
  if (Mage::getStoreConfig('admin/url/use_custom_path')) {
176
- return Mage::getStoreConfig('admin/url/custom_path');
 
 
 
 
177
  } else {
178
  return (string) Mage::getConfig()->getNode(
179
  'admin/routers/adminhtml/args/frontName' );
@@ -769,16 +792,6 @@ EOS;
769
  $tpl = <<<EOS
770
  if (req.http.User-Agent ~ "iP(?:hone|ad|od)|BlackBerry|Palm|Googlebot-Mobile|Mobile|mobile|mobi|Windows Mobile|Safari Mobile|Android|Opera (?:Mini|Mobi)") {
771
  set req.http.X-Normalized-User-Agent = "mobile";
772
- } else if (req.http.User-Agent ~ "MSIE") {
773
- set req.http.X-Normalized-User-Agent = "msie";
774
- } else if (req.http.User-Agent ~ "Firefox") {
775
- set req.http.X-Normalized-User-Agent = "firefox";
776
- } else if (req.http.User-Agent ~ "Chrome") {
777
- set req.http.X-Normalized-User-Agent = "chrome";
778
- } else if (req.http.User-Agent ~ "Safari") {
779
- set req.http.X-Normalized-User-Agent = "safari";
780
- } else if (req.http.User-Agent ~ "Opera") {
781
- set req.http.X-Normalized-User-Agent = "opera";
782
  } else {
783
  set req.http.X-Normalized-User-Agent = "other";
784
  }
@@ -795,7 +808,7 @@ EOS;
795
  protected function _vcl_sub_normalize_encoding() {
796
  $tpl = <<<EOS
797
  if (req.http.Accept-Encoding) {
798
- if (req.http.Accept-Encoding ~ "gzip") {
799
  set req.http.Accept-Encoding = "gzip";
800
  } else if (req.http.Accept-Encoding ~ "deflate") {
801
  set req.http.Accept-Encoding = "deflate";
@@ -887,6 +900,35 @@ EOS;
887
  'debug_ips' => Mage::getStoreConfig('dev/restrict/allow_ips') ));
888
  }
889
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
890
  /**
891
  * Get the allowed IPs when in maintenance mode
892
  *
@@ -927,6 +969,40 @@ EOS;
927
  'vcl_synth_content' => Mage::getStoreConfig('turpentine_vcl/maintenance/custom_vcl_synth')));
928
  }
929
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
930
 
931
 
932
  /**
@@ -1006,10 +1082,21 @@ EOS;
1006
  // set the vcl_error from Magento database
1007
  $vars['vcl_synth'] = $this->_vcl_sub_synth();
1008
  }
 
 
 
 
 
 
 
1009
 
1010
- $customIncludeFile = $this->_getCustomIncludeFilename();
1011
- if (is_readable($customIncludeFile)) {
1012
- $vars['custom_vcl_include'] = file_get_contents($customIncludeFile);
 
 
 
 
1013
  }
1014
 
1015
  return $vars;
110
  * @return string
111
  */
112
  protected function _getVclTemplateFilename($baseFilename) {
113
+ $extensionDir = Mage::getModuleDir('', 'Nexcessnet_Turpentine');
114
+ return sprintf('%s/misc/%s', $extensionDir, $baseFilename);
115
  }
116
 
117
  /**
130
  *
131
  * @return string
132
  */
133
+ protected function _getCustomIncludeFilename($position='') {
134
+ $key = 'custom_include_file';
135
+ $key .= ($position) ? '_'.$position : '';
136
  return $this->_formatTemplate(
137
+ Mage::getStoreConfig('turpentine_varnish/servers/'.$key),
138
  array('root_dir' => Mage::getBaseDir()) );
139
  }
140
 
141
+
142
+ /**
143
+ * Get the custom VCL template, if it exists
144
+ * Returns 'null' if the file doesn't exist
145
+ *
146
+ * @return string
147
+ */
148
+ protected function _getCustomTemplateFilename() {
149
+ $filePath = $this->_formatTemplate(
150
+ Mage::getStoreConfig('turpentine_varnish/servers/custom_vcl_template'),
151
+ array('root_dir' => Mage::getBaseDir())
152
+ );
153
+ if (is_file($filePath)) { return $filePath; }
154
+ else { return null; }
155
+ }
156
+
157
+
158
  /**
159
  * Format a template string, replacing {{keys}} with the appropriate values
160
  * and remove unspecified keys
192
  */
193
  protected function _getAdminFrontname() {
194
  if (Mage::getStoreConfig('admin/url/use_custom_path')) {
195
+ if(Mage::getStoreConfig('web/url/use_store')) {
196
+ return Mage::getModel('core/store')->load(0)->getCode() . "/" . Mage::getStoreConfig('admin/url/custom_path');
197
+ } else {
198
+ return Mage::getStoreConfig('admin/url/custom_path');
199
+ }
200
  } else {
201
  return (string) Mage::getConfig()->getNode(
202
  'admin/routers/adminhtml/args/frontName' );
792
  $tpl = <<<EOS
793
  if (req.http.User-Agent ~ "iP(?:hone|ad|od)|BlackBerry|Palm|Googlebot-Mobile|Mobile|mobile|mobi|Windows Mobile|Safari Mobile|Android|Opera (?:Mini|Mobi)") {
794
  set req.http.X-Normalized-User-Agent = "mobile";
 
 
 
 
 
 
 
 
 
 
795
  } else {
796
  set req.http.X-Normalized-User-Agent = "other";
797
  }
808
  protected function _vcl_sub_normalize_encoding() {
809
  $tpl = <<<EOS
810
  if (req.http.Accept-Encoding) {
811
+ if (req.http.Accept-Encoding ~ "\*|gzip") {
812
  set req.http.Accept-Encoding = "gzip";
813
  } else if (req.http.Accept-Encoding ~ "deflate") {
814
  set req.http.Accept-Encoding = "deflate";
900
  'debug_ips' => Mage::getStoreConfig('dev/restrict/allow_ips') ));
901
  }
902
 
903
+ /**
904
+ * When using Varnish as front door listen on port 80 and Nginx/Apache listen on port 443 for HTTPS, the fix will keep the url parameters when redirect from HTTP to HTTPS.
905
+ *
906
+ * @return string
907
+ */
908
+ protected function _vcl_sub_https_redirect_fix() {
909
+ $baseUrl = Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_WEB);
910
+ $baseUrl = str_replace(array('http://','https://'), '', $baseUrl);
911
+ $baseUrl = rtrim($baseUrl,'/');
912
+
913
+ switch (Mage::getStoreConfig('turpentine_varnish/servers/version')) {
914
+ case 4.0:
915
+ $tpl = <<<EOS
916
+ if ( (req.http.host ~ "^(?i)www.$baseUrl" || req.http.host ~ "^(?i)$baseUrl") && req.http.X-Forwarded-Proto !~ "(?i)https") {
917
+ return (synth(750, ""));
918
+ }
919
+ EOS;
920
+ break;
921
+ default:
922
+ $tpl = <<<EOS
923
+ if ( (req.http.host ~ "^(?i)www.$baseUrl" || req.http.host ~ "^(?i)$baseUrl") && req.http.X-Forwarded-Proto !~ "(?i)https") {
924
+ error 750 "https://" + req.http.host + req.url;
925
+ }
926
+ EOS;
927
+ }
928
+
929
+ return $tpl;
930
+ }
931
+
932
  /**
933
  * Get the allowed IPs when in maintenance mode
934
  *
969
  'vcl_synth_content' => Mage::getStoreConfig('turpentine_vcl/maintenance/custom_vcl_synth')));
970
  }
971
 
972
+ /**
973
+ * vcl_synth for fixing https
974
+ *
975
+ * @return string
976
+ */
977
+ protected function _vcl_sub_synth_https_fix()
978
+ {
979
+ $tpl = $this->_vcl_sub_synth();
980
+
981
+ if(!$tpl){
982
+ $tpl = <<<EOS
983
+ sub vcl_synth {
984
+ if (resp.status == 750) {
985
+ set resp.status = 301;
986
+ set resp.http.Location = "https://" + req.http.host + req.url;
987
+ return(deliver);
988
+ }
989
+ }
990
+ EOS;
991
+ }else{
992
+ $tpl_750 = '
993
+ sub vcl_synth {
994
+ if (resp.status == 750) {
995
+ set resp.status = 301;
996
+ set resp.http.Location = "https://" + req.http.host + req.url;
997
+ return(deliver);
998
+ }';
999
+
1000
+ $tpl = str_ireplace('sub vcl_synth {', $tpl_750, $tpl);
1001
+ }
1002
+
1003
+ return $tpl;
1004
+ }
1005
+
1006
 
1007
 
1008
  /**
1082
  // set the vcl_error from Magento database
1083
  $vars['vcl_synth'] = $this->_vcl_sub_synth();
1084
  }
1085
+
1086
+ if (Mage::getStoreConfig('turpentine_varnish/general/https_redirect_fix')) {
1087
+ $vars['https_redirect'] = $this->_vcl_sub_https_redirect_fix();
1088
+ if(Mage::getStoreConfig('turpentine_varnish/servers/version') == '4.0'){
1089
+ $vars['vcl_synth'] = $this->_vcl_sub_synth_https_fix();
1090
+ }
1091
+ }
1092
 
1093
+ foreach (array('','top') as $position) {
1094
+ $customIncludeFile = $this->_getCustomIncludeFilename($position);
1095
+ if (is_readable($customIncludeFile)) {
1096
+ $key = 'custom_vcl_include';
1097
+ $key .= ($position) ? '_'.$position : '';
1098
+ $vars[$key] = file_get_contents($customIncludeFile);
1099
+ }
1100
  }
1101
 
1102
  return $vars;
app/code/community/Nexcessnet/Turpentine/Model/Varnish/Configurator/Version3.php CHANGED
@@ -31,7 +31,14 @@ class Nexcessnet_Turpentine_Model_Varnish_Configurator_Version3
31
  * @return string
32
  */
33
  public function generate($doClean = true) {
34
- $tplFile = $this->_getVclTemplateFilename(self::VCL_TEMPLATE_FILE);
 
 
 
 
 
 
 
35
  $vcl = $this->_formatTemplate(file_get_contents($tplFile),
36
  $this->_getTemplateVars());
37
  return $doClean ? $this->_cleanVcl($vcl) : $vcl;
31
  * @return string
32
  */
33
  public function generate($doClean = true) {
34
+ // first, check if a custom template is set
35
+ $customTemplate = $this->_getCustomTemplateFilename();
36
+ if ($customTemplate) {
37
+ $tplFile = $customTemplate;
38
+ }
39
+ else {
40
+ $tplFile = $this->_getVclTemplateFilename(self::VCL_TEMPLATE_FILE);
41
+ }
42
  $vcl = $this->_formatTemplate(file_get_contents($tplFile),
43
  $this->_getTemplateVars());
44
  return $doClean ? $this->_cleanVcl($vcl) : $vcl;
app/code/community/Nexcessnet/Turpentine/Model/Varnish/Configurator/Version4.php CHANGED
@@ -31,7 +31,14 @@ class Nexcessnet_Turpentine_Model_Varnish_Configurator_Version4
31
  * @return string
32
  */
33
  public function generate($doClean = true) {
34
- $tplFile = $this->_getVclTemplateFilename(self::VCL_TEMPLATE_FILE);
 
 
 
 
 
 
 
35
  $vcl = $this->_formatTemplate(file_get_contents($tplFile),
36
  $this->_getTemplateVars());
37
  return $doClean ? $this->_cleanVcl($vcl) : $vcl;
@@ -55,6 +62,134 @@ class Nexcessnet_Turpentine_Model_Varnish_Configurator_Version4
55
  $vars = parent::_getTemplateVars();
56
  $vars['advanced_session_validation'] =
57
  $this->_getAdvancedSessionValidation();
 
 
 
 
 
 
 
 
 
 
 
58
  return $vars;
59
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
60
  }
31
  * @return string
32
  */
33
  public function generate($doClean = true) {
34
+ // first, check if a custom template is set
35
+ $customTemplate = $this->_getCustomTemplateFilename();
36
+ if ($customTemplate) {
37
+ $tplFile = $customTemplate;
38
+ }
39
+ else {
40
+ $tplFile = $this->_getVclTemplateFilename(self::VCL_TEMPLATE_FILE);
41
+ }
42
  $vcl = $this->_formatTemplate(file_get_contents($tplFile),
43
  $this->_getTemplateVars());
44
  return $doClean ? $this->_cleanVcl($vcl) : $vcl;
62
  $vars = parent::_getTemplateVars();
63
  $vars['advanced_session_validation'] =
64
  $this->_getAdvancedSessionValidation();
65
+
66
+ if (Mage::getStoreConfig('turpentine_vcl/backend/load_balancing') != 'no') {
67
+ $vars['directors'] = $this->_vcl_directors();
68
+ $vars['admin_backend_hint'] = 'vdir_admin.backend()';
69
+ $vars['set_backend_hint'] = 'set req.backend_hint = vdir.backend();';
70
+ } else {
71
+ $vars['directors'] = '';
72
+ $vars['admin_backend_hint'] = 'admin';
73
+ $vars['set_backend_hint'] = '';
74
+ }
75
+
76
  return $vars;
77
  }
78
+
79
+ protected function _vcl_directors()
80
+ {
81
+ $tpl = <<<EOS
82
+ new vdir = directors.round_robin();
83
+ new vdir_admin = directors.round_robin();
84
+ EOS;
85
+
86
+ if ('yes_admin' == Mage::getStoreConfig('turpentine_vcl/backend/load_balancing')) {
87
+ $adminBackendNodes = Mage::helper('turpentine/data')->cleanExplode(PHP_EOL,
88
+ Mage::getStoreConfig('turpentine_vcl/backend/backend_nodes_admin'));
89
+ } else {
90
+ $adminBackendNodes = Mage::helper('turpentine/data')->cleanExplode(PHP_EOL,
91
+ Mage::getStoreConfig('turpentine_vcl/backend/backend_nodes'));
92
+ }
93
+
94
+ $backendNodes = Mage::helper('turpentine/data')->cleanExplode(PHP_EOL,
95
+ Mage::getStoreConfig('turpentine_vcl/backend/backend_nodes'));
96
+
97
+ for($i = 0, $iMax = count($backendNodes); $i < $iMax; $i++) {
98
+ $tpl .= <<<EOS
99
+ vdir.add_backend(web{$i});
100
+ EOS;
101
+ }
102
+
103
+ for($i = 0, $iMax = count($adminBackendNodes); $i < $iMax; $i++) {
104
+ $tpl .= <<<EOS
105
+ vdir_admin.add_backend(webadmin{$i});
106
+ EOS;
107
+ }
108
+
109
+ $vars = array();
110
+
111
+ return $this->_formatTemplate($tpl, $vars);
112
+ }
113
+
114
+ /**
115
+ * Format a VCL director declaration, for load balancing
116
+ *
117
+ * @param string $name name of the director, also used to select config settings
118
+ * @param array $backendOptions options for each backend
119
+ * @return string
120
+ */
121
+ protected function _vcl_director($name, $backendOptions) {
122
+ $tpl = <<<EOS
123
+ {{backends}}
124
+ EOS;
125
+ if ('admin' == $name && 'yes_admin' == Mage::getStoreConfig('turpentine_vcl/backend/load_balancing')) {
126
+ $backendNodes = Mage::helper('turpentine/data')->cleanExplode(PHP_EOL,
127
+ Mage::getStoreConfig('turpentine_vcl/backend/backend_nodes_admin'));
128
+ $probeUrl = Mage::getStoreConfig('turpentine_vcl/backend/backend_probe_url_admin');
129
+ $prefix = 'admin';
130
+ } else {
131
+ $backendNodes = Mage::helper('turpentine/data')->cleanExplode(PHP_EOL,
132
+ Mage::getStoreConfig('turpentine_vcl/backend/backend_nodes'));
133
+ $probeUrl = Mage::getStoreConfig('turpentine_vcl/backend/backend_probe_url');
134
+
135
+ if('admin' == $name) {
136
+ $prefix = 'admin';
137
+ } else {
138
+ $prefix = '';
139
+ }
140
+ }
141
+
142
+ $backends = '';
143
+ $number = 0;
144
+ foreach ($backendNodes as $backendNode) {
145
+ $parts = explode(':', $backendNode, 2);
146
+ $host = (empty($parts[0])) ? '127.0.0.1' : $parts[0];
147
+ $port = (empty($parts[1])) ? '80' : $parts[1];
148
+ $backends .= $this->_vcl_director_backend($host, $port, $prefix . $number, $probeUrl, $backendOptions);
149
+
150
+ $number++;
151
+ }
152
+ $vars = array(
153
+ 'name' => $name,
154
+ 'backends' => $backends
155
+ );
156
+ return $this->_formatTemplate($tpl, $vars);
157
+ }
158
+
159
+ /**
160
+ * Format a VCL backend declaration to put inside director
161
+ *
162
+ * @param string $host backend host
163
+ * @param string $port backend port
164
+ * @param string $descriptor backend descriptor
165
+ * @param string $probeUrl URL to check if backend is up
166
+ * @param array $options extra options for backend
167
+ * @return string
168
+ */
169
+ protected function _vcl_director_backend($host, $port, $descriptor, $probeUrl = '', $options = array()) {
170
+ $tpl = <<<EOS
171
+ backend web{$descriptor} {
172
+ .host = "{{host}}";
173
+ .port = "{{port}}";
174
+ {{probe}}
175
+
176
+ EOS;
177
+ $vars = array(
178
+ 'host' => $host,
179
+ 'port' => $port,
180
+ 'probe' => ''
181
+ );
182
+ if ( ! empty($probeUrl)) {
183
+ $vars['probe'] = $this->_vcl_get_probe($probeUrl);
184
+ }
185
+ $str = $this->_formatTemplate($tpl, $vars);
186
+ foreach ($options as $key => $value) {
187
+ $str .= sprintf(' .%s = %s;', $key, $value).PHP_EOL;
188
+ }
189
+ $str .= <<<EOS
190
+ }
191
+
192
+ EOS;
193
+ return $str;
194
+ }
195
  }
app/code/community/Nexcessnet/Turpentine/controllers/EsiController.php CHANGED
@@ -183,6 +183,9 @@ class Nexcessnet_Turpentine_EsiController extends Mage_Core_Controller_Front_Act
183
  }
184
  }
185
  $layout = Mage::getSingleton('core/layout');
 
 
 
186
 
187
  // dispatch event for adding handles to layout update
188
  Mage::dispatchEvent(
@@ -253,6 +256,15 @@ class Nexcessnet_Turpentine_EsiController extends Mage_Core_Controller_Front_Act
253
  $layout->generateBlocks($node);
254
  }
255
  }
 
 
 
 
 
 
 
 
 
256
  $block = $layout->getBlock($esiData->getNameInLayout());
257
 
258
  if ( ! $this->getFlag('', self::FLAG_NO_DISPATCH_BLOCK_EVENT)) {
183
  }
184
  }
185
  $layout = Mage::getSingleton('core/layout');
186
+ Mage::getSingleton( 'core/design_package' )
187
+ ->setPackageName( $esiData->getDesignPackage() )
188
+ ->setTheme( $esiData->getDesignTheme() );
189
 
190
  // dispatch event for adding handles to layout update
191
  Mage::dispatchEvent(
256
  $layout->generateBlocks($node);
257
  }
258
  }
259
+ if ($roots = $layout->getNode()->xpath('//block[@name=\'root\']')) {
260
+ foreach (array('formkey') as $globalBlock) {
261
+ if ($blocks = $layout->getNode()->xpath(sprintf('//block[@name=\'%s\']', $globalBlock))) {
262
+ $dummy = $roots[0]->addChild('reference');
263
+ $dummy->appendChild($blocks[0]);
264
+ $layout->generateBlocks($dummy);
265
+ }
266
+ }
267
+ }
268
  $block = $layout->getBlock($esiData->getNameInLayout());
269
 
270
  if ( ! $this->getFlag('', self::FLAG_NO_DISPATCH_BLOCK_EVENT)) {
app/code/community/Nexcessnet/Turpentine/etc/config.xml CHANGED
@@ -20,7 +20,7 @@
20
  <config>
21
  <modules>
22
  <Nexcessnet_Turpentine>
23
- <version>0.7.0</version>
24
  </Nexcessnet_Turpentine>
25
  </modules>
26
  <default>
@@ -47,6 +47,8 @@
47
  <server_list>127.0.0.1:6082</server_list>
48
  <config_file>{{root_dir}}/var/default.vcl</config_file>
49
  <custom_include_file>{{root_dir}}/app/code/community/Nexcessnet/Turpentine/misc/custom_include.vcl</custom_include_file>
 
 
50
  </servers>
51
  </turpentine_varnish>
52
  <turpentine_vcl>
@@ -61,7 +63,7 @@
61
  <frontend_timeout>300</frontend_timeout>
62
  <admin_timeout>21600</admin_timeout>
63
  <crawlers>127.0.0.1</crawlers>
64
- <crawler_user_agents><![CDATA[ApacheBench/.*,.*Googlebot.*,JoeDog/.*Siege.*,magespeedtest\.com,Nexcessnet_Turpentine/.*,.*PTST.*]]></crawler_user_agents>
65
  </backend>
66
  <normalization>
67
  <encoding>1</encoding>
20
  <config>
21
  <modules>
22
  <Nexcessnet_Turpentine>
23
+ <version>0.7.1</version>
24
  </Nexcessnet_Turpentine>
25
  </modules>
26
  <default>
47
  <server_list>127.0.0.1:6082</server_list>
48
  <config_file>{{root_dir}}/var/default.vcl</config_file>
49
  <custom_include_file>{{root_dir}}/app/code/community/Nexcessnet/Turpentine/misc/custom_include.vcl</custom_include_file>
50
+ <custom_include_file_top>{{root_dir}}/app/code/community/Nexcessnet/Turpentine/misc/custom_include_top.vcl</custom_include_file_top>
51
+ <custom_vcl_template></custom_vcl_template>
52
  </servers>
53
  </turpentine_varnish>
54
  <turpentine_vcl>
63
  <frontend_timeout>300</frontend_timeout>
64
  <admin_timeout>21600</admin_timeout>
65
  <crawlers>127.0.0.1</crawlers>
66
+ <crawler_user_agents><![CDATA[ApacheBench/.*,.*Googlebot.*,JoeDog/.*,.*Siege/.*,magespeedtest\.com,Nexcessnet_Turpentine/.*,.*PTST.*]]></crawler_user_agents>
67
  </backend>
68
  <normalization>
69
  <encoding>1</encoding>
app/code/community/Nexcessnet/Turpentine/etc/system.xml CHANGED
@@ -66,12 +66,22 @@
66
  <label>Use VCL fix</label>
67
  <comment>When Enable is selected, a VCL fix will be used to prevent formKey issues. If Disable is selected, an observer will be used.</comment>
68
  <frontend_type>select</frontend_type>
69
- <sort_order>28</sort_order>
70
  <source_model>adminhtml/system_config_source_enabledisable</source_model>
71
  <show_in_default>1</show_in_default>
72
  <show_in_website>1</show_in_website>
73
  <show_in_store>1</show_in_store>
74
  </vcl_fix>
 
 
 
 
 
 
 
 
 
 
75
  <varnish_debug translate="label" module="turpentine">
76
  <label>Enable Debug Info</label>
77
  <comment>It is a major security vulnerability, to leave this enabled on production sites</comment>
@@ -82,6 +92,16 @@
82
  <show_in_website>0</show_in_website>
83
  <show_in_store>0</show_in_store>
84
  </varnish_debug>
 
 
 
 
 
 
 
 
 
 
85
  <block_debug translate="label" module="turpentine">
86
  <label>Enable Block Logging</label>
87
  <comment>Log block names for adding ESI, only enable when needed to avoid performance hit</comment>
@@ -92,6 +112,8 @@
92
  <show_in_website>0</show_in_website>
93
  <show_in_store>0</show_in_store>
94
  </block_debug>
 
 
95
  <ajax_messages translate="label" module="turpentine">
96
  <label>Enable AJAX Flash Messages</label>
97
  <comment>Enable fixing the messages block to load via AJAX, disable if you already have an extension that does this</comment>
@@ -233,15 +255,33 @@
233
  <show_in_website>0</show_in_website>
234
  <show_in_store>0</show_in_store>
235
  </config_file>
236
- <custom_include_file translate="label" module="turpentine">
237
- <label>Custom VCL File Location</label>
238
  <frontend_type>text</frontend_type>
239
- <comment>Specify where the Varnish VCL customization file should be saved</comment>
240
  <sort_order>40</sort_order>
241
  <show_in_default>1</show_in_default>
242
  <show_in_website>0</show_in_website>
243
  <show_in_store>0</show_in_store>
 
 
 
 
 
 
 
 
 
244
  </custom_include_file>
 
 
 
 
 
 
 
 
 
245
  </fields>
246
  </servers>
247
  </groups>
66
  <label>Use VCL fix</label>
67
  <comment>When Enable is selected, a VCL fix will be used to prevent formKey issues. If Disable is selected, an observer will be used.</comment>
68
  <frontend_type>select</frontend_type>
69
+ <sort_order>26</sort_order>
70
  <source_model>adminhtml/system_config_source_enabledisable</source_model>
71
  <show_in_default>1</show_in_default>
72
  <show_in_website>1</show_in_website>
73
  <show_in_store>1</show_in_store>
74
  </vcl_fix>
75
+ <https_redirect_fix translate="label comment">
76
+ <label>Fix HTTPS redirect</label>
77
+ <comment>When using Varnish as front door listen on port 80 and Nginx/Apache listen on port 443 for HTTPS, the fix will keep the url parameters when redirect from HTTP to HTTPS.</comment>
78
+ <frontend_type>select</frontend_type>
79
+ <sort_order>28</sort_order>
80
+ <source_model>adminhtml/system_config_source_enabledisable</source_model>
81
+ <show_in_default>1</show_in_default>
82
+ <show_in_website>1</show_in_website>
83
+ <show_in_store>1</show_in_store>
84
+ </https_redirect_fix>
85
  <varnish_debug translate="label" module="turpentine">
86
  <label>Enable Debug Info</label>
87
  <comment>It is a major security vulnerability, to leave this enabled on production sites</comment>
92
  <show_in_website>0</show_in_website>
93
  <show_in_store>0</show_in_store>
94
  </varnish_debug>
95
+ <varnish_log_commands translate="label" module="turpentine">
96
+ <label>Enable Varnish Command Logging</label>
97
+ <comment>Log all commands sent to Varnish by Turpentine in the log specified (custom if enabled). Caution - can cause logs to grow quickly!</comment>
98
+ <frontend_type>select</frontend_type>
99
+ <source_model>turpentine/config_select_toggle</source_model>
100
+ <sort_order>45</sort_order>
101
+ <show_in_default>1</show_in_default>
102
+ <show_in_website>0</show_in_website>
103
+ <show_in_store>0</show_in_store>
104
+ </varnish_log_commands>
105
  <block_debug translate="label" module="turpentine">
106
  <label>Enable Block Logging</label>
107
  <comment>Log block names for adding ESI, only enable when needed to avoid performance hit</comment>
112
  <show_in_website>0</show_in_website>
113
  <show_in_store>0</show_in_store>
114
  </block_debug>
115
+
116
+
117
  <ajax_messages translate="label" module="turpentine">
118
  <label>Enable AJAX Flash Messages</label>
119
  <comment>Enable fixing the messages block to load via AJAX, disable if you already have an extension that does this</comment>
255
  <show_in_website>0</show_in_website>
256
  <show_in_store>0</show_in_store>
257
  </config_file>
258
+ <custom_include_file_top translate="label" module="turpentine">
259
+ <label>Custom VCL File - Top</label>
260
  <frontend_type>text</frontend_type>
261
+ <comment>If this file exists, its content will be prepended to the VCL.</comment>
262
  <sort_order>40</sort_order>
263
  <show_in_default>1</show_in_default>
264
  <show_in_website>0</show_in_website>
265
  <show_in_store>0</show_in_store>
266
+ </custom_include_file_top>
267
+ <custom_include_file translate="label" module="turpentine">
268
+ <label>Custom VCL File - Bottom</label>
269
+ <frontend_type>text</frontend_type>
270
+ <comment>If this file exists, its content will be appended to the VCL.</comment>
271
+ <sort_order>41</sort_order>
272
+ <show_in_default>1</show_in_default>
273
+ <show_in_website>0</show_in_website>
274
+ <show_in_store>0</show_in_store>
275
  </custom_include_file>
276
+ <custom_vcl_template>
277
+ <label>Custom VCL Template</label>
278
+ <frontend_type>text</frontend_type>
279
+ <comment>If defined and present, this template will be used instead of the default VCL template appropriate for the version of Varnish.</comment>
280
+ <sort_order>50</sort_order>
281
+ <show_in_default>1</show_in_default>
282
+ <show_in_website>0</show_in_website>
283
+ <show_in_store>0</show_in_store>
284
+ </custom_vcl_template>
285
  </fields>
286
  </servers>
287
  </groups>
app/code/community/Nexcessnet/Turpentine/misc/version-2.vcl CHANGED
@@ -24,9 +24,9 @@ C{
24
  {{custom_c_code}}
25
  }C
26
 
27
- ## Custom VCL Logic
28
 
29
- {{custom_vcl_include}}
30
 
31
  ## Backends
32
 
@@ -426,3 +426,7 @@ sub vcl_deliver {
426
  }
427
  remove resp.http.X-Opt-Debug-Headers;
428
  }
 
 
 
 
24
  {{custom_c_code}}
25
  }C
26
 
27
+ ## Custom VCL Logic - Top
28
 
29
+ {{custom_vcl_include_top}}
30
 
31
  ## Backends
32
 
426
  }
427
  remove resp.http.X-Opt-Debug-Headers;
428
  }
429
+
430
+ ## Custom VCL Logic - Bottom
431
+
432
+ {{custom_vcl_include}}
app/code/community/Nexcessnet/Turpentine/misc/version-3.vcl CHANGED
@@ -28,6 +28,10 @@ C{
28
 
29
  import std;
30
 
 
 
 
 
31
  ## Backends
32
 
33
  {{default_backend}}
@@ -92,9 +96,19 @@ sub generate_session_expires {
92
  {{generate_session_end}}
93
  ## Varnish Subroutines
94
 
 
 
 
 
 
 
 
 
95
  sub vcl_recv {
96
  {{maintenance_allowed_ips}}
97
 
 
 
98
  # this always needs to be done so it's up at the top
99
  if (req.restarts == 0) {
100
  if (req.http.X-Forwarded-For) {
@@ -389,7 +403,7 @@ sub vcl_deliver {
389
  "; domain=" + regsub(req.http.Host, ":\d+$", "");
390
  } else {
391
  # it's a real user, allow sharing of cookies between stores
392
- if(req.http.Host ~ "{{normalize_cookie_regex}}") {
393
  set resp.http.Set-Cookie = resp.http.Set-Cookie +
394
  "; domain={{normalize_cookie_target}}";
395
  } else {
@@ -431,7 +445,7 @@ sub vcl_deliver {
431
  }
432
  }
433
 
434
- ## Custom VCL Logic
435
 
436
  {{custom_vcl_include}}
437
 
28
 
29
  import std;
30
 
31
+ ## Custom VCL Logic - Top
32
+
33
+ {{custom_vcl_include_top}}
34
+
35
  ## Backends
36
 
37
  {{default_backend}}
96
  {{generate_session_end}}
97
  ## Varnish Subroutines
98
 
99
+ sub vcl_error {
100
+ if (obj.status == 750) {
101
+ set obj.http.Location = obj.response;
102
+ set obj.status = 301;
103
+ return(deliver);
104
+ }
105
+ }
106
+
107
  sub vcl_recv {
108
  {{maintenance_allowed_ips}}
109
 
110
+ {{https_redirect}}
111
+
112
  # this always needs to be done so it's up at the top
113
  if (req.restarts == 0) {
114
  if (req.http.X-Forwarded-For) {
403
  "; domain=" + regsub(req.http.Host, ":\d+$", "");
404
  } else {
405
  # it's a real user, allow sharing of cookies between stores
406
+ if (req.http.Host ~ "{{normalize_cookie_regex}}" && "{{normalize_cookie_regex}}" ~ "..") {
407
  set resp.http.Set-Cookie = resp.http.Set-Cookie +
408
  "; domain={{normalize_cookie_target}}";
409
  } else {
445
  }
446
  }
447
 
448
+ ## Custom VCL Logic - Bottom
449
 
450
  {{custom_vcl_include}}
451
 
app/code/community/Nexcessnet/Turpentine/misc/version-4.vcl CHANGED
@@ -28,6 +28,11 @@ C{
28
  ## Imports
29
 
30
  import std;
 
 
 
 
 
31
 
32
  ## Backends
33
 
@@ -97,9 +102,15 @@ sub generate_session_expires {
97
  {{generate_session_end}}
98
  ## Varnish Subroutines
99
 
 
 
 
 
100
  sub vcl_recv {
101
  {{maintenance_allowed_ips}}
102
 
 
 
103
  # this always needs to be done so it's up at the top
104
  if (req.restarts == 0) {
105
  if (req.http.X-Forwarded-For) {
@@ -137,8 +148,10 @@ sub vcl_recv {
137
  set req.http.X-Turpentine-Secret-Handshake = "{{secret_handshake}}";
138
  # use the special admin backend and pipe if it's for the admin section
139
  if (req.url ~ "{{url_base_regex}}{{admin_frontname}}") {
140
- set req.backend_hint = admin;
141
  return (pipe);
 
 
142
  }
143
  if (req.http.Cookie ~ "\bcurrency=") {
144
  set req.http.X-Varnish-Currency = regsub(
@@ -234,48 +247,70 @@ sub vcl_pipe {
234
  # }
235
 
236
  sub vcl_hash {
 
 
237
  # For static files we keep the hash simple and don't add the domain.
238
  # This saves memory when a static file is used on multiple domains.
239
  if ({{simple_hash_static}} && req.http.X-Varnish-Static) {
 
240
  hash_data(req.url);
241
  if (req.http.Accept-Encoding) {
242
  # make sure we give back the right encoding
 
243
  hash_data(req.http.Accept-Encoding);
244
  }
 
245
  return (lookup);
246
  }
247
 
 
248
  if({{send_unmodified_url}} && req.http.X-Varnish-Cache-Url) {
249
  hash_data(req.http.X-Varnish-Cache-Url);
 
250
  } else {
251
  hash_data(req.url);
 
252
  }
253
 
254
  if (req.http.Host) {
255
  hash_data(req.http.Host);
 
256
  } else {
257
  hash_data(server.ip);
258
  }
 
 
259
  hash_data(req.http.Ssl-Offloaded);
 
260
  if (req.http.X-Normalized-User-Agent) {
261
  hash_data(req.http.X-Normalized-User-Agent);
 
262
  }
263
  if (req.http.Accept-Encoding) {
264
  # make sure we give back the right encoding
265
  hash_data(req.http.Accept-Encoding);
 
266
  }
267
  if (req.http.X-Varnish-Store || req.http.X-Varnish-Currency) {
268
  # make sure data is for the right store and currency based on the *store*
269
  # and *currency* cookies
270
  hash_data("s=" + req.http.X-Varnish-Store + "&c=" + req.http.X-Varnish-Currency);
 
271
  }
272
 
273
  if (req.http.X-Varnish-Esi-Access == "private" &&
274
  req.http.Cookie ~ "frontend=") {
 
275
  hash_data(regsub(req.http.Cookie, "^.*?frontend=([^;]*);*.*$", "\1"));
276
  {{advanced_session_validation}}
277
 
278
  }
 
 
 
 
 
 
279
  return (lookup);
280
  }
281
 
@@ -432,6 +467,6 @@ sub vcl_deliver {
432
  }
433
  }
434
 
435
- ## Custom VCL Logic
436
 
437
  {{custom_vcl_include}}
28
  ## Imports
29
 
30
  import std;
31
+ import directors;
32
+
33
+ ## Custom VCL Logic - Top
34
+
35
+ {{custom_vcl_include_top}}
36
 
37
  ## Backends
38
 
102
  {{generate_session_end}}
103
  ## Varnish Subroutines
104
 
105
+ sub vcl_init {
106
+ {{directors}}
107
+ }
108
+
109
  sub vcl_recv {
110
  {{maintenance_allowed_ips}}
111
 
112
+ {{https_redirect}}
113
+
114
  # this always needs to be done so it's up at the top
115
  if (req.restarts == 0) {
116
  if (req.http.X-Forwarded-For) {
148
  set req.http.X-Turpentine-Secret-Handshake = "{{secret_handshake}}";
149
  # use the special admin backend and pipe if it's for the admin section
150
  if (req.url ~ "{{url_base_regex}}{{admin_frontname}}") {
151
+ set req.backend_hint = {{admin_backend_hint}};
152
  return (pipe);
153
+ } else {
154
+ {{set_backend_hint}}
155
  }
156
  if (req.http.Cookie ~ "\bcurrency=") {
157
  set req.http.X-Varnish-Currency = regsub(
247
  # }
248
 
249
  sub vcl_hash {
250
+ std.log("vcl_hash start");
251
+
252
  # For static files we keep the hash simple and don't add the domain.
253
  # This saves memory when a static file is used on multiple domains.
254
  if ({{simple_hash_static}} && req.http.X-Varnish-Static) {
255
+ std.log("hash_data static file - req.url: " + req.url);
256
  hash_data(req.url);
257
  if (req.http.Accept-Encoding) {
258
  # make sure we give back the right encoding
259
+ std.log("hash_data static file - Accept-Encoding: " + req.http.Accept-Encoding);
260
  hash_data(req.http.Accept-Encoding);
261
  }
262
+ std.log("vcl_hash end return lookup");
263
  return (lookup);
264
  }
265
 
266
+
267
  if({{send_unmodified_url}} && req.http.X-Varnish-Cache-Url) {
268
  hash_data(req.http.X-Varnish-Cache-Url);
269
+ std.log("hash_data - X-Varnish-Cache-Url: " + req.http.X-Varnish-Cache-Url);
270
  } else {
271
  hash_data(req.url);
272
+ std.log("hash_data - req.url: " + req.url );
273
  }
274
 
275
  if (req.http.Host) {
276
  hash_data(req.http.Host);
277
+ std.log("hash_data - req.http.Host: " + req.http.Host);
278
  } else {
279
  hash_data(server.ip);
280
  }
281
+
282
+ std.log("hash_data - req.http.Ssl-Offloaded: " + req.http.Ssl-Offloaded);
283
  hash_data(req.http.Ssl-Offloaded);
284
+
285
  if (req.http.X-Normalized-User-Agent) {
286
  hash_data(req.http.X-Normalized-User-Agent);
287
+ std.log("hash_data - req.http.X-Normalized-User-Agent: " + req.http.X-Normalized-User-Agent);
288
  }
289
  if (req.http.Accept-Encoding) {
290
  # make sure we give back the right encoding
291
  hash_data(req.http.Accept-Encoding);
292
+ std.log("hash_data - req.http.Accept-Encoding: " + req.http.Accept-Encoding);
293
  }
294
  if (req.http.X-Varnish-Store || req.http.X-Varnish-Currency) {
295
  # make sure data is for the right store and currency based on the *store*
296
  # and *currency* cookies
297
  hash_data("s=" + req.http.X-Varnish-Store + "&c=" + req.http.X-Varnish-Currency);
298
+ std.log("hash_data - Store and Currency: " + "s=" + req.http.X-Varnish-Store + "&c=" + req.http.X-Varnish-Currency);
299
  }
300
 
301
  if (req.http.X-Varnish-Esi-Access == "private" &&
302
  req.http.Cookie ~ "frontend=") {
303
+ std.log("hash_data - frontned cookie: " + regsub(req.http.Cookie, "^.*?frontend=([^;]*);*.*$", "\1"));
304
  hash_data(regsub(req.http.Cookie, "^.*?frontend=([^;]*);*.*$", "\1"));
305
  {{advanced_session_validation}}
306
 
307
  }
308
+
309
+ if (req.http.X-Varnish-Esi-Access == "customer_group" &&
310
+ req.http.Cookie ~ "customer_group=") {
311
+ hash_data(regsub(req.http.Cookie, "^.*?customer_group=([^;]*);*.*$", "\1"));
312
+ }
313
+ std.log("vcl_hash end return lookup");
314
  return (lookup);
315
  }
316
 
467
  }
468
  }
469
 
470
+ ## Custom VCL Logic - Bottom
471
 
472
  {{custom_vcl_include}}
app/design/frontend/base/default/layout/turpentine_esi.xml CHANGED
@@ -44,7 +44,8 @@
44
  <wishlist_item_save_after/>
45
  <wishlist_item_delete_after/>
46
  <sales_quote_save_after/>
47
- <controller_action_layout_render_before_catalogsearch_result_index />
 
48
  </flush_events>
49
  </params>
50
  </action>
@@ -269,6 +270,10 @@
269
  <turpentine_cache_flag value="0"/>
270
  </checkout_onepage_progress_payment>
271
 
 
 
 
 
272
  <checkout_onepage_paymentmethod>
273
  <turpentine_cache_flag value="0"/>
274
  </checkout_onepage_paymentmethod>
44
  <wishlist_item_save_after/>
45
  <wishlist_item_delete_after/>
46
  <sales_quote_save_after/>
47
+ <controller_action_layout_render_before_catalogsearch_result_index />
48
+ <persistent_session_expired/>
49
  </flush_events>
50
  </params>
51
  </action>
270
  <turpentine_cache_flag value="0"/>
271
  </checkout_onepage_progress_payment>
272
 
273
+ <checkout_onepage_progress_review>
274
+ <turpentine_cache_flag value="0"/>
275
+ </checkout_onepage_progress_review>
276
+
277
  <checkout_onepage_paymentmethod>
278
  <turpentine_cache_flag value="0"/>
279
  </checkout_onepage_paymentmethod>
app/design/frontend/base/default/template/turpentine/ajax.phtml CHANGED
@@ -50,7 +50,9 @@ echo <<<HTML
50
  <script type="text/javascript">
51
  (function() {
52
  var blockTag = {$this->helper('core')->jsonEncode($blockTag)}, esiUrl = {$this->helper('core')->jsonEncode($this->getEsiUrl())};
53
- if (typeof Ajax === 'object' && typeof Ajax.Updater === 'function' && typeof Event === 'function' ) {
 
 
54
  Event.observe( window, "load", function() { setTimeout( function() {
55
  new Ajax.Updater(
56
  blockTag,
50
  <script type="text/javascript">
51
  (function() {
52
  var blockTag = {$this->helper('core')->jsonEncode($blockTag)}, esiUrl = {$this->helper('core')->jsonEncode($this->getEsiUrl())};
53
+ if (typeof Ajax === 'object' && typeof Ajax.Updater === 'function'
54
+ && (typeof Event === 'function' || (typeof Event === 'object' && typeof Event.observe === 'function'))
55
+ ) {
56
  Event.observe( window, "load", function() { setTimeout( function() {
57
  new Ajax.Updater(
58
  blockTag,
package.xml CHANGED
@@ -1,2 +1,2 @@
1
  <?xml version='1.0' encoding='utf-8'?>
2
- <package><name>Nexcessnet_Turpentine</name><license uri="http://opensource.org/licenses/GPL-2.0">GPLv2</license><notes>Supports Magento v1.6 and later</notes><time>10:53:41</time><__packager>build_package.py v0.0.3</__packager><summary>Improves Magento support for Varnish caching and generates 2.1 and 3.0 compatible VCLs.</summary><stability>stable</stability><__commit_hash>8549a0f207c63e62c61570f81925bd574c63f2c5</__commit_hash><version>0.7.0</version><extends /><contents><target name="magedesign"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="layout"><file hash="a0bd4a5632b369b058c0ec5262e0cc49" name="turpentine.xml" /></dir><dir name="template"><dir name="turpentine"><file hash="b564606032d111537d02c8da63470c39" name="varnish_management.phtml" /></dir></dir></dir></dir></dir><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><file hash="d121558e4cd5775b0845ebeec5909b97" name="turpentine_esi.xml" /></dir><dir name="template"><dir name="turpentine"><file hash="b268c48251ccfccf5c775d3e85513584" name="esi.phtml" /><file hash="50798888953fd1550e4347c39e395d0a" name="notices.phtml" /><file hash="02f341fdfd5194752e88cae9933cfcdb" name="ajax.phtml" /></dir></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file hash="58848d4d90973bfd63b466ea181352a5" name="Nexcessnet_Turpentine.xml" /></dir></target><target name="magecommunity"><dir name="Nexcessnet"><dir name="Turpentine"><dir name="controllers"><file hash="9963ddff7c13d5d087aa3dbdffcd1532" name="EsiController.php" /><dir name="Varnish"><file hash="36ed74dba513b500b7a25175d43a4d71" name="ManagementController.php" /></dir><dir name="Adminhtml"><file hash="9ed581279364b21ead6ad07ff951d90e" name="CacheController.php" /></dir></dir><dir name="Helper"><file hash="a1a0b6aa02aff34f995d3df15c993978" name="Cron.php" /><file hash="c6068752ae71f7fbf58208263d94880d" name="Ban.php" /><file hash="66399790e7dda35e709b346889a21b1b" name="Debug.php" /><file hash="7f156b5d3f3aafd56f8ec67f4d70d436" name="Esi.php" /><file hash="99ec12c46fd42fbfabdb191c4af7fbe6" name="Varnish.php" /><file hash="c1a55b8d3bdb780fcd3315d214e94b01" name="Data.php" /></dir><dir name="misc"><file hash="9c07f16b0d2b692578cc6dab15a11804" name="version-2.vcl" /><file hash="ba5d5c7263cd90eea3785953e3549041" name="uuid.c" /><file hash="f8368123a257cb25ee7db63ec54cce12" name="version-3.vcl" /><file hash="65657268cb1983c0dcc3846570bb8594" name="version-4.vcl" /></dir><dir name="etc"><file hash="f2640ecefaf2af56b62ba48fd9b4a391" name="config.xml" /><file hash="73d441e94f0530357f2c96e27a1442d1" name="system.xml" /><file hash="3b608fbcca3d307833d10604dff23966" name="cache.xml" /></dir><dir name="Block"><file hash="390cf75d04b1b098cad562229b649c2d" name="Notices.php" /><file hash="5584baf2ebba7e0fe7e9491a46a6e4cf" name="Management.php" /><dir name="Adminhtml"><dir name="Cache"><file hash="8265061356f8096fc82c88334b4effc9" name="Grid.php" /></dir></dir><dir name="Poll"><file hash="4b64be7088235d85610892b1dfe6f768" name="ActivePoll.php" /></dir><dir name="Product"><file hash="c86f7e0571583011932b8bad37aa5acd" name="Viewed.php" /><file hash="e907d4de82aba5be25272127674a10e3" name="Compared.php" /></dir><dir name="Catalog"><dir name="Product"><dir name="List"><file hash="ce9fca4c273987759f284fe31c1597f5" name="Toolbar.php" /></dir></dir></dir><dir name="Core"><file hash="2b4c814c8aa426fa586459716d7c2659" name="Messages.php" /></dir></dir><dir name="Model"><file hash="ffd2af1c58782a2086422b2077f00282" name="Session.php" /><dir name="Varnish"><file hash="b264dc1982cef539b8dc2c86aa34c5c3" name="Admin.php" /><dir name="Configurator"><file hash="870922083925f5120e4ec52f279a8870" name="Version4.php" /><file hash="d4d66168e43a62ceab30226b44b9e98b" name="Version2.php" /><file hash="eea0cbf3c779a9d9ce8b38f33aa7d333" name="Abstract.php" /><file hash="c0c0d52175e72b95c059345a31b5de31" name="Version3.php" /></dir><dir name="Admin"><file hash="304cdb4970dec60460433163d5532533" name="Socket.php" /></dir></dir><dir name="PageCache"><dir name="Container"><file hash="6e3b54ae5968af644952b00cd96a3f32" name="Notices.php" /></dir></dir><dir name="Config"><dir name="Select"><file hash="403dcea1f19b377f30af5f89297d9a69" name="Version.php" /><file hash="f411ae6da3c2154e78e0f7e845212166" name="StripWhitespace.php" /><file hash="9348c5e58037fd97d89b84ccab4ef2d0" name="Toggle.php" /><file hash="2a4648995fc87472b2ac33b35a7d69e5" name="LoadBalancing.php" /></dir></dir><dir name="Dummy"><file hash="07e4db6d82110e523d1400dcfec60830" name="Request.php" /></dir><dir name="Shim"><dir name="Mage"><dir name="Core"><file hash="5912fa8ef25346f2a21316d8ea5de867" name="Config.php" /><file hash="ee6924c626916a8edd49b6037809204a" name="Layout.php" /><file hash="85e9e378b8fd0ab504c751a69d0b28a6" name="App.php" /></dir></dir></dir><dir name="Observer"><file hash="acdb0304a8b89ae5f072d523be63d9c0" name="Cron.php" /><file hash="bdf76e0eb3b31341ae0d80beba83d85b" name="Ban.php" /><file hash="4f67e6d7c35891451391b13a0eec9847" name="Debug.php" /><file hash="d92dc22addfd90ed5b929e8cb17b8002" name="Esi.php" /><file hash="16e4975274e8c3454bf2226d5a0558e6" name="Varnish.php" /></dir><dir name="Core"><file hash="8f512da6e6da419acc07710b079e3ca9" name="Session.php" /></dir></dir></dir></dir></target></contents><dependencies><required><php><min>5.2.13</min><max>7.1.0</max></php></required></dependencies><authors><author><name>Chris Wells</name><user>nexcess_net</user><email>clwells@nexcess.net</email></author><author><name>Alex Headley</name><user>aheadley_nex</user><email>aheadley@nexcess.net</email></author></authors><date>2016-05-31</date><compatibile /><channel>community</channel><description>Turpentine is a Magento extension to improve Magento's compatibility with Varnish, a very-fast caching reverse-proxy. By default, Varnish doesn't cache requests with cookies and Magento sends the frontend cookie with every request causing a (near) zero hit-rate for Varnish's cache. Turpentine provides Varnish configuration files (VCLs) to work with Magento and modifies Magento's behaviour to significantly improve the cache hit rate.</description></package>
1
  <?xml version='1.0' encoding='utf-8'?>
2
+ <package><name>Nexcessnet_Turpentine</name><license uri="http://opensource.org/licenses/GPL-2.0">GPLv2</license><notes>Supports Magento v1.6 and later</notes><time>10:18:44</time><__packager>build_package.py v0.0.3</__packager><summary>Improves Magento support for Varnish caching and generates 2.1 and 3.0 compatible VCLs.</summary><stability>stable</stability><__commit_hash>4929b8a5cbd4e62f254a42dae881eda28b0a7dec</__commit_hash><version>0.7.1</version><extends /><contents><target name="magedesign"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="layout"><file hash="a0bd4a5632b369b058c0ec5262e0cc49" name="turpentine.xml" /></dir><dir name="template"><dir name="turpentine"><file hash="b564606032d111537d02c8da63470c39" name="varnish_management.phtml" /></dir></dir></dir></dir></dir><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><file hash="c77b5ace7bf2300de8cab000c5ccb127" name="turpentine_esi.xml" /></dir><dir name="template"><dir name="turpentine"><file hash="4369ad60461aaf69a17a3357c8fe16c6" name="ajax.phtml" /><file hash="b268c48251ccfccf5c775d3e85513584" name="esi.phtml" /><file hash="50798888953fd1550e4347c39e395d0a" name="notices.phtml" /></dir></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file hash="58848d4d90973bfd63b466ea181352a5" name="Nexcessnet_Turpentine.xml" /></dir></target><target name="magecommunity"><dir name="Nexcessnet"><dir name="Turpentine"><dir name="Block"><file hash="65b7bc93cb512a208e0f48615996a7e2" name="Management.php" /><file hash="390cf75d04b1b098cad562229b649c2d" name="Notices.php" /><dir name="Catalog"><dir name="Product"><dir name="List"><file hash="ce9fca4c273987759f284fe31c1597f5" name="Toolbar.php" /></dir></dir></dir><dir name="Adminhtml"><dir name="Cache"><file hash="8265061356f8096fc82c88334b4effc9" name="Grid.php" /></dir></dir><dir name="Core"><file hash="2b4c814c8aa426fa586459716d7c2659" name="Messages.php" /></dir><dir name="Poll"><file hash="77a2469841c71b1c45d90947e2855ba7" name="ActivePoll.php" /></dir><dir name="Product"><file hash="c86f7e0571583011932b8bad37aa5acd" name="Viewed.php" /><file hash="e907d4de82aba5be25272127674a10e3" name="Compared.php" /></dir></dir><dir name="etc"><file hash="51c355170c834bd198d8435fb44e4900" name="config.xml" /><file hash="80c694720f82ed6c756621b9d5bdce7d" name="system.xml" /><file hash="3b608fbcca3d307833d10604dff23966" name="cache.xml" /></dir><dir name="controllers"><file hash="441c60671b8cdd249dadc05fcdf0373b" name="EsiController.php" /><dir name="Adminhtml"><file hash="9ed581279364b21ead6ad07ff951d90e" name="CacheController.php" /></dir><dir name="Varnish"><file hash="36ed74dba513b500b7a25175d43a4d71" name="ManagementController.php" /></dir></dir><dir name="Helper"><file hash="99ec12c46fd42fbfabdb191c4af7fbe6" name="Varnish.php" /><file hash="66399790e7dda35e709b346889a21b1b" name="Debug.php" /><file hash="a1a0b6aa02aff34f995d3df15c993978" name="Cron.php" /><file hash="c6068752ae71f7fbf58208263d94880d" name="Ban.php" /><file hash="193775458c5fa27cde724aae8b54f489" name="Data.php" /><file hash="7f156b5d3f3aafd56f8ec67f4d70d436" name="Esi.php" /></dir><dir name="misc"><file hash="57b57d1363b8024390c6f0a92e237e91" name="version-3.vcl" /><file hash="ba5d5c7263cd90eea3785953e3549041" name="uuid.c" /><file hash="e032877a7ca037dd8fae4bbb4b49999c" name="version-4.vcl" /><file hash="8bdb8b25b777e19745ec42b251083a8d" name="version-2.vcl" /></dir><dir name="Model"><file hash="ffd2af1c58782a2086422b2077f00282" name="Session.php" /><dir name="Config"><dir name="Select"><file hash="403dcea1f19b377f30af5f89297d9a69" name="Version.php" /><file hash="9348c5e58037fd97d89b84ccab4ef2d0" name="Toggle.php" /><file hash="2a4648995fc87472b2ac33b35a7d69e5" name="LoadBalancing.php" /><file hash="f411ae6da3c2154e78e0f7e845212166" name="StripWhitespace.php" /></dir></dir><dir name="Observer"><file hash="16e4975274e8c3454bf2226d5a0558e6" name="Varnish.php" /><file hash="4f67e6d7c35891451391b13a0eec9847" name="Debug.php" /><file hash="acdb0304a8b89ae5f072d523be63d9c0" name="Cron.php" /><file hash="bdf76e0eb3b31341ae0d80beba83d85b" name="Ban.php" /><file hash="cfa236bb8cceb0accc0f8c3bc74efbf3" name="Esi.php" /></dir><dir name="Core"><file hash="8f512da6e6da419acc07710b079e3ca9" name="Session.php" /></dir><dir name="Shim"><dir name="Mage"><dir name="Core"><file hash="ee6924c626916a8edd49b6037809204a" name="Layout.php" /><file hash="85e9e378b8fd0ab504c751a69d0b28a6" name="App.php" /><file hash="5912fa8ef25346f2a21316d8ea5de867" name="Config.php" /></dir></dir></dir><dir name="PageCache"><dir name="Container"><file hash="6e3b54ae5968af644952b00cd96a3f32" name="Notices.php" /></dir></dir><dir name="Varnish"><file hash="b264dc1982cef539b8dc2c86aa34c5c3" name="Admin.php" /><dir name="Configurator"><file hash="a0f098ef4e538fb9ee671e2e49378796" name="Abstract.php" /><file hash="8ee23e5993ecd7a0d880221fbda74ecf" name="Version4.php" /><file hash="fa8b92a14b7b608dfe0af030b6a78a77" name="Version3.php" /><file hash="d4d66168e43a62ceab30226b44b9e98b" name="Version2.php" /></dir><dir name="Admin"><file hash="add6be96edabcb62a9003dad8d18d808" name="Socket.php" /></dir></dir><dir name="Dummy"><file hash="07e4db6d82110e523d1400dcfec60830" name="Request.php" /></dir></dir></dir></dir></target></contents><dependencies><required><php><min>5.2.13</min><max>7.1.0</max></php></required></dependencies><authors><author><name>Chris Wells</name><user>nexcess_net</user><email>clwells@nexcess.net</email></author><author><name>Alex Headley</name><user>aheadley_nex</user><email>aheadley@nexcess.net</email></author></authors><date>2017-01-03</date><compatibile /><channel>community</channel><description>Turpentine is a Magento extension to improve Magento's compatibility with Varnish, a very-fast caching reverse-proxy. By default, Varnish doesn't cache requests with cookies and Magento sends the frontend cookie with every request causing a (near) zero hit-rate for Varnish's cache. Turpentine provides Varnish configuration files (VCLs) to work with Magento and modifies Magento's behaviour to significantly improve the cache hit rate.</description></package>