Nexcessnet_Turpentine - Version 0.6.3

Version Notes

Supports Magento v1.6 and later

Download this release

Release Info

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


Code changes from version 0.6.1 to 0.6.3

Files changed (25) hide show
  1. app/code/community/Nexcessnet/Turpentine/Block/Adminhtml/Cache/Grid.php +44 -0
  2. app/code/community/Nexcessnet/Turpentine/Block/Core/Messages.php +4 -0
  3. app/{design/frontend/base/default/template/turpentine/esi.phtml → code/community/Nexcessnet/Turpentine/Block/Poll/ActivePoll.php} +8 -15
  4. app/code/community/Nexcessnet/Turpentine/Helper/Data.php +10 -0
  5. app/code/community/Nexcessnet/Turpentine/Helper/Debug.php +137 -33
  6. app/code/community/Nexcessnet/Turpentine/Helper/Esi.php +1 -1
  7. app/code/community/Nexcessnet/Turpentine/Model/Core/Session.php +53 -0
  8. app/code/community/Nexcessnet/Turpentine/Model/Dummy/Request.php +4 -1
  9. app/code/community/Nexcessnet/Turpentine/Model/Observer/Ban.php +28 -0
  10. app/code/community/Nexcessnet/Turpentine/Model/Observer/Esi.php +64 -6
  11. app/code/community/Nexcessnet/Turpentine/Model/Varnish/Admin.php +2 -5
  12. app/code/community/Nexcessnet/Turpentine/Model/Varnish/Configurator/Abstract.php +109 -5
  13. app/code/community/Nexcessnet/Turpentine/Model/Varnish/Configurator/Abstract.php~ +769 -0
  14. app/code/community/Nexcessnet/Turpentine/controllers/Adminhtml/CacheController.php +43 -0
  15. app/code/community/Nexcessnet/Turpentine/controllers/EsiController.php +1 -1
  16. app/code/community/Nexcessnet/Turpentine/etc/config.xml +85 -1
  17. app/code/community/Nexcessnet/Turpentine/etc/system.xml +69 -1
  18. app/code/community/Nexcessnet/Turpentine/misc/version-2.vcl +19 -8
  19. app/code/community/Nexcessnet/Turpentine/misc/version-3.vcl +46 -16
  20. app/code/local/Mage/Core/Model/Session.php +0 -69
  21. app/design/adminhtml/default/default/template/turpentine/varnish_management.phtml +0 -119
  22. app/design/frontend/base/default/layout/turpentine_esi.xml +34 -0
  23. app/design/frontend/base/default/template/turpentine/ajax.phtml +0 -81
  24. app/design/frontend/base/default/template/turpentine/notices.phtml +0 -36
  25. package.xml +1 -1
app/code/community/Nexcessnet/Turpentine/Block/Adminhtml/Cache/Grid.php ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * User: damian.pastorini@usestrategery.com
5
+ * Date: 08/01/14
6
+ */
7
+
8
+ class Nexcessnet_Turpentine_Block_Adminhtml_Cache_Grid extends Mage_Adminhtml_Block_Cache_Grid
9
+ {
10
+
11
+ /**
12
+ * Prepare grid collection
13
+ */
14
+ protected function _prepareCollection()
15
+ {
16
+ parent::_prepareCollection();
17
+ $collection = $this->getCollection();
18
+ $turpentineEnabled = false;
19
+ $fullPageEnabled = false;
20
+ foreach ($collection as $key=>$item)
21
+ {
22
+ if($item->getStatus()==1 && ($item->getId()=='turpentine_pages' || $item->getId()=='turpentine_esi_blocks'))
23
+ {
24
+ $turpentineEnabled = true;
25
+ }
26
+ if($item->getStatus()==1 && $item->getId()=='full_page')
27
+ {
28
+ $fullPageEnabled = true;
29
+ }
30
+ }
31
+ if($turpentineEnabled)
32
+ {
33
+ $collection->removeItemByKey('full_page');
34
+ }
35
+ if($fullPageEnabled)
36
+ {
37
+ $collection->removeItemByKey('turpentine_pages');
38
+ $collection->removeItemByKey('turpentine_esi_blocks');
39
+ }
40
+ $this->setCollection($collection);
41
+ return $this;
42
+ }
43
+
44
+ }
app/code/community/Nexcessnet/Turpentine/Block/Core/Messages.php CHANGED
@@ -204,6 +204,10 @@ class Nexcessnet_Turpentine_Block_Core_Messages extends Mage_Core_Block_Messages
204
  $html = $this->_real_toHtml();
205
  }
206
  $this->_directCall = false;
 
 
 
 
207
  return $html;
208
  }
209
 
204
  $html = $this->_real_toHtml();
205
  }
206
  $this->_directCall = false;
207
+
208
+ if (count($this->getMessages()) == 0) {
209
+ return '';
210
+ }
211
  return $html;
212
  }
213
 
app/{design/frontend/base/default/template/turpentine/esi.phtml → code/community/Nexcessnet/Turpentine/Block/Poll/ActivePoll.php} RENAMED
@@ -19,20 +19,13 @@
19
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20
  */
21
 
22
- $debugEnabled = (bool)Mage::helper( 'turpentine/esi' )->getEsiDebugEnabled();
23
 
24
- if( $debugEnabled ) {
25
- echo sprintf( '<!-- ESI START [%s] -->', $this->getNameInLayout() ) . PHP_EOL;
26
- echo sprintf( '<!-- ESI URL: %s -->', $this->getEsiUrl() ) . PHP_EOL;
27
- } else {
28
- echo '<!-- ESI START DUMMY COMMENT [] -->' . PHP_EOL;
29
- echo '<!-- ESI URL DUMMY COMMENT -->' . PHP_EOL;
30
- }
31
- echo sprintf( '<esi:remove>ESI processing not enabled</esi:remove>
32
- <!--esi <esi:include src="%s" /> -->',
33
- $this->getEsiUrl() ) . PHP_EOL;
34
- if( $debugEnabled ) {
35
- echo sprintf( '<!-- ESI END [%s] -->', $this->getNameInLayout() ) . PHP_EOL;
36
- } else {
37
- echo '<!-- ESI END DUMMY COMMENT [] -->' . PHP_EOL;
38
  }
19
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20
  */
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
  }
app/code/community/Nexcessnet/Turpentine/Helper/Data.php CHANGED
@@ -270,6 +270,16 @@ class Nexcessnet_Turpentine_Helper_Data extends Mage_Core_Helper_Abstract {
270
  'turpentine_varnish/general/auto_apply_on_save' );
271
  }
272
 
 
 
 
 
 
 
 
 
 
 
273
  /**
274
  * Get config value specifying when to strip VCL whitespaces
275
  *
270
  'turpentine_varnish/general/auto_apply_on_save' );
271
  }
272
 
273
+ /**
274
+ * Get config value specifying when to strip VCL whitespaces
275
+ *
276
+ * @return string
277
+ */
278
+ public function getVclFix() {
279
+ return Mage::getStoreConfig(
280
+ 'turpentine_varnish/general/vcl_fix' );
281
+ }
282
+
283
  /**
284
  * Get config value specifying when to strip VCL whitespaces
285
  *
app/code/community/Nexcessnet/Turpentine/Helper/Debug.php CHANGED
@@ -21,41 +21,116 @@
21
 
22
  class Nexcessnet_Turpentine_Helper_Debug extends Mage_Core_Helper_Abstract {
23
  /**
24
- * Handle log* functions
25
  *
26
- * @param string $name
27
- * @param array $args
28
- * @return mixed
29
  */
30
- public function __call( $name, $args ) {
31
- if( substr( $name, 0, 3 ) === 'log' ) {
32
- try {
33
- $message = vsprintf( @$args[0], @array_slice( $args, 1 ) );
34
- } catch( Exception $e ) {
35
- return parent::__call( $name, $args );
36
- }
37
- switch( substr( $name, 3 ) ) {
38
- case 'Error':
39
- return $this->_log( Zend_Log::ERR, $message );
40
- case 'Warn':
41
- return $this->_log( Zend_Log::WARN, $message );
42
- case 'Notice':
43
- return $this->_log( Zend_Log::NOTICE, $message );
44
- case 'Info':
45
- return $this->_log( Zend_Log::INFO, $message );
46
- case 'Debug':
47
- if( Mage::helper( 'turpentine/varnish' )
48
- ->getVarnishDebugEnabled() ) {
49
- return $this->_log( Zend_Log::DEBUG, $message );
50
- } else {
51
- return;
52
- }
53
- default:
54
- break;
55
- }
56
  }
57
- // return parent::__call( $name, $args );
58
- return null;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
59
  }
60
 
61
  /**
@@ -135,10 +210,39 @@ class Nexcessnet_Turpentine_Helper_Debug extends Mage_Core_Helper_Abstract {
135
  */
136
  protected function _log( $level, $message ) {
137
  $message = 'TURPENTINE: ' . $message;
138
- Mage::log( $message, $level );
139
  return $message;
140
  }
141
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
142
  /**
143
  * Format a list of function arguments for the backtrace
144
  *
21
 
22
  class Nexcessnet_Turpentine_Helper_Debug extends Mage_Core_Helper_Abstract {
23
  /**
24
+ * Logs errors
25
  *
26
+ * @param $message
27
+ * @return string
 
28
  */
29
+ public function logError( $message )
30
+ {
31
+ if ( func_num_args() > 1 ) {
32
+ $message = $this->_prepareLogMessage( func_get_args() );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
33
  }
34
+
35
+ return $this->_log( Zend_Log::ERR, $message );
36
+ }
37
+
38
+ /**
39
+ * Logs warnings
40
+ *
41
+ * @param $message
42
+ * @return string
43
+ */
44
+ public function logWarn( $message )
45
+ {
46
+ if ( func_num_args() > 1 ) {
47
+ $message = $this->_prepareLogMessage( func_get_args() );
48
+ }
49
+
50
+ return $this->_log( Zend_Log::WARN, $message );
51
+ }
52
+
53
+ /**
54
+ * Logs notices
55
+ *
56
+ * @param $message
57
+ * @return string
58
+ */
59
+ public function logNotice( $message )
60
+ {
61
+ if ( func_num_args() > 1 ) {
62
+ $message = $this->_prepareLogMessage( func_get_args() );
63
+ }
64
+
65
+ return $this->_log( Zend_Log::NOTICE, $message );
66
+ }
67
+
68
+ /**
69
+ * Logs info.
70
+ *
71
+ * @param $message
72
+ * @return string
73
+ */
74
+ public function logInfo( $message )
75
+ {
76
+ if ( func_num_args() > 1 ) {
77
+ $message = $this->_prepareLogMessage( func_get_args() );
78
+ }
79
+
80
+ return $this->_log( Zend_Log::INFO, $message );
81
+ }
82
+
83
+ /**
84
+ * Logs debug.
85
+ *
86
+ * @param $message
87
+ * @return string
88
+ */
89
+ public function logDebug( $message )
90
+ {
91
+ if( ! Mage::helper( 'turpentine/varnish' )->getVarnishDebugEnabled() ) {
92
+ return;
93
+ }
94
+
95
+ if ( func_num_args() > 1 ) {
96
+ $message = $this->_prepareLogMessage( func_get_args() );
97
+ }
98
+
99
+ return $this->_log( Zend_Log::DEBUG, $message );
100
+ }
101
+
102
+ /**
103
+ * Prepares advanced log message.
104
+ *
105
+ * @param array $args
106
+ * @return string
107
+ */
108
+ protected function _prepareLogMessage( array $args )
109
+ {
110
+ $pattern = $args[0];
111
+ $substitutes = array_slice( $args, 1 );
112
+
113
+ if ( ! $this->_validatePattern( $pattern, $substitutes ) ) {
114
+ return $pattern;
115
+ }
116
+
117
+ return vsprintf( $pattern, $substitutes );
118
+ }
119
+
120
+ /**
121
+ * Validates string and attributes for substitution as per sprintf function.
122
+ *
123
+ * NOTE: this could be implemented as shown at
124
+ * http://stackoverflow.com/questions/2053664/how-to-check-that-vsprintf-has-the-correct-number-of-arguments-before-running
125
+ * although IMHO it's too time consuming to validate the patterns.
126
+ *
127
+ * @param string $pattern
128
+ * @param array $arguments
129
+ * @return bool
130
+ */
131
+ protected function _validatePattern( $pattern, $arguments )
132
+ {
133
+ return true;
134
  }
135
 
136
  /**
210
  */
211
  protected function _log( $level, $message ) {
212
  $message = 'TURPENTINE: ' . $message;
213
+ Mage::log( $message, $level, $this->_getLogFileName() );
214
  return $message;
215
  }
216
 
217
+ /**
218
+ * Get the name of the log file to use
219
+ * @return string
220
+ */
221
+ protected function _getLogFileName() {
222
+ if ( $this->useCustomLogFile() ) {
223
+ return $this->getCustomLogFileName();
224
+ }
225
+ return '';
226
+ }
227
+
228
+ /**
229
+ * Check if custom log file should be used
230
+ * @return bool
231
+ */
232
+ public function useCustomLogFile() {
233
+ return Mage::getStoreConfigFlag(
234
+ 'turpentine_varnish/logging/use_custom_log_file' );
235
+ }
236
+
237
+ /**
238
+ * Get custom log file name
239
+ * @return string
240
+ */
241
+ public function getCustomLogFileName() {
242
+ return (string)Mage::getStoreConfig(
243
+ 'turpentine_varnish/logging/custom_log_file_name' );
244
+ }
245
+
246
  /**
247
  * Format a list of function arguments for the backtrace
248
  *
app/code/community/Nexcessnet/Turpentine/Helper/Esi.php CHANGED
@@ -181,7 +181,7 @@ class Nexcessnet_Turpentine_Helper_Esi extends Mage_Core_Helper_Abstract {
181
  if( $url === null ) {
182
  $url = $this->getDummyUrl();
183
  }
184
- $request = new Nexcessnet_Turpentine_Model_Dummy_Request( $url );
185
  $request->fakeRouterDispatch();
186
  return $request;
187
  }
181
  if( $url === null ) {
182
  $url = $this->getDummyUrl();
183
  }
184
+ $request = Mage::getModel('turpentine/dummy_request', $url);
185
  $request->fakeRouterDispatch();
186
  return $request;
187
  }
app/code/community/Nexcessnet/Turpentine/Model/Core/Session.php ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Nexcess.net Turpentine Extension for Magento
5
+ * Copyright (C) 2012 Nexcess.net L.L.C.
6
+ *
7
+ * This program is free software; you can redistribute it and/or modify
8
+ * it under the terms of the GNU General Public License as published by
9
+ * the Free Software Foundation; either version 2 of the License, or
10
+ * (at your option) any later version.
11
+ *
12
+ * This program is distributed in the hope that it will be useful,
13
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ * GNU General Public License for more details.
16
+ *
17
+ * You should have received a copy of the GNU General Public License along
18
+ * with this program; if not, write to the Free Software Foundation, Inc.,
19
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20
+ */
21
+ class Nexcessnet_Turpentine_Model_Core_Session extends Mage_Core_Model_Session
22
+ {
23
+ public function __construct($data=array())
24
+ {
25
+ $name = isset($data['name']) ? $data['name'] : null;
26
+ $this->init('core', $name);
27
+ }
28
+
29
+ /**
30
+ * Retrieve Session Form Key
31
+ *
32
+ * @return string A 16 bit unique key for forms
33
+ */
34
+ public function getFormKey()
35
+ {
36
+ if (Mage::registry('replace_form_key') &&
37
+ !Mage::app()->getRequest()->getParam('form_key', false)) {
38
+ // flag request for ESI processing
39
+ Mage::register('turpentine_esi_flag', true, true);
40
+ return '{{form_key_esi_placeholder}}';
41
+ } else {
42
+ return parent::getFormKey();
43
+ }
44
+ }
45
+
46
+ public function real_getFormKey()
47
+ {
48
+ if (!$this->getData('_form_key')) {
49
+ $this->setData('_form_key', Mage::helper('core')->getRandomString(16));
50
+ }
51
+ return $this->getData('_form_key');
52
+ }
53
+ }
app/code/community/Nexcessnet/Turpentine/Model/Dummy/Request.php CHANGED
@@ -526,9 +526,12 @@ class Nexcessnet_Turpentine_Model_Dummy_Request extends
526
  * @return null
527
  */
528
  protected function _fixupFakeSuperGlobals( $uri ) {
 
529
  $parsedUrl = parse_url( $uri );
530
 
531
- $this->SERVER['REQUEST_URI'] = $parsedUrl['path'];
 
 
532
  if( isset( $parsedUrl['query'] ) && $parsedUrl['query'] ) {
533
  $this->SERVER['QUERY_STRING'] = $parsedUrl['query'];
534
  $this->SERVER['REQUEST_URI'] .= '?' . $this->SERVER['QUERY_STRING'];
526
  * @return null
527
  */
528
  protected function _fixupFakeSuperGlobals( $uri ) {
529
+ $uri = str_replace('|', urlencode('|'), $uri);
530
  $parsedUrl = parse_url( $uri );
531
 
532
+ if ( isset($parsedUrl['path']) ) {
533
+ $this->SERVER['REQUEST_URI'] = $parsedUrl['path'];
534
+ }
535
  if( isset( $parsedUrl['query'] ) && $parsedUrl['query'] ) {
536
  $this->SERVER['QUERY_STRING'] = $parsedUrl['query'];
537
  $this->SERVER['REQUEST_URI'] .= '?' . $this->SERVER['QUERY_STRING'];
app/code/community/Nexcessnet/Turpentine/Model/Observer/Ban.php CHANGED
@@ -217,6 +217,34 @@ class Nexcessnet_Turpentine_Model_Observer_Ban extends Varien_Event_Observer {
217
  }
218
  }
219
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
220
  /**
221
  * Do a full cache flush, corresponds to "Flush Magento Cache" and
222
  * "Flush Cache Storage" buttons in admin > cache management
217
  }
218
  }
219
 
220
+ /**
221
+ * Ban a specific CMS page revision from cache after edit (enterprise edition only)
222
+ * Events:
223
+ * enterprise_cms_revision_save_commit_after
224
+ *
225
+ * @param Varien_Object $eventObject
226
+ * @return null
227
+ */
228
+ public function banCmsPageRevisionCache($eventObject) {
229
+ if ( Mage::helper( 'turpentine/varnish' )->getVarnishEnabled() ) {
230
+ $pageId = $eventObject->getDataObject()->getPageId();
231
+ $page = Mage::getModel( 'cms/page' )->load( $pageId );
232
+
233
+ // Don't do anything if the page isn't found.
234
+ if( !$page ) {
235
+ return;
236
+ }
237
+ $pageIdentifier = $page->getIdentifier();
238
+ $result = $this->_getVarnishAdmin()->flushUrl( $pageIdentifier . '(?:\.html?)?$' );
239
+ Mage::dispatchEvent( 'turpentine_ban_cms_page_cache', $result );
240
+ $cronHelper = Mage::helper( 'turpentine/cron' );
241
+ if( $this->_checkResult( $result ) &&
242
+ $cronHelper->getCrawlerEnabled() ) {
243
+ $cronHelper->addCmsPageToCrawlerQueue( $pageIdentifier );
244
+ }
245
+ }
246
+ }
247
+
248
  /**
249
  * Do a full cache flush, corresponds to "Flush Magento Cache" and
250
  * "Flush Cache Storage" buttons in admin > cache management
app/code/community/Nexcessnet/Turpentine/Model/Observer/Esi.php CHANGED
@@ -20,6 +20,35 @@
20
  */
21
 
22
  class Nexcessnet_Turpentine_Model_Observer_Esi extends Varien_Event_Observer {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
23
 
24
  /**
25
  * Check the ESI flag and set the ESI header if needed
@@ -196,7 +225,7 @@ class Nexcessnet_Turpentine_Model_Observer_Esi extends Varien_Event_Observer {
196
  if( $esiHelper->getEsiBlockLogEnabled() ) {
197
  $debugHelper->logInfo(
198
  'Checking ESI block candidate: %s',
199
- $blockObject->getNameInLayout() );
200
  }
201
  if( $esiHelper->shouldResponseUseEsi() &&
202
  $blockObject instanceof Mage_Core_Block_Template &&
@@ -205,11 +234,11 @@ class Nexcessnet_Turpentine_Model_Observer_Esi extends Varien_Event_Observer {
205
  // admin blocks are not allowed to be cached for now
206
  $debugHelper->logWarn(
207
  'Ignoring attempt to inject adminhtml block: %s',
208
- $blockObject->getNameInLayout() );
209
  return;
210
  } elseif( $esiHelper->getEsiBlockLogEnabled() ) {
211
  $debugHelper->logInfo( 'Block check passed, injecting block: %s',
212
- $blockObject->getNameInLayout() );
213
  }
214
  Varien_Profiler::start( 'turpentine::observer::esi::injectEsi' );
215
  $ttlParam = $esiHelper->getEsiTtlParam();
@@ -293,7 +322,7 @@ class Nexcessnet_Turpentine_Model_Observer_Esi extends Varien_Event_Observer {
293
  $esiData->setBlockType( get_class( $blockObject ) );
294
  $esiData->setLayoutHandles( $this->_getBlockLayoutHandles( $blockObject ) );
295
  $esiData->setEsiMethod( $esiOptions[$methodParam] );
296
- if( $esiOptions[$cacheTypeParam] == 'private' ) {
297
  if( is_array( @$esiOptions['flush_events'] ) ) {
298
  $esiData->setFlushEvents( array_merge(
299
  $esiHelper->getDefaultCacheClearEvents(),
@@ -307,7 +336,11 @@ class Nexcessnet_Turpentine_Model_Observer_Esi extends Varien_Event_Observer {
307
  $esiData->setParentUrl( Mage::app()->getRequest()->getRequestString() );
308
  }
309
  if( is_array( $esiOptions['dummy_blocks'] ) ) {
310
- $esiData->setDummyBlocks( $esiOptions['dummy_blocks'] );
 
 
 
 
311
  } else {
312
  Mage::helper( 'turpentine/debug' )->logWarn(
313
  'Invalid dummy_blocks for block: %s',
@@ -411,7 +444,7 @@ class Nexcessnet_Turpentine_Model_Observer_Esi extends Varien_Event_Observer {
411
 
412
  // set the default TTL
413
  if( !isset( $options[$ttlParam] ) ) {
414
- if( $options[$cacheTypeParam] == 'private' ) {
415
  switch( $options[$methodParam] ) {
416
  case 'ajax':
417
  $options[$ttlParam] = '0';
@@ -487,4 +520,29 @@ class Nexcessnet_Turpentine_Model_Observer_Esi extends Varien_Event_Observer {
487
  protected function _checkIsEsiUrl( $url ) {
488
  return !$this->_checkIsNotEsiUrl( $url );
489
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
490
  }
20
  */
21
 
22
  class Nexcessnet_Turpentine_Model_Observer_Esi extends Varien_Event_Observer {
23
+ /**
24
+ * Set a cookie with the customer group id when customer logs in
25
+ *
26
+ * Events: customer_login
27
+ *
28
+ * @param Varien_Object $eventObject
29
+ * @return null
30
+ */
31
+ public function setCustomerGroupCookie( $eventObject ) {
32
+ $customer = $eventObject->getCustomer();
33
+ $cookie = Mage::getSingleton('core/cookie');
34
+ if (Mage::getStoreConfig('persistent/options/enabled')) {
35
+ $cookie->set('customer_group', $customer->getGroupId(), Mage::getStoreConfig('persistent/options/lifetime'));
36
+ } else {
37
+ $cookie->set('customer_group', $customer->getGroupId());
38
+ }
39
+ }
40
+
41
+ /**
42
+ * Destroy the cookie with the customer group when customer logs out
43
+ *
44
+ * Events: customer_logout
45
+ *
46
+ * @param Varien_Object $eventObject
47
+ * @return null
48
+ */
49
+ public function removeCustomerGroupCookie( $eventObject ) {
50
+ Mage::getSingleton('core/cookie')->delete('customer_group');
51
+ }
52
 
53
  /**
54
  * Check the ESI flag and set the ESI header if needed
225
  if( $esiHelper->getEsiBlockLogEnabled() ) {
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 &&
234
  // admin blocks are not allowed to be cached for now
235
  $debugHelper->logWarn(
236
  'Ignoring attempt to inject adminhtml block: %s',
237
+ $blockObject->getNameInLayout() ? $blockObject->getNameInLayout() : $blockObject->getModuleName() );
238
  return;
239
  } elseif( $esiHelper->getEsiBlockLogEnabled() ) {
240
  $debugHelper->logInfo( 'Block check passed, injecting block: %s',
241
+ $blockObject->getNameInLayout() ? $blockObject->getNameInLayout() : $blockObject->getModuleName() );
242
  }
243
  Varien_Profiler::start( 'turpentine::observer::esi::injectEsi' );
244
  $ttlParam = $esiHelper->getEsiTtlParam();
322
  $esiData->setBlockType( get_class( $blockObject ) );
323
  $esiData->setLayoutHandles( $this->_getBlockLayoutHandles( $blockObject ) );
324
  $esiData->setEsiMethod( $esiOptions[$methodParam] );
325
+ if( $esiOptions[$cacheTypeParam] == 'private' || $esiOptions[$cacheTypeParam] == 'customer_group' ) {
326
  if( is_array( @$esiOptions['flush_events'] ) ) {
327
  $esiData->setFlushEvents( array_merge(
328
  $esiHelper->getDefaultCacheClearEvents(),
336
  $esiData->setParentUrl( Mage::app()->getRequest()->getRequestString() );
337
  }
338
  if( is_array( $esiOptions['dummy_blocks'] ) ) {
339
+ $dummyBlocks = array();
340
+ foreach( $esiOptions['dummy_blocks'] as $key => $value ) {
341
+ $dummyBlocks[] = ( empty($value) && !is_numeric($key) ) ? $key : $value;
342
+ }
343
+ $esiData->setDummyBlocks( $dummyBlocks );
344
  } else {
345
  Mage::helper( 'turpentine/debug' )->logWarn(
346
  'Invalid dummy_blocks for block: %s',
444
 
445
  // set the default TTL
446
  if( !isset( $options[$ttlParam] ) ) {
447
+ if( $options[$cacheTypeParam] == 'private' || $options[$cacheTypeParam] == 'customer_group' ) {
448
  switch( $options[$methodParam] ) {
449
  case 'ajax':
450
  $options[$ttlParam] = '0';
520
  protected function _checkIsEsiUrl( $url ) {
521
  return !$this->_checkIsNotEsiUrl( $url );
522
  }
523
+
524
+ public function hookToControllerActionPreDispatch($observer) {
525
+ if(Mage::helper( 'turpentine/data')->getVclFix() == 0 && $observer->getEvent()->getControllerAction()->getFullActionName() == 'checkout_cart_add') {
526
+ Mage::dispatchEvent("add_to_cart_before", array('request' => $observer->getControllerAction()->getRequest()));
527
+ }
528
+ }
529
+
530
+ public function hookToControllerActionPostDispatch($observer) {
531
+ if($observer->getEvent()->getControllerAction()->getFullActionName() == 'checkout_cart_add') {
532
+ Mage::dispatchEvent("add_to_cart_after", array('request' => $observer->getControllerAction()->getRequest()));
533
+ }
534
+ }
535
+
536
+ public function hookToAddToCartBefore($observer) {
537
+ //Mage::log("hookToAddToCartBefore-antes ".print_r($observer->getEvent()->getRequest()->getParams(),true)." will be added to cart.", null, 'carrinho.log', true);
538
+ $key = Mage::getSingleton('core/session')->getFormKey();
539
+ $observer->getEvent()->getRequest()->setParam('form_key', $key);
540
+ $request = $observer->getEvent()->getRequest()->getParams();
541
+ //Mage::log("hookToAddToCartBefore ".print_r($request,true)." will be added to cart.", null, 'carrinho.log', true);
542
+ }
543
+
544
+ public function hookToAddToCartAfter($observer) {
545
+ $request = $observer->getEvent()->getRequest()->getParams();
546
+ //Mage::log("hookToAddToCartAfter ".print_r($request,true)." is added to cart.", null, 'carrinho.log', true);
547
+ }
548
  }
app/code/community/Nexcessnet/Turpentine/Model/Varnish/Admin.php CHANGED
@@ -27,7 +27,6 @@ class Nexcessnet_Turpentine_Model_Varnish_Admin {
27
  /**
28
  * Flush all Magento URLs in Varnish cache
29
  *
30
- * @param Nexcessnet_Turpentine_Model_Varnish_Configurator_Abstract $cfgr
31
  * @return bool
32
  */
33
  public function flushAll() {
@@ -37,8 +36,7 @@ class Nexcessnet_Turpentine_Model_Varnish_Admin {
37
  /**
38
  * Flush all Magento URLs matching the given (relative) regex
39
  *
40
- * @param Nexcessnet_Turpentine_Model_Varnish_Configurator_Abstract $cfgr
41
- * @param string $pattern regex to match against URLs
42
  * @return bool
43
  */
44
  public function flushUrl( $subPattern ) {
@@ -94,7 +92,6 @@ class Nexcessnet_Turpentine_Model_Varnish_Admin {
94
  /**
95
  * Generate and apply the config to the Varnish instances
96
  *
97
- * @param Nexcessnet_Turpentine_Model_Varnish_Configurator_Abstract $cfgr
98
  * @return bool
99
  */
100
  public function applyConfig() {
@@ -155,7 +152,7 @@ class Nexcessnet_Turpentine_Model_Varnish_Admin {
155
  }
156
  } else {
157
  // error
158
- Mage::helper( 'turpentine/debug' )->logWarning(
159
  'Failed to parse param.show output to check esi_syntax value' );
160
  $result = true;
161
  }
27
  /**
28
  * Flush all Magento URLs in Varnish cache
29
  *
 
30
  * @return bool
31
  */
32
  public function flushAll() {
36
  /**
37
  * Flush all Magento URLs matching the given (relative) regex
38
  *
39
+ * @param string $subPattern regex to match against URLs
 
40
  * @return bool
41
  */
42
  public function flushUrl( $subPattern ) {
92
  /**
93
  * Generate and apply the config to the Varnish instances
94
  *
 
95
  * @return bool
96
  */
97
  public function applyConfig() {
152
  }
153
  } else {
154
  // error
155
+ Mage::helper( 'turpentine/debug' )->logWarn(
156
  'Failed to parse param.show output to check esi_syntax value' );
157
  $result = true;
158
  }
app/code/community/Nexcessnet/Turpentine/Model/Varnish/Configurator/Abstract.php CHANGED
@@ -195,6 +195,26 @@ abstract class Nexcessnet_Turpentine_Model_Varnish_Configurator_Abstract {
195
  }
196
  }
197
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
198
  /**
199
  * Get the base url path regex
200
  *
@@ -322,6 +342,56 @@ abstract class Nexcessnet_Turpentine_Model_Varnish_Configurator_Abstract {
322
  Mage::getStoreConfig( 'turpentine_vcl/params/get_params' ) ) );
323
  }
324
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
325
  /**
326
  * Get the Force Static Caching option
327
  *
@@ -491,9 +561,10 @@ abstract class Nexcessnet_Turpentine_Model_Varnish_Configurator_Abstract {
491
  /**
492
  * Format a VCL backend declaration
493
  *
494
- * @param string $name name of the backend
495
- * @param string $host backend host
496
- * @param string $port backend port
 
497
  * @return string
498
  */
499
  protected function _vcl_backend( $name, $host, $port, $options=array() ) {
@@ -581,7 +652,7 @@ if (req.http.Accept-Encoding) {
581
  } else if (req.http.Accept-Encoding ~ "deflate") {
582
  set req.http.Accept-Encoding = "deflate";
583
  } else {
584
- # unkown algorithm
585
  unset req.http.Accept-Encoding;
586
  }
587
  }
@@ -604,6 +675,26 @@ EOS;
604
  'normalize_host_target' => $this->_getNormalizeHostTarget() ) );
605
  }
606
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
607
  /**
608
  * Build the list of template variables to apply to the VCL template
609
  *
@@ -616,13 +707,20 @@ EOS;
616
  'admin_frontname' => $this->_getAdminFrontname(),
617
  'normalize_host_target' => $this->_getNormalizeHostTarget(),
618
  'url_base_regex' => $this->getBaseUrlPathRegex(),
 
619
  'url_excludes' => $this->_getUrlExcludes(),
620
  'get_param_excludes' => $this->_getGetParamExcludes(),
 
621
  'default_ttl' => $this->_getDefaultTtl(),
622
  'enable_get_excludes' => ($this->_getGetParamExcludes() ? 'true' : 'false'),
 
623
  'debug_headers' => $this->_getEnableDebugHeaders(),
624
  'grace_period' => $this->_getGracePeriod(),
625
  'force_cache_static' => $this->_getForceCacheStatic(),
 
 
 
 
626
  'static_extensions' => $this->_getStaticExtensions(),
627
  'static_ttl' => $this->_getStaticTtl(),
628
  'url_ttls' => $this->_getUrlTtls(),
@@ -654,7 +752,13 @@ EOS;
654
  if( Mage::getStoreConfig( 'turpentine_vcl/normalization/host' ) ) {
655
  $vars['normalize_host'] = $this->_vcl_sub_normalize_host();
656
  }
657
-
 
 
 
 
 
 
658
  $customIncludeFile = $this->_getCustomIncludeFilename();
659
  if( is_readable( $customIncludeFile ) ) {
660
  $vars['custom_vcl_include'] = file_get_contents( $customIncludeFile );
195
  }
196
  }
197
 
198
+ /**
199
+ * Get hosts as regex
200
+ *
201
+ * ex: base_url: example.com
202
+ * path_regex: (example.com|example.net)
203
+ *
204
+ * @return string
205
+ */
206
+ public function getAllowedHostsRegex() {
207
+ $hosts = array();
208
+ foreach( Mage::app()->getStores() as $store ) {
209
+ $hosts[] = parse_url( $store->getBaseUrl( Mage_Core_Model_Store::URL_TYPE_WEB , false ), PHP_URL_HOST );
210
+ }
211
+
212
+ $hosts = array_values(array_unique( $hosts ));
213
+
214
+ $pattern = '('.implode('|', array_map("preg_quote", $hosts)).')';
215
+ return $pattern;
216
+ }
217
+
218
  /**
219
  * Get the base url path regex
220
  *
342
  Mage::getStoreConfig( 'turpentine_vcl/params/get_params' ) ) );
343
  }
344
 
345
+ protected function _getIgnoreGetParameters()
346
+ {
347
+ /** @var Nexcessnet_Turpentine_Helper_Data $helper */
348
+ $helper = Mage::helper('turpentine');
349
+ $ignoredParameters = $helper->cleanExplode(',', Mage::getStoreConfig( 'turpentine_vcl/params/ignore_get_params'));
350
+ return implode( '|', $ignoredParameters);
351
+ }
352
+
353
+ /**
354
+ * Get the Generate Session
355
+ *
356
+ * @return string
357
+ */
358
+ protected function _getGenerateSessionStart() {
359
+ return Mage::getStoreConfig( 'turpentine_varnish/general/vcl_fix' )
360
+ ? '/* -- REMOVED' : '';
361
+ }
362
+
363
+ /**
364
+ * Get the Generate Session
365
+ *
366
+ * @return string
367
+ */
368
+ protected function _getGenerateSessionEnd() {
369
+ return Mage::getStoreConfig( 'turpentine_varnish/general/vcl_fix' )
370
+ ? '-- */' : '';
371
+ }
372
+
373
+
374
+ /**
375
+ * Get the Generate Session
376
+ *
377
+ * @return string
378
+ */
379
+ protected function _getGenerateSession() {
380
+ return Mage::getStoreConfig( 'turpentine_varnish/general/vcl_fix' )
381
+ ? '# call generate_session' : 'call generate_session;';
382
+ }
383
+
384
+
385
+ /**
386
+ * Get the Generate Session Expires
387
+ *
388
+ * @return string
389
+ */
390
+ protected function _getGenerateSessionExpires() {
391
+ return Mage::getStoreConfig( 'turpentine_varnish/general/vcl_fix' )
392
+ ? '# call generate_session_expires' : 'call generate_session_expires;';
393
+ }
394
+
395
  /**
396
  * Get the Force Static Caching option
397
  *
561
  /**
562
  * Format a VCL backend declaration
563
  *
564
+ * @param string $name name of the backend
565
+ * @param string $host backend host
566
+ * @param string $port backend port
567
+ * @param array $options options
568
  * @return string
569
  */
570
  protected function _vcl_backend( $name, $host, $port, $options=array() ) {
652
  } else if (req.http.Accept-Encoding ~ "deflate") {
653
  set req.http.Accept-Encoding = "deflate";
654
  } else {
655
+ # unknown algorithm
656
  unset req.http.Accept-Encoding;
657
  }
658
  }
675
  'normalize_host_target' => $this->_getNormalizeHostTarget() ) );
676
  }
677
 
678
+ /**
679
+ * Get the hostname for cookie normalization
680
+ *
681
+ * @return string
682
+ */
683
+ protected function _getNormalizeCookieTarget() {
684
+ return trim( Mage::getStoreConfig(
685
+ 'turpentine_vcl/normalization/cookie_target' ) );
686
+ }
687
+
688
+ /**
689
+ * Get the regex for cookie normalization
690
+ *
691
+ * @return string
692
+ */
693
+ protected function _getNormalizeCookieRegex() {
694
+ return trim( Mage::getStoreConfig(
695
+ 'turpentine_vcl/normalization/cookie_regex' ) );
696
+ }
697
+
698
  /**
699
  * Build the list of template variables to apply to the VCL template
700
  *
707
  'admin_frontname' => $this->_getAdminFrontname(),
708
  'normalize_host_target' => $this->_getNormalizeHostTarget(),
709
  'url_base_regex' => $this->getBaseUrlPathRegex(),
710
+ 'allowed_hosts_regex' => $this->getAllowedHostsRegex(),
711
  'url_excludes' => $this->_getUrlExcludes(),
712
  'get_param_excludes' => $this->_getGetParamExcludes(),
713
+ 'get_param_ignored' => $this->_getIgnoreGetParameters(),
714
  'default_ttl' => $this->_getDefaultTtl(),
715
  'enable_get_excludes' => ($this->_getGetParamExcludes() ? 'true' : 'false'),
716
+ 'enable_get_ignored' => ($this->_getIgnoreGetParameters() ? 'true' : 'false'),
717
  'debug_headers' => $this->_getEnableDebugHeaders(),
718
  'grace_period' => $this->_getGracePeriod(),
719
  'force_cache_static' => $this->_getForceCacheStatic(),
720
+ 'generate_session_expires' => $this->_getGenerateSessionExpires(),
721
+ 'generate_session' => $this->_getGenerateSession(),
722
+ 'generate_session_start' => $this->_getGenerateSessionStart(),
723
+ 'generate_session_end' => $this->_getGenerateSessionEnd(),
724
  'static_extensions' => $this->_getStaticExtensions(),
725
  'static_ttl' => $this->_getStaticTtl(),
726
  'url_ttls' => $this->_getUrlTtls(),
752
  if( Mage::getStoreConfig( 'turpentine_vcl/normalization/host' ) ) {
753
  $vars['normalize_host'] = $this->_vcl_sub_normalize_host();
754
  }
755
+ if( Mage::getStoreConfig( 'turpentine_vcl/normalization/cookie_regex' ) ) {
756
+ $vars['normalize_cookie_regex'] = $this->_getNormalizeCookieRegex();
757
+ }
758
+ if( Mage::getStoreConfig( 'turpentine_vcl/normalization/cookie_target' ) ) {
759
+ $vars['normalize_cookie_target'] = $this->_getNormalizeCookieTarget();
760
+ }
761
+
762
  $customIncludeFile = $this->_getCustomIncludeFilename();
763
  if( is_readable( $customIncludeFile ) ) {
764
  $vars['custom_vcl_include'] = file_get_contents( $customIncludeFile );
app/code/community/Nexcessnet/Turpentine/Model/Varnish/Configurator/Abstract.php~ ADDED
@@ -0,0 +1,769 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Nexcess.net Turpentine Extension for Magento
5
+ * Copyright (C) 2012 Nexcess.net L.L.C.
6
+ *
7
+ * This program is free software; you can redistribute it and/or modify
8
+ * it under the terms of the GNU General Public License as published by
9
+ * the Free Software Foundation; either version 2 of the License, or
10
+ * (at your option) any later version.
11
+ *
12
+ * This program is distributed in the hope that it will be useful,
13
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ * GNU General Public License for more details.
16
+ *
17
+ * You should have received a copy of the GNU General Public License along
18
+ * with this program; if not, write to the Free Software Foundation, Inc.,
19
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20
+ */
21
+
22
+ abstract class Nexcessnet_Turpentine_Model_Varnish_Configurator_Abstract {
23
+
24
+ const VCL_CUSTOM_C_CODE_FILE = 'uuid.c';
25
+
26
+ /**
27
+ * Get the correct version of a configurator from a socket
28
+ *
29
+ * @param Nexcessnet_Turpentine_Model_Varnish_Admin_Socket $socket
30
+ * @return Nexcessnet_Turpentine_Model_Varnish_Configurator_Abstract
31
+ */
32
+ static public function getFromSocket( $socket ) {
33
+ try {
34
+ $version = $socket->getVersion();
35
+ } catch( Mage_Core_Exception $e ) {
36
+ Mage::getSingleton( 'core/session' )
37
+ ->addError( 'Error determining Varnish version: ' .
38
+ $e->getMessage() );
39
+ return null;
40
+ }
41
+ switch( $version ) {
42
+ case '3.0':
43
+ return Mage::getModel(
44
+ 'turpentine/varnish_configurator_version3',
45
+ array( 'socket' => $socket ) );
46
+ case '2.1':
47
+ return Mage::getModel(
48
+ 'turpentine/varnish_configurator_version2',
49
+ array( 'socket' => $socket ) );
50
+ default:
51
+ Mage::throwException( 'Unsupported Varnish version' );
52
+ }
53
+ }
54
+
55
+ /**
56
+ * The socket this configurator is based on
57
+ *
58
+ * @var Nexcessnet_Turpentine_Model_Varnish_Admin_Socket
59
+ */
60
+ protected $_socket = null;
61
+ /**
62
+ * options array
63
+ *
64
+ * @var array
65
+ */
66
+ protected $_options = array(
67
+ 'vcl_template' => null,
68
+ );
69
+
70
+ public function __construct( $options=array() ) {
71
+ $this->_options = array_merge( $this->_options, $options );
72
+ }
73
+
74
+ abstract public function generate($doClean=true);
75
+ // abstract protected function _getTemplateVars();
76
+
77
+ /**
78
+ * Save the generated config to the file specified in Magento config
79
+ *
80
+ * @param string $generatedConfig config generated by @generate
81
+ * @return null
82
+ */
83
+ public function save( $generatedConfig ) {
84
+ $filename = $this->_getVclFilename();
85
+ $dir = dirname( $filename );
86
+ if( !is_dir( $dir ) ) {
87
+ // this umask is probably redundant, but just in case...
88
+ if( !mkdir( $dir, 0777 & ~umask(), true ) ) {
89
+ $err = error_get_last();
90
+ return array( false, $err );
91
+ }
92
+ }
93
+ if( strlen( $generatedConfig ) !==
94
+ file_put_contents( $filename, $generatedConfig ) ) {
95
+ $err = error_get_last();
96
+ return array( false, $err );
97
+ }
98
+ return array( true, null );
99
+ }
100
+
101
+ /**
102
+ * Get the full path for a given template filename
103
+ *
104
+ * @param string $baseFilename
105
+ * @return string
106
+ */
107
+ protected function _getVclTemplateFilename( $baseFilename ) {
108
+ $extensionDir = Mage::getModuleDir( '', 'Nexcessnet_Turpentine' );
109
+ return sprintf( '%s/misc/%s', $extensionDir, $baseFilename );
110
+ }
111
+
112
+ /**
113
+ * Get the name of the file to save the VCL to
114
+ *
115
+ * @return string
116
+ */
117
+ protected function _getVclFilename() {
118
+ return $this->_formatTemplate(
119
+ Mage::getStoreConfig( 'turpentine_varnish/servers/config_file' ),
120
+ array( 'root_dir' => Mage::getBaseDir() ) );
121
+ }
122
+
123
+ /**
124
+ * Get the name of the custom include VCL file
125
+ *
126
+ * @return string
127
+ */
128
+ protected function _getCustomIncludeFilename() {
129
+ return $this->_formatTemplate(
130
+ Mage::getStoreConfig( 'turpentine_varnish/servers/custom_include_file' ),
131
+ array( 'root_dir' => Mage::getBaseDir() ) );
132
+ }
133
+
134
+ /**
135
+ * Format a template string, replacing {{keys}} with the appropriate values
136
+ * and remove unspecified keys
137
+ *
138
+ * @param string $template template string to operate on
139
+ * @param array $vars array of key => value replacements
140
+ * @return string
141
+ */
142
+ protected function _formatTemplate( $template, array $vars ) {
143
+ $needles = array_map( create_function( '$k', 'return "{{".$k."}}";' ),
144
+ array_keys( $vars ) );
145
+ $replacements = array_values( $vars );
146
+ // do replacements, then delete unused template vars
147
+ return preg_replace( '~{{[^}]+}}~', '',
148
+ str_replace( $needles, $replacements, $template ) );
149
+ }
150
+
151
+ /**
152
+ * Format a VCL subroutine call
153
+ *
154
+ * @param string $subroutine subroutine name
155
+ * @return string
156
+ */
157
+ protected function _vcl_call( $subroutine ) {
158
+ return sprintf( 'call %s;', $subroutine );
159
+ }
160
+
161
+ /**
162
+ * Get the Magento admin frontname
163
+ *
164
+ * This is just the plain string, not in URL format. ex:
165
+ * http://example.com/magento/admin -> admin
166
+ *
167
+ * @return string
168
+ */
169
+ protected function _getAdminFrontname() {
170
+ if( Mage::getStoreConfig( 'admin/url/use_custom_path' ) ) {
171
+ return Mage::getStoreConfig( 'admin/url/custom_path' );
172
+ } else {
173
+ return (string)Mage::getConfig()->getNode(
174
+ 'admin/routers/adminhtml/args/frontName' );
175
+ }
176
+ }
177
+
178
+ /**
179
+ * Get the hostname for host normalization from Magento's base URL
180
+ *
181
+ * @return string
182
+ */
183
+ protected function _getNormalizeHostTarget() {
184
+ $configHost = trim( Mage::getStoreConfig(
185
+ 'turpentine_vcl/normalization/host_target' ) );
186
+ if( $configHost ) {
187
+ return $configHost;
188
+ } else {
189
+ $baseUrl = parse_url( Mage::getBaseUrl() );
190
+ if( isset( $baseUrl['port'] ) ) {
191
+ return sprintf( '%s:%d', $baseUrl['host'], $baseUrl['port'] );
192
+ } else {
193
+ return $baseUrl['host'];
194
+ }
195
+ }
196
+ }
197
+
198
+ /**
199
+ * Get hosts as regex
200
+ *
201
+ * ex: base_url: example.com
202
+ * path_regex: (example.com|example.net)
203
+ *
204
+ * @return string
205
+ */
206
+ public function getAllowedHostsRegex() {
207
+ $hosts = array();
208
+ foreach( Mage::app()->getStores() as $store ) {
209
+ $hosts[] = parse_url( $store->getBaseUrl( Mage_Core_Model_Store::URL_TYPE_WEB , false ), PHP_URL_HOST );
210
+ }
211
+
212
+ $hosts = array_values(array_unique( $hosts ));
213
+
214
+ $pattern = '('.implode('|', array_map("preg_quote", $hosts)).')';
215
+ return $pattern;
216
+ }
217
+
218
+ /**
219
+ * Get the base url path regex
220
+ *
221
+ * ex: base_url: http://example.com/magento/
222
+ * path_regex: /magento/(?:(?:index|litespeed)\.php/)?
223
+ *
224
+ * @return string
225
+ */
226
+ public function getBaseUrlPathRegex() {
227
+ $pattern = '^(%s)(?:(?:index|litespeed)\\.php/)?';
228
+ return sprintf( $pattern, implode( '|',
229
+ array_map( create_function( '$x', 'return preg_quote($x,"|");' ),
230
+ $this->_getBaseUrlPaths() ) ) );
231
+ }
232
+
233
+ /**
234
+ * Get the path part of each store's base URL and static file URLs
235
+ *
236
+ * @return array
237
+ */
238
+ protected function _getBaseUrlPaths() {
239
+ $paths = array();
240
+ $linkTypes = array( Mage_Core_Model_Store::URL_TYPE_LINK,
241
+ Mage_Core_Model_Store::URL_TYPE_JS,
242
+ Mage_Core_Model_Store::URL_TYPE_SKIN,
243
+ Mage_Core_Model_Store::URL_TYPE_MEDIA );
244
+ foreach( Mage::app()->getStores() as $store ) {
245
+ foreach( $linkTypes as $linkType ) {
246
+ $paths[] = parse_url( $store->getBaseUrl( $linkType , false ),
247
+ PHP_URL_PATH );
248
+ $paths[] = parse_url( $store->getBaseUrl( $linkType , true ),
249
+ PHP_URL_PATH );
250
+ }
251
+ }
252
+ $paths = array_unique( $paths );
253
+ usort( $paths, create_function( '$a, $b',
254
+ 'return strlen( $b ) - strlen( $a );' ) );
255
+ return array_values( $paths );
256
+ }
257
+
258
+ /**
259
+ * Format the URL exclusions for insertion in a regex. Admin frontname and
260
+ * API are automatically added.
261
+ *
262
+ * @return string
263
+ */
264
+ protected function _getUrlExcludes() {
265
+ $urls = Mage::getStoreConfig( 'turpentine_vcl/urls/url_blacklist' );
266
+ return implode( '|', array_merge( array( $this->_getAdminFrontname(), 'api' ),
267
+ Mage::helper( 'turpentine/data' )->cleanExplode( PHP_EOL, $urls ) ) );
268
+ }
269
+
270
+ /**
271
+ * Get the default cache TTL from Magento config
272
+ *
273
+ * @return string
274
+ */
275
+ protected function _getDefaultTtl() {
276
+ return Mage::helper( 'turpentine/varnish' )->getDefaultTtl();
277
+ }
278
+
279
+ /**
280
+ * Get the default backend configuration string
281
+ *
282
+ * @return string
283
+ */
284
+ protected function _getDefaultBackend() {
285
+ $timeout = Mage::getStoreConfig( 'turpentine_vcl/backend/frontend_timeout' );
286
+ $default_options = array(
287
+ 'first_byte_timeout' => $timeout . 's',
288
+ 'between_bytes_timeout' => $timeout . 's',
289
+ );
290
+ return $this->_vcl_backend( 'default',
291
+ Mage::getStoreConfig( 'turpentine_vcl/backend/backend_host' ),
292
+ Mage::getStoreConfig( 'turpentine_vcl/backend/backend_port' ),
293
+ $default_options );
294
+ }
295
+
296
+ /**
297
+ * Get the admin backend configuration string
298
+ *
299
+ * @return string
300
+ */
301
+ protected function _getAdminBackend() {
302
+ $timeout = Mage::getStoreConfig( 'turpentine_vcl/backend/admin_timeout' );
303
+ $admin_options = array(
304
+ 'first_byte_timeout' => $timeout . 's',
305
+ 'between_bytes_timeout' => $timeout . 's',
306
+ );
307
+ return $this->_vcl_backend( 'admin',
308
+ Mage::getStoreConfig( 'turpentine_vcl/backend/backend_host' ),
309
+ Mage::getStoreConfig( 'turpentine_vcl/backend/backend_port' ),
310
+ $admin_options );
311
+ }
312
+
313
+ /**
314
+ * Get the grace period for vcl_fetch
315
+ *
316
+ * This is curently hardcoded to 15 seconds, will be configurable at some
317
+ * point
318
+ *
319
+ * @return string
320
+ */
321
+ protected function _getGracePeriod() {
322
+ return Mage::getStoreConfig( 'turpentine_vcl/ttls/grace_period' );
323
+ }
324
+
325
+ /**
326
+ * Get whether debug headers should be enabled or not
327
+ *
328
+ * @return string
329
+ */
330
+ protected function _getEnableDebugHeaders() {
331
+ return Mage::getStoreConfig( 'turpentine_varnish/general/varnish_debug' )
332
+ ? 'true' : 'false';
333
+ }
334
+
335
+ /**
336
+ * Format the GET variable excludes for insertion in a regex
337
+ *
338
+ * @return string
339
+ */
340
+ protected function _getGetParamExcludes() {
341
+ return implode( '|', Mage::helper( 'turpentine/data' )->cleanExplode( ',',
342
+ Mage::getStoreConfig( 'turpentine_vcl/params/get_params' ) ) );
343
+ }
344
+
345
+ protected function _getIgnoreGetParameters()
346
+ {
347
+ /** @var Nexcessnet_Turpentine_Helper_Data $helper */
348
+ $helper = Mage::helper('turpentine');
349
+ $ignoredParameters = $helper->cleanExplode(',', Mage::getStoreConfig( 'turpentine_vcl/params/ignore_get_params'));
350
+ return implode( '|', $ignoredParameters);
351
+ }
352
+
353
+ /**
354
+ * Get the Generate Session
355
+ *
356
+ * @return string
357
+ */
358
+ protected function _getGenerateSessionStart() {
359
+ return Mage::getStoreConfig( 'turpentine_varnish/general/vcl_fix' )
360
+ ? '/* -- REMOVED' : '';
361
+ }
362
+
363
+ /**
364
+ * Get the Generate Session
365
+ *
366
+ * @return string
367
+ */
368
+ protected function _getGenerateSessionEnd() {
369
+ return Mage::getStoreConfig( 'turpentine_varnish/general/vcl_fix' )
370
+ ? '-- */' : '';
371
+ }
372
+
373
+
374
+ /**
375
+ * Get the Generate Session
376
+ *
377
+ * @return string
378
+ */
379
+ protected function _getGenerateSession() {
380
+ return Mage::getStoreConfig( 'turpentine_varnish/general/vcl_fix' )
381
+ ? '# call generate_session' : 'call generate_session;';
382
+ }
383
+
384
+
385
+ /**
386
+ * Get the Generate Session Expires
387
+ *
388
+ * @return string
389
+ */
390
+ protected function _getGenerateSessionExpires() {
391
+ return Mage::getStoreConfig( 'turpentine_varnish/general/vcl_fix' )
392
+ ? '# call generate_session_expires' : 'call generate_session_expires;';
393
+ }
394
+
395
+ /**
396
+ * Get the Force Static Caching option
397
+ *
398
+ * @return string
399
+ */
400
+ protected function _getForceCacheStatic() {
401
+ return Mage::getStoreConfig( 'turpentine_vcl/static/force_static' )
402
+ ? 'true' : 'false';
403
+ }
404
+
405
+ /**
406
+ * Format the list of static cache extensions
407
+ *
408
+ * @return string
409
+ */
410
+ protected function _getStaticExtensions() {
411
+ return implode( '|', Mage::helper( 'turpentine/data' )->cleanExplode( ',',
412
+ Mage::getStoreConfig( 'turpentine_vcl/static/exts' ) ) );
413
+ }
414
+
415
+ /**
416
+ * Get the static caching TTL
417
+ *
418
+ * @return string
419
+ */
420
+ protected function _getStaticTtl() {
421
+ return Mage::getStoreConfig( 'turpentine_vcl/ttls/static_ttl' );
422
+ }
423
+
424
+ /**
425
+ * Format the by-url TTL value list
426
+ *
427
+ * @return string
428
+ */
429
+ protected function _getUrlTtls() {
430
+ $str = array();
431
+ $configTtls = Mage::helper( 'turpentine/data' )->cleanExplode( PHP_EOL,
432
+ Mage::getStoreConfig( 'turpentine_vcl/ttls/url_ttls' ) );
433
+ $ttls = array();
434
+ foreach( $configTtls as $line ) {
435
+ $ttls[] = explode( ',', trim( $line ) );
436
+ }
437
+ foreach( $ttls as $ttl ) {
438
+ $str[] = sprintf( 'if (bereq.url ~ "%s%s") { set beresp.ttl = %ds; }',
439
+ $this->getBaseUrlPathRegex(), $ttl[0], $ttl[1] );
440
+ }
441
+ $str = implode( ' else ', $str );
442
+ if( $str ) {
443
+ $str .= sprintf( ' else { set beresp.ttl = %ds; }',
444
+ $this->_getDefaultTtl() );
445
+ } else {
446
+ $str = sprintf( 'set beresp.ttl = %ds;', $this->_getDefaultTtl() );
447
+ }
448
+ return $str;
449
+ }
450
+
451
+ /**
452
+ * Get the Enable Caching value
453
+ *
454
+ * @return string
455
+ */
456
+ protected function _getEnableCaching() {
457
+ return Mage::helper( 'turpentine/varnish' )->getVarnishEnabled() ?
458
+ 'true' : 'false';
459
+ }
460
+
461
+ /**
462
+ * Get the list of allowed debug IPs
463
+ *
464
+ * @return array
465
+ */
466
+ protected function _getDebugIps() {
467
+ return Mage::helper( 'turpentine/data' )->cleanExplode( ',',
468
+ Mage::getStoreConfig( 'dev/restrict/allow_ips' ) );
469
+ }
470
+
471
+ /**
472
+ * Get the list of crawler IPs
473
+ *
474
+ * @return array
475
+ */
476
+ protected function _getCrawlerIps() {
477
+ return Mage::helper( 'turpentine/data' )->cleanExplode( ',',
478
+ Mage::getStoreConfig( 'turpentine_vcl/backend/crawlers' ) );
479
+ }
480
+
481
+ /**
482
+ * Get the regex formatted list of crawler user agents
483
+ *
484
+ * @return string
485
+ */
486
+ protected function _getCrawlerUserAgents() {
487
+ return implode( '|', Mage::helper( 'turpentine/data' )
488
+ ->cleanExplode( ',',
489
+ Mage::getStoreConfig(
490
+ 'turpentine_vcl/backend/crawler_user_agents' ) ) );
491
+ }
492
+
493
+ /**
494
+ * Get the time to increase a cached objects TTL on cache hit (in seconds).
495
+ *
496
+ * This should be set very low since it gets added to every hit.
497
+ *
498
+ * @return string
499
+ */
500
+ protected function _getLruFactor() {
501
+ return Mage::getStoreConfig( 'turpentine_vcl/ttls/lru_factor' );
502
+ }
503
+
504
+ /**
505
+ * Get the advanced session validation restrictions
506
+ *
507
+ * Note that if User-Agent Normalization is on then the normalized user-agent
508
+ * is used for user-agent validation instead of the full user-agent
509
+ *
510
+ * @return string
511
+ */
512
+ protected function _getAdvancedSessionValidationTargets() {
513
+ $validation = array();
514
+ if( Mage::getStoreConfig( 'web/session/use_remote_addr' ) ) {
515
+ $validation[] = 'client.ip';
516
+ }
517
+ if( Mage::getStoreConfig( 'web/session/use_http_via' ) ) {
518
+ $validation[] = 'req.http.Via';
519
+ }
520
+ if( Mage::getStoreConfig( 'web/session/use_http_x_forwarded_for' ) ) {
521
+ $validation[] = 'req.http.X-Forwarded-For';
522
+ }
523
+ if( Mage::getStoreConfig(
524
+ 'web/session/use_http_user_agent' ) &&
525
+ !Mage::getStoreConfig(
526
+ 'turpentine_vcl/normalization/user_agent' ) ) {
527
+ $validation[] = 'req.http.User-Agent';
528
+ }
529
+ return $validation;
530
+ }
531
+
532
+ /**
533
+ * Remove empty and commented out lines from the generated VCL
534
+ *
535
+ * @param string $dirtyVcl generated vcl
536
+ * @return string
537
+ */
538
+ protected function _cleanVcl( $dirtyVcl ) {
539
+ return implode( PHP_EOL,
540
+ array_filter(
541
+ Mage::helper( 'turpentine/data' )
542
+ ->cleanExplode( PHP_EOL, $dirtyVcl ),
543
+ array( $this, '_cleanVclHelper' )
544
+ )
545
+ );
546
+ }
547
+
548
+ /**
549
+ * Helper to filter out blank/commented lines for VCL cleaning
550
+ *
551
+ * @param string $line
552
+ * @return bool
553
+ */
554
+ protected function _cleanVclHelper( $line ) {
555
+ return $line &&
556
+ ( ( substr( $line, 0, 1 ) != '#' &&
557
+ substr( $line, 0, 2 ) != '//' ) ||
558
+ substr( $line, 0, 8 ) == '#include' );
559
+ }
560
+
561
+ /**
562
+ * Format a VCL backend declaration
563
+ *
564
+ * @param string $name name of the backend
565
+ * @param string $host backend host
566
+ * @param string $port backend port
567
+ * @param array $options options
568
+ * @return string
569
+ */
570
+ protected function _vcl_backend( $name, $host, $port, $options=array() ) {
571
+ $tpl = <<<EOS
572
+ backend {{name}} {
573
+ .host = "{{host}}";
574
+ .port = "{{port}}";
575
+
576
+ EOS;
577
+ $vars = array(
578
+ 'host' => $host,
579
+ 'port' => $port,
580
+ 'name' => $name,
581
+ );
582
+ $str = $this->_formatTemplate( $tpl, $vars );
583
+ foreach( $options as $key => $value ) {
584
+ $str .= sprintf( ' .%s = %s;', $key, $value ) . PHP_EOL;
585
+ }
586
+ $str .= '}' . PHP_EOL;
587
+ return $str;
588
+ }
589
+
590
+ /**
591
+ * Format a VCL ACL declaration
592
+ *
593
+ * @param string $name ACL name
594
+ * @param array $hosts list of hosts to add to the ACL
595
+ * @return string
596
+ */
597
+ protected function _vcl_acl( $name, array $hosts ) {
598
+ $tpl = <<<EOS
599
+ acl {{name}} {
600
+ {{hosts}}
601
+ }
602
+ EOS;
603
+ $fmtHost = create_function( '$h', 'return sprintf(\'"%s";\',$h);' );
604
+ $vars = array(
605
+ 'name' => $name,
606
+ 'hosts' => implode( "\n ", array_map( $fmtHost, $hosts ) ),
607
+ );
608
+ return $this->_formatTemplate( $tpl, $vars );
609
+ }
610
+
611
+ /**
612
+ * Get the User-Agent normalization sub routine
613
+ *
614
+ * @return string
615
+ */
616
+ protected function _vcl_sub_normalize_user_agent() {
617
+ /**
618
+ * Mobile regex from
619
+ * @link http://magebase.com/magento-tutorials/magento-design-exceptions-explained/
620
+ */
621
+ $tpl = <<<EOS
622
+ if (req.http.User-Agent ~ "iP(?:hone|ad|od)|BlackBerry|Palm|Googlebot-Mobile|Mobile|mobile|mobi|Windows Mobile|Safari Mobile|Android|Opera (?:Mini|Mobi)") {
623
+ set req.http.X-Normalized-User-Agent = "mobile";
624
+ } else if (req.http.User-Agent ~ "MSIE") {
625
+ set req.http.X-Normalized-User-Agent = "msie";
626
+ } else if (req.http.User-Agent ~ "Firefox") {
627
+ set req.http.X-Normalized-User-Agent = "firefox";
628
+ } else if (req.http.User-Agent ~ "Chrome") {
629
+ set req.http.X-Normalized-User-Agent = "chrome";
630
+ } else if (req.http.User-Agent ~ "Safari") {
631
+ set req.http.X-Normalized-User-Agent = "safari";
632
+ } else if (req.http.User-Agent ~ "Opera") {
633
+ set req.http.X-Normalized-User-Agent = "opera";
634
+ } else {
635
+ set req.http.X-Normalized-User-Agent = "other";
636
+ }
637
+
638
+ EOS;
639
+ return $tpl;
640
+ }
641
+
642
+ /**
643
+ * Get the Accept-Encoding normalization sub routine
644
+ *
645
+ * @return string
646
+ */
647
+ protected function _vcl_sub_normalize_encoding() {
648
+ $tpl = <<<EOS
649
+ if (req.http.Accept-Encoding) {
650
+ if (req.http.Accept-Encoding ~ "gzip") {
651
+ set req.http.Accept-Encoding = "gzip";
652
+ } else if (req.http.Accept-Encoding ~ "deflate") {
653
+ set req.http.Accept-Encoding = "deflate";
654
+ } else {
655
+ # unknown algorithm
656
+ unset req.http.Accept-Encoding;
657
+ }
658
+ }
659
+
660
+ EOS;
661
+ return $tpl;
662
+ }
663
+
664
+ /**
665
+ * Get the Host normalization sub routine
666
+ *
667
+ * @return string
668
+ */
669
+ protected function _vcl_sub_normalize_host() {
670
+ $tpl = <<<EOS
671
+ set req.http.Host = "{{normalize_host_target}}";
672
+
673
+ EOS;
674
+ return $this->_formatTemplate( $tpl, array(
675
+ 'normalize_host_target' => $this->_getNormalizeHostTarget() ) );
676
+ }
677
+
678
+ /**
679
+ * Get the hostname for cookie normalization
680
+ *
681
+ * @return string
682
+ */
683
+ protected function _getNormalizeCookieTarget() {
684
+ return trim( Mage::getStoreConfig(
685
+ 'turpentine_vcl/normalization/cookie_target' ) );
686
+ }
687
+
688
+ /**
689
+ * Get the regex for cookie normalization
690
+ *
691
+ * @return string
692
+ */
693
+ protected function _getNormalizeCookieRegex() {
694
+ return trim( Mage::getStoreConfig(
695
+ 'turpentine_vcl/normalization/cookie_regex' ) );
696
+ }
697
+
698
+ /**
699
+ * Build the list of template variables to apply to the VCL template
700
+ *
701
+ * @return array
702
+ */
703
+ protected function _getTemplateVars() {
704
+ $vars = array(
705
+ 'default_backend' => $this->_getDefaultBackend(),
706
+ 'admin_backend' => $this->_getAdminBackend(),
707
+ 'admin_frontname' => $this->_getAdminFrontname(),
708
+ 'normalize_host_target' => $this->_getNormalizeHostTarget(),
709
+ 'url_base_regex' => $this->getBaseUrlPathRegex(),
710
+ 'allowed_hosts_regex' => $this->getAllowedHostsRegex(),
711
+ 'url_excludes' => $this->_getUrlExcludes(),
712
+ 'get_param_excludes' => $this->_getGetParamExcludes(),
713
+ 'get_param_ignored' => $this->_getIgnoreGetParameters(),
714
+ 'default_ttl' => $this->_getDefaultTtl(),
715
+ 'enable_get_excludes' => ($this->_getGetParamExcludes() ? 'true' : 'false'),
716
+ 'enable_get_ignored' => ($this->_getIgnoreGetParameters()) ? 'true' : 'false',
717
+ 'debug_headers' => $this->_getEnableDebugHeaders(),
718
+ 'grace_period' => $this->_getGracePeriod(),
719
+ 'force_cache_static' => $this->_getForceCacheStatic(),
720
+ 'generate_session_expires' => $this->_getGenerateSessionExpires(),
721
+ 'generate_session' => $this->_getGenerateSession(),
722
+ 'generate_session_start' => $this->_getGenerateSessionStart(),
723
+ 'generate_session_end' => $this->_getGenerateSessionEnd(),
724
+ 'static_extensions' => $this->_getStaticExtensions(),
725
+ 'static_ttl' => $this->_getStaticTtl(),
726
+ 'url_ttls' => $this->_getUrlTtls(),
727
+ 'enable_caching' => $this->_getEnableCaching(),
728
+ 'crawler_acl' => $this->_vcl_acl( 'crawler_acl',
729
+ $this->_getCrawlerIps() ),
730
+ 'esi_cache_type_param' =>
731
+ Mage::helper( 'turpentine/esi' )->getEsiCacheTypeParam(),
732
+ 'esi_method_param' =>
733
+ Mage::helper( 'turpentine/esi' )->getEsiMethodParam(),
734
+ 'esi_ttl_param' => Mage::helper( 'turpentine/esi' )->getEsiTtlParam(),
735
+ 'secret_handshake' => Mage::helper( 'turpentine/varnish' )
736
+ ->getSecretHandshake(),
737
+ 'crawler_user_agent_regex' => $this->_getCrawlerUserAgents(),
738
+ // 'lru_factor' => $this->_getLruFactor(),
739
+ 'debug_acl' => $this->_vcl_acl( 'debug_acl',
740
+ $this->_getDebugIps() ),
741
+ 'custom_c_code' => file_get_contents(
742
+ $this->_getVclTemplateFilename( self::VCL_CUSTOM_C_CODE_FILE ) ),
743
+ 'esi_private_ttl' => Mage::helper( 'turpentine/esi' )
744
+ ->getDefaultEsiTtl(),
745
+ );
746
+ if( Mage::getStoreConfig( 'turpentine_vcl/normalization/encoding' ) ) {
747
+ $vars['normalize_encoding'] = $this->_vcl_sub_normalize_encoding();
748
+ }
749
+ if( Mage::getStoreConfig( 'turpentine_vcl/normalization/user_agent' ) ) {
750
+ $vars['normalize_user_agent'] = $this->_vcl_sub_normalize_user_agent();
751
+ }
752
+ if( Mage::getStoreConfig( 'turpentine_vcl/normalization/host' ) ) {
753
+ $vars['normalize_host'] = $this->_vcl_sub_normalize_host();
754
+ }
755
+ if( Mage::getStoreConfig( 'turpentine_vcl/normalization/cookie_regex' ) ) {
756
+ $vars['normalize_cookie_regex'] = $this->_getNormalizeCookieRegex();
757
+ }
758
+ if( Mage::getStoreConfig( 'turpentine_vcl/normalization/cookie_target' ) ) {
759
+ $vars['normalize_cookie_target'] = $this->_getNormalizeCookieTarget();
760
+ }
761
+
762
+ $customIncludeFile = $this->_getCustomIncludeFilename();
763
+ if( is_readable( $customIncludeFile ) ) {
764
+ $vars['custom_vcl_include'] = file_get_contents( $customIncludeFile );
765
+ }
766
+
767
+ return $vars;
768
+ }
769
+ }
app/code/community/Nexcessnet/Turpentine/controllers/Adminhtml/CacheController.php ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * User: damian.pastorini@usestrategery.com
4
+ * Date: 08/01/14
5
+ */
6
+
7
+ require_once Mage::getModuleDir('controllers', 'Mage_Adminhtml').DS.'CacheController.php';
8
+
9
+ class Nexcessnet_Turpentine_Adminhtml_CacheController extends Mage_Adminhtml_CacheController
10
+ {
11
+
12
+ /**
13
+ * Mass action for cache enabeling
14
+ */
15
+ public function massEnableAction()
16
+ {
17
+ $types = $this->getRequest()->getParam('types');
18
+ $allTypes = Mage::app()->useCache();
19
+
20
+ $updatedTypes = 0;
21
+ foreach ($types as $code) {
22
+ if (empty($allTypes[$code])) {
23
+ $allTypes[$code] = 1;
24
+ $updatedTypes++;
25
+ }
26
+ }
27
+ if ($updatedTypes > 0) {
28
+ // disable FPC when Varnish cache is enabled:
29
+ if($allTypes['turpentine_pages']==1 || $allTypes['turpentine_esi_blocks']==1)
30
+ {
31
+ $allTypes['full_page'] = 0;
32
+ Mage::getSingleton('core/session')->addSuccess(Mage::helper('adminhtml')->__("Full page cache has been disabled since Varnish cache is enabled."));
33
+ } else if ($allTypes['full_page']==1) {
34
+ Mage::getSingleton('core/session')->addSuccess(Mage::helper('adminhtml')->__("Turpentine cache has been disabled since Full Page cache is enabled."));
35
+ }
36
+ // disable FPC when Varnish cache is enabled.
37
+ Mage::app()->saveUseCache($allTypes);
38
+ $this->_getSession()->addSuccess(Mage::helper('adminhtml')->__("%s cache type(s) enabled.", $updatedTypes));
39
+ }
40
+ $this->_redirect('*/*');
41
+ }
42
+
43
+ }
app/code/community/Nexcessnet/Turpentine/controllers/EsiController.php CHANGED
@@ -66,7 +66,7 @@ class Nexcessnet_Turpentine_EsiController extends Mage_Core_Controller_Front_Act
66
  $esiDataHmac = $req->getParam( $esiHelper->getEsiHmacParam() );
67
  $esiDataParamValue = $req->getParam( $esiHelper->getEsiDataParam() );
68
  if( $esiDataHmac !== ( $hmac = $dataHelper->getHmac( $esiDataParamValue ) ) ) {
69
- $debugHelper->logWarn( 'ESI data HMAC mismatch, expected (%s) but recieved (%s)',
70
  $hmac, $esiDataHmac );
71
  $resp->setHttpResponseCode( 500 );
72
  $resp->setBody( 'ESI data is not valid' );
66
  $esiDataHmac = $req->getParam( $esiHelper->getEsiHmacParam() );
67
  $esiDataParamValue = $req->getParam( $esiHelper->getEsiDataParam() );
68
  if( $esiDataHmac !== ( $hmac = $dataHelper->getHmac( $esiDataParamValue ) ) ) {
69
+ $debugHelper->logWarn( 'ESI data HMAC mismatch, expected (%s) but received (%s)',
70
  $hmac, $esiDataHmac );
71
  $resp->setHttpResponseCode( 500 );
72
  $resp->setBody( 'ESI data is not valid' );
app/code/community/Nexcessnet/Turpentine/etc/config.xml CHANGED
@@ -20,7 +20,7 @@
20
  <config>
21
  <modules>
22
  <Nexcessnet_Turpentine>
23
- <version>0.6.1</version>
24
  </Nexcessnet_Turpentine>
25
  </modules>
26
  <default>
@@ -29,12 +29,17 @@
29
  <auto_apply_on_save>1</auto_apply_on_save>
30
  <strip_vcl_whitespace>always</strip_vcl_whitespace>
31
  <varnish_debug>0</varnish_debug>
 
32
  <block_debug>0</block_debug>
33
  <ajax_messages>1</ajax_messages>
34
  <fix_product_toolbar>0</fix_product_toolbar>
35
  <crawler_enable>0</crawler_enable>
36
  <crawler_debug>0</crawler_debug>
37
  </general>
 
 
 
 
38
  <servers>
39
  <version>auto</version>
40
  <server_list>127.0.0.1:6082</server_list>
@@ -69,6 +74,7 @@
69
  </urls>
70
  <params>
71
  <get_params>__SID,XDEBUG_PROFILE</get_params>
 
72
  </params>
73
  <static>
74
  <force_static>1</force_static>
@@ -116,6 +122,20 @@
116
  </rewrite>
117
  </core>
118
  -->
 
 
 
 
 
 
 
 
 
 
 
 
 
 
119
  </blocks>
120
  <helpers>
121
  <turpentine>
@@ -126,6 +146,11 @@
126
  <turpentine>
127
  <class>Nexcessnet_Turpentine_Model</class>
128
  </turpentine>
 
 
 
 
 
129
  </models>
130
  <cache>
131
  <types>
@@ -210,6 +235,22 @@
210
  </turpentine_esi_controller_action_layout_generate_blocks_after>
211
  </observers>
212
  </controller_action_layout_generate_blocks_after>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
213
  <!--
214
  Magento sometimes sees the last URL as being the
215
  turpentine/esi/getBlock url, and then redirects to it which is not
@@ -311,6 +352,15 @@
311
  </turpentine_varnish_cms_page_save_commit_after>
312
  </observers>
313
  </cms_page_save_commit_after>
 
 
 
 
 
 
 
 
 
314
  <adminhtml_cache_flush_system>
315
  <observers>
316
  <turpentine_varnish_adminhtml_cache_flush_system>
@@ -367,6 +417,40 @@
367
  </turpentine_esi>
368
  </updates>
369
  </layout>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
370
  </frontend>
371
  <admin>
372
  <routers>
20
  <config>
21
  <modules>
22
  <Nexcessnet_Turpentine>
23
+ <version>0.6.3</version>
24
  </Nexcessnet_Turpentine>
25
  </modules>
26
  <default>
29
  <auto_apply_on_save>1</auto_apply_on_save>
30
  <strip_vcl_whitespace>always</strip_vcl_whitespace>
31
  <varnish_debug>0</varnish_debug>
32
+ <vcl_fix>1</vcl_fix>
33
  <block_debug>0</block_debug>
34
  <ajax_messages>1</ajax_messages>
35
  <fix_product_toolbar>0</fix_product_toolbar>
36
  <crawler_enable>0</crawler_enable>
37
  <crawler_debug>0</crawler_debug>
38
  </general>
39
+ <logging>
40
+ <use_custom_log_file>0</use_custom_log_file>
41
+ <custom_log_file_name>turpentine.log</custom_log_file_name>
42
+ </logging>
43
  <servers>
44
  <version>auto</version>
45
  <server_list>127.0.0.1:6082</server_list>
74
  </urls>
75
  <params>
76
  <get_params>__SID,XDEBUG_PROFILE</get_params>
77
+ <ignore_get_params>utm_source,utm_medium,utm_campaign,utm_content,utm_term,gclid,cx,ie,cof,siteurl</ignore_get_params>
78
  </params>
79
  <static>
80
  <force_static>1</force_static>
122
  </rewrite>
123
  </core>
124
  -->
125
+ <!--
126
+ Rewrite the poll ActivePoll block, as it uses its own custom
127
+ template setting methods.
128
+ -->
129
+ <poll>
130
+ <rewrite>
131
+ <activePoll>Nexcessnet_Turpentine_Block_Poll_ActivePoll</activePoll>
132
+ </rewrite>
133
+ </poll>
134
+ <adminhtml>
135
+ <rewrite>
136
+ <cache_grid>Nexcessnet_Turpentine_Block_Adminhtml_Cache_Grid</cache_grid>
137
+ </rewrite>
138
+ </adminhtml>
139
  </blocks>
140
  <helpers>
141
  <turpentine>
146
  <turpentine>
147
  <class>Nexcessnet_Turpentine_Model</class>
148
  </turpentine>
149
+ <core>
150
+ <rewrite>
151
+ <session>Nexcessnet_Turpentine_Model_Core_Session</session>
152
+ </rewrite>
153
+ </core>
154
  </models>
155
  <cache>
156
  <types>
235
  </turpentine_esi_controller_action_layout_generate_blocks_after>
236
  </observers>
237
  </controller_action_layout_generate_blocks_after>
238
+ <customer_login>
239
+ <observers>
240
+ <turpentine_customer_login_cookie>
241
+ <class>turpentine/observer_esi</class>
242
+ <method>setCustomerGroupCookie</method>
243
+ </turpentine_customer_login_cookie>
244
+ </observers>
245
+ </customer_login>
246
+ <customer_logout>
247
+ <observers>
248
+ <turpentine_customer_logout_remove_cookie>
249
+ <class>turpentine/observer_esi</class>
250
+ <method>removeCustomerGroupCookie</method>
251
+ </turpentine_customer_logout_remove_cookie>
252
+ </observers>
253
+ </customer_logout>
254
  <!--
255
  Magento sometimes sees the last URL as being the
256
  turpentine/esi/getBlock url, and then redirects to it which is not
352
  </turpentine_varnish_cms_page_save_commit_after>
353
  </observers>
354
  </cms_page_save_commit_after>
355
+ <enterprise_cms_revision_save_commit_after>
356
+ <observers>
357
+ <turpentine_varnish_enterprise_cms_revision_save_commit_after>
358
+ <class>turpentine/observer_ban</class>
359
+ <method>banCmsPageRevisionCache</method>
360
+ <type>singleton</type>
361
+ </turpentine_varnish_enterprise_cms_revision_save_commit_after>
362
+ </observers>
363
+ </enterprise_cms_revision_save_commit_after>
364
  <adminhtml_cache_flush_system>
365
  <observers>
366
  <turpentine_varnish_adminhtml_cache_flush_system>
417
  </turpentine_esi>
418
  </updates>
419
  </layout>
420
+ <events>
421
+ <controller_action_predispatch>
422
+ <observers>
423
+ <controller_action_before>
424
+ <class>turpentine/observer_esi</class>
425
+ <method>hookToControllerActionPreDispatch</method>
426
+ </controller_action_before>
427
+ </observers>
428
+ </controller_action_predispatch>
429
+ <!--controller_action_postdispatch>
430
+ <observers>
431
+ <controller_action_after>
432
+ <class>turpentine/observer_esi</class>
433
+ <method>hookToControllerActionPostDispatch</method>
434
+ </controller_action_after>
435
+ </observers>
436
+ </controller_action_postdispatch-->
437
+ <add_to_cart_before>
438
+ <observers>
439
+ <add_to_cart_before>
440
+ <class>turpentine/observer_esi</class>
441
+ <method>hookToAddToCartBefore</method>
442
+ </add_to_cart_before>
443
+ </observers>
444
+ </add_to_cart_before>
445
+ <!--add_to_cart_after>
446
+ <observers>
447
+ <add_to_cart_after>
448
+ <class>turpentine/observer_esi</class>
449
+ <method>hookToAddToCartAfter</method>
450
+ </add_to_cart_after>
451
+ </observers>
452
+ </add_to_cart_after-->
453
+ </events>
454
  </frontend>
455
  <admin>
456
  <routers>
app/code/community/Nexcessnet/Turpentine/etc/system.xml CHANGED
@@ -62,6 +62,16 @@
62
  <show_in_website>0</show_in_website>
63
  <show_in_store>0</show_in_store>
64
  </strip_vcl_whitespace>
 
 
 
 
 
 
 
 
 
 
65
  <varnish_debug translate="label" module="turpentine">
66
  <label>Enable Debug Info</label>
67
  <comment>It is a major security vulnerability, to leave this enabled on production sites</comment>
@@ -124,6 +134,37 @@
124
  </crawler_debug>
125
  </fields>
126
  </general>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
127
  <servers translate="label" module="turpentine">
128
  <label>Servers</label>
129
  <frontend_type>text</frontend_type>
@@ -305,6 +346,24 @@
305
  <show_in_website>0</show_in_website>
306
  <show_in_store>0</show_in_store>
307
  </host_target>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
308
  </fields>
309
  </normalization>
310
  <ttls translate="label" module="turpentine">
@@ -400,8 +459,17 @@
400
  <sort_order>10</sort_order>
401
  <show_in_default>1</show_in_default>
402
  <show_in_website>0</show_in_website>
403
- <show_in_store>0</show_in_store>
404
  </get_params>
 
 
 
 
 
 
 
 
 
405
  </fields>
406
  </params>
407
  <static translate="label" module="turpentine">
62
  <show_in_website>0</show_in_website>
63
  <show_in_store>0</show_in_store>
64
  </strip_vcl_whitespace>
65
+ <vcl_fix translate="label comment">
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>
134
  </crawler_debug>
135
  </fields>
136
  </general>
137
+ <logging translate="label" module="turpentine">
138
+ <label>Logging</label>
139
+ <sort_order>15</sort_order>
140
+ <show_in_default>1</show_in_default>
141
+ <show_in_website>0</show_in_website>
142
+ <show_in_store>0</show_in_store>
143
+ <fields>
144
+ <use_custom_log_file translate="label,comment" module="turpentine">
145
+ <label>Use custom log file</label>
146
+ <comment>Log to custom log file rather than system.log</comment>
147
+ <frontend_type>select</frontend_type>
148
+ <source_model>turpentine/config_select_toggle</source_model>
149
+ <sort_order>10</sort_order>
150
+ <show_in_default>1</show_in_default>
151
+ <show_in_website>0</show_in_website>
152
+ <show_in_store>0</show_in_store>
153
+ </use_custom_log_file>
154
+ <custom_log_file_name translate="label,comment" module="turpentine">
155
+ <label>Custom log file name</label>
156
+ <frontend_type>text</frontend_type>
157
+ <sort_order>20</sort_order>
158
+ <comment>Only enter a file name, no paths.</comment>
159
+ <show_in_default>1</show_in_default>
160
+ <show_in_website>0</show_in_website>
161
+ <show_in_store>0</show_in_store>
162
+ <depends>
163
+ <use_custom_log_file>1</use_custom_log_file>
164
+ </depends>
165
+ </custom_log_file_name>
166
+ </fields>
167
+ </logging>
168
  <servers translate="label" module="turpentine">
169
  <label>Servers</label>
170
  <frontend_type>text</frontend_type>
346
  <show_in_website>0</show_in_website>
347
  <show_in_store>0</show_in_store>
348
  </host_target>
349
+ <cookie_regex translate="label" module="turpentine">
350
+ <label>Normalize Cookie Regex</label>
351
+ <comment>Cookie regex to match to override initial cookie domain</comment>
352
+ <frontend_type>text</frontend_type>
353
+ <sort_order>50</sort_order>
354
+ <show_in_default>1</show_in_default>
355
+ <show_in_website>0</show_in_website>
356
+ <show_in_store>0</show_in_store>
357
+ </cookie_regex>
358
+ <cookie_target translate="label" module="turpentine">
359
+ <label>Normalized Cookie Target</label>
360
+ <comment>Domain to force cookies to which the regex matches</comment>
361
+ <frontend_type>text</frontend_type>
362
+ <sort_order>60</sort_order>
363
+ <show_in_default>1</show_in_default>
364
+ <show_in_website>0</show_in_website>
365
+ <show_in_store>0</show_in_store>
366
+ </cookie_target>
367
  </fields>
368
  </normalization>
369
  <ttls translate="label" module="turpentine">
459
  <sort_order>10</sort_order>
460
  <show_in_default>1</show_in_default>
461
  <show_in_website>0</show_in_website>
462
+ <show_in_store>0</show_in_store>
463
  </get_params>
464
+ <ignore_get_params translate="label" module="turpentine">
465
+ <label>Ignore GET Parameters</label>
466
+ <comment>Comma-separated list of GET variables that will be ignored for caching</comment>
467
+ <frontend_type>textarea</frontend_type>
468
+ <sort_order>20</sort_order>
469
+ <show_in_default>1</show_in_default>
470
+ <show_in_website>0</show_in_website>
471
+ <show_in_store>0</show_in_store>
472
+ </ignore_get_params>
473
  </fields>
474
  </params>
475
  <static translate="label" module="turpentine">
app/code/community/Nexcessnet/Turpentine/misc/version-2.vcl CHANGED
@@ -105,11 +105,19 @@ sub vcl_recv {
105
  set req.http.X-Opt-Force-Static-Caching = "{{force_cache_static}}";
106
  set req.http.X-Opt-Enable-Get-Excludes = "{{enable_get_excludes}}";
107
 
 
 
 
 
 
 
 
 
108
  # We only deal with GET and HEAD by default
109
  # we test this here instead of inside the url base regex section
110
  # so we can disable caching for the entire site if needed
111
  if (req.http.X-Opt-Enable-Caching != "true" || req.http.Authorization ||
112
- !(req.request ~ "^(GET|HEAD)$") ||
113
  req.http.Cookie ~ "varnish_bypass={{secret_handshake}}") {
114
  return (pipe);
115
  }
@@ -117,10 +125,6 @@ sub vcl_recv {
117
  # remove double slashes from the URL, for higher cache hit rate
118
  set req.url = regsuball(req.url, "(.*)//+(.*)", "\1/\2");
119
 
120
- {{normalize_encoding}}
121
- {{normalize_user_agent}}
122
- {{normalize_host}}
123
-
124
  # check if the request is for part of magento
125
  if (req.url ~ "{{url_base_regex}}") {
126
  # set this so Turpentine can see the request passed through Varnish
@@ -188,11 +192,12 @@ sub vcl_recv {
188
  req.url ~ "(?:[?&](?:{{get_param_excludes}})(?=[&=]|$))") {
189
  return (pass);
190
  }
191
- if (req.url ~ "[?&](utm_source|utm_medium|utm_campaign|gclid|cx|ie|cof|siteurl)=") {
192
- # Strip out Google related parameters
193
- set req.url = regsuball(req.url, "(?:(\?)?|&)(?:utm_source|utm_medium|utm_campaign|gclid|cx|ie|cof|siteurl)=[^&]+", "\1");
194
  set req.url = regsuball(req.url, "(?:(\?)&|\?$)", "\1");
195
  }
 
196
 
197
  return (lookup);
198
  }
@@ -240,6 +245,12 @@ sub vcl_hash {
240
  set req.hash += regsub(req.http.Cookie, "^.*?frontend=([^;]*);*.*$", "\1");
241
  {{advanced_session_validation}}
242
  }
 
 
 
 
 
 
243
  return (hash);
244
  }
245
 
105
  set req.http.X-Opt-Force-Static-Caching = "{{force_cache_static}}";
106
  set req.http.X-Opt-Enable-Get-Excludes = "{{enable_get_excludes}}";
107
 
108
+ # Normalize request data before potentially sending things off to the
109
+ # backend. This ensures all request types get the same information, most
110
+ # notably POST requests getting a normalized user agent string to empower
111
+ # adaptive designs.
112
+ {{normalize_encoding}}
113
+ {{normalize_user_agent}}
114
+ {{normalize_host}}
115
+
116
  # We only deal with GET and HEAD by default
117
  # we test this here instead of inside the url base regex section
118
  # so we can disable caching for the entire site if needed
119
  if (req.http.X-Opt-Enable-Caching != "true" || req.http.Authorization ||
120
+ !(req.request ~ "^(GET|HEAD|OPTIONS)$") ||
121
  req.http.Cookie ~ "varnish_bypass={{secret_handshake}}") {
122
  return (pipe);
123
  }
125
  # remove double slashes from the URL, for higher cache hit rate
126
  set req.url = regsuball(req.url, "(.*)//+(.*)", "\1/\2");
127
 
 
 
 
 
128
  # check if the request is for part of magento
129
  if (req.url ~ "{{url_base_regex}}") {
130
  # set this so Turpentine can see the request passed through Varnish
192
  req.url ~ "(?:[?&](?:{{get_param_excludes}})(?=[&=]|$))") {
193
  return (pass);
194
  }
195
+ if ({{enable_get_ignored}} && req.url ~ "[?&]({{get_param_ignored}})=") {
196
+ # Strip out ignored GET related parameters
197
+ set req.url = regsuball(req.url, "(?:(\?)?|&)(?:{{get_param_ignored}})=[^&]+", "\1");
198
  set req.url = regsuball(req.url, "(?:(\?)&|\?$)", "\1");
199
  }
200
+
201
 
202
  return (lookup);
203
  }
245
  set req.hash += regsub(req.http.Cookie, "^.*?frontend=([^;]*);*.*$", "\1");
246
  {{advanced_session_validation}}
247
  }
248
+
249
+ if (req.http.X-Varnish-Esi-Access == "customer_group" &&
250
+ req.http.Cookie ~ "customer_group=") {
251
+ set req.hash += regsub(req.http.Cookie, "^.*?customer_group=([^;]*);*.*$", "\1");
252
+ }
253
+
254
  return (hash);
255
  }
256
 
app/code/community/Nexcessnet/Turpentine/misc/version-3.vcl CHANGED
@@ -46,6 +46,7 @@ import std;
46
 
47
  ## Custom Subroutines
48
 
 
49
  sub generate_session {
50
  # generate a UUID and add `frontend=$UUID` to the Cookie header, or use SID
51
  # from SID URL param
@@ -72,7 +73,7 @@ sub generate_session {
72
  } else {
73
  set req.http.Cookie = req.http.X-Varnish-Faked-Session;
74
  }
75
- }
76
 
77
  sub generate_session_expires {
78
  # sets X-Varnish-Cookie-Expires to now + esi_private_ttl in format:
@@ -92,7 +93,7 @@ sub generate_session_expires {
92
  );
93
  }C
94
  }
95
-
96
  ## Varnish Subroutines
97
 
98
  sub vcl_recv {
@@ -106,21 +107,25 @@ sub vcl_recv {
106
  }
107
  }
108
 
 
 
 
 
 
 
 
 
109
  # We only deal with GET and HEAD by default
110
  # we test this here instead of inside the url base regex section
111
  # so we can disable caching for the entire site if needed
112
  if (!{{enable_caching}} || req.http.Authorization ||
113
- req.request !~ "^(GET|HEAD)$" ||
114
  req.http.Cookie ~ "varnish_bypass={{secret_handshake}}") {
115
  return (pipe);
116
  }
117
 
118
  # remove double slashes from the URL, for higher cache hit rate
119
- set req.url = regsuball(req.url, "(.*)//+(.*)", "\1/\2");
120
-
121
- {{normalize_encoding}}
122
- {{normalize_user_agent}}
123
- {{normalize_host}}
124
 
125
  # check if the request is for part of magento
126
  if (req.url ~ "{{url_base_regex}}") {
@@ -153,15 +158,20 @@ sub vcl_recv {
153
  error 403 "External ESI requests are not allowed";
154
  }
155
  }
156
- # no frontend cookie was sent to us
157
- if (req.http.Cookie !~ "frontend=") {
 
 
 
 
158
  if (client.ip ~ crawler_acl ||
159
  req.http.User-Agent ~ "^(?:{{crawler_user_agent_regex}})$") {
160
  # it's a crawler, give it a fake cookie
161
  set req.http.Cookie = "frontend=crawler-session";
162
  } else {
163
  # it's a real user, make up a new session for them
164
- call generate_session;
 
165
  }
166
  }
167
  if ({{force_cache_static}} &&
@@ -186,12 +196,13 @@ sub vcl_recv {
186
  # TODO: should this be pass or pipe?
187
  return (pass);
188
  }
189
- if (req.url ~ "[?&](utm_source|utm_medium|utm_campaign|gclid|cx|ie|cof|siteurl)=") {
190
- # Strip out Google related parameters
191
- set req.url = regsuball(req.url, "(?:(\?)?|&)(?:utm_source|utm_medium|utm_campaign|gclid|cx|ie|cof|siteurl)=[^&]+", "\1");
192
  set req.url = regsuball(req.url, "(?:(\?)&|\?$)", "\1");
193
  }
194
 
 
195
  # everything else checks out, try and pull from the cache
196
  return (lookup);
197
  }
@@ -237,6 +248,12 @@ sub vcl_hash {
237
  {{advanced_session_validation}}
238
 
239
  }
 
 
 
 
 
 
240
  return (hash);
241
  }
242
 
@@ -336,12 +353,25 @@ sub vcl_fetch {
336
  sub vcl_deliver {
337
  if (req.http.X-Varnish-Faked-Session) {
338
  # need to set the set-cookie header since we just made it out of thin air
339
- call generate_session_expires;
 
340
  set resp.http.Set-Cookie = req.http.X-Varnish-Faked-Session +
341
  "; expires=" + resp.http.X-Varnish-Cookie-Expires + "; path=/";
342
  if (req.http.Host) {
343
- set resp.http.Set-Cookie = resp.http.Set-Cookie +
 
 
344
  "; domain=" + regsub(req.http.Host, ":\d+$", "");
 
 
 
 
 
 
 
 
 
 
345
  }
346
  set resp.http.Set-Cookie = resp.http.Set-Cookie + "; httponly";
347
  unset resp.http.X-Varnish-Cookie-Expires;
46
 
47
  ## Custom Subroutines
48
 
49
+ {{generate_session_start}}
50
  sub generate_session {
51
  # generate a UUID and add `frontend=$UUID` to the Cookie header, or use SID
52
  # from SID URL param
73
  } else {
74
  set req.http.Cookie = req.http.X-Varnish-Faked-Session;
75
  }
76
+ }
77
 
78
  sub generate_session_expires {
79
  # sets X-Varnish-Cookie-Expires to now + esi_private_ttl in format:
93
  );
94
  }C
95
  }
96
+ {{generate_session_end}}
97
  ## Varnish Subroutines
98
 
99
  sub vcl_recv {
107
  }
108
  }
109
 
110
+ # Normalize request data before potentially sending things off to the
111
+ # backend. This ensures all request types get the same information, most
112
+ # notably POST requests getting a normalized user agent string to empower
113
+ # adaptive designs.
114
+ {{normalize_encoding}}
115
+ {{normalize_user_agent}}
116
+ {{normalize_host}}
117
+
118
  # We only deal with GET and HEAD by default
119
  # we test this here instead of inside the url base regex section
120
  # so we can disable caching for the entire site if needed
121
  if (!{{enable_caching}} || req.http.Authorization ||
122
+ req.request !~ "^(GET|HEAD|OPTIONS)$" ||
123
  req.http.Cookie ~ "varnish_bypass={{secret_handshake}}") {
124
  return (pipe);
125
  }
126
 
127
  # remove double slashes from the URL, for higher cache hit rate
128
+ set req.url = regsuball(req.url, "([^:])//+", "\1/");
 
 
 
 
129
 
130
  # check if the request is for part of magento
131
  if (req.url ~ "{{url_base_regex}}") {
158
  error 403 "External ESI requests are not allowed";
159
  }
160
  }
161
+ # if host is not allowed in magento pass to backend
162
+ if (req.http.host !~ "{{allowed_hosts_regex}}") {
163
+ return (pass);
164
+ }
165
+ # no frontend cookie was sent to us AND this is not an ESI or AJAX call
166
+ if (req.http.Cookie !~ "frontend=" && !req.http.X-Varnish-Esi-Method) {
167
  if (client.ip ~ crawler_acl ||
168
  req.http.User-Agent ~ "^(?:{{crawler_user_agent_regex}})$") {
169
  # it's a crawler, give it a fake cookie
170
  set req.http.Cookie = "frontend=crawler-session";
171
  } else {
172
  # it's a real user, make up a new session for them
173
+ {{generate_session}}# call generate_session;
174
+ return (pipe);
175
  }
176
  }
177
  if ({{force_cache_static}} &&
196
  # TODO: should this be pass or pipe?
197
  return (pass);
198
  }
199
+ if ({{enable_get_ignored}} && req.url ~ "[?&]({{get_param_ignored}})=") {
200
+ # Strip out Ignored GET parameters
201
+ set req.url = regsuball(req.url, "(?:(\?)?|&)(?:{{get_param_ignored}})=[^&]+", "\1");
202
  set req.url = regsuball(req.url, "(?:(\?)&|\?$)", "\1");
203
  }
204
 
205
+
206
  # everything else checks out, try and pull from the cache
207
  return (lookup);
208
  }
248
  {{advanced_session_validation}}
249
 
250
  }
251
+
252
+ if (req.http.X-Varnish-Esi-Access == "customer_group" &&
253
+ req.http.Cookie ~ "customer_group=") {
254
+ hash_data(regsub(req.http.Cookie, "^.*?customer_group=([^;]*);*.*$", "\1"));
255
+ }
256
+
257
  return (hash);
258
  }
259
 
353
  sub vcl_deliver {
354
  if (req.http.X-Varnish-Faked-Session) {
355
  # need to set the set-cookie header since we just made it out of thin air
356
+ # call generate_session_expires;
357
+ {{generate_session_expires}}
358
  set resp.http.Set-Cookie = req.http.X-Varnish-Faked-Session +
359
  "; expires=" + resp.http.X-Varnish-Cookie-Expires + "; path=/";
360
  if (req.http.Host) {
361
+ if (req.http.User-Agent ~ "^(?:{{crawler_user_agent_regex}})$") {
362
+ # it's a crawler, no need to share cookies
363
+ set resp.http.Set-Cookie = resp.http.Set-Cookie +
364
  "; domain=" + regsub(req.http.Host, ":\d+$", "");
365
+ } else {
366
+ # it's a real user, allow sharing of cookies between stores
367
+ if(req.http.Host ~ "{{normalize_cookie_regex}}") {
368
+ set resp.http.Set-Cookie = resp.http.Set-Cookie +
369
+ "; domain={{normalize_cookie_target}}";
370
+ } else {
371
+ set resp.http.Set-Cookie = resp.http.Set-Cookie +
372
+ "; domain=" + regsub(req.http.Host, ":\d+$", "");
373
+ }
374
+ }
375
  }
376
  set resp.http.Set-Cookie = resp.http.Set-Cookie + "; httponly";
377
  unset resp.http.X-Varnish-Cookie-Expires;
app/code/local/Mage/Core/Model/Session.php DELETED
@@ -1,69 +0,0 @@
1
- <?php
2
- /**
3
- * Magento
4
- *
5
- * NOTICE OF LICENSE
6
- *
7
- * This source file is subject to the Open Software License (OSL 3.0)
8
- * that is bundled with this package in the file LICENSE.txt.
9
- * It is also available through the world-wide-web at this URL:
10
- * http://opensource.org/licenses/osl-3.0.php
11
- * If you did not receive a copy of the license and are unable to
12
- * obtain it through the world-wide-web, please send an email
13
- * to license@magentocommerce.com so we can send you a copy immediately.
14
- *
15
- * DISCLAIMER
16
- *
17
- * Do not edit or add to this file if you wish to upgrade Magento to newer
18
- * versions in the future. If you wish to customize Magento for your
19
- * needs please refer to http://www.magentocommerce.com for more information.
20
- *
21
- * @category Mage
22
- * @package Mage_Core
23
- * @copyright Copyright (c) 2013 Magento Inc. (http://www.magentocommerce.com)
24
- * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
25
- */
26
-
27
-
28
- /**
29
- * Core session model
30
- *
31
- * @todo extend from Mage_Core_Model_Session_Abstract
32
- *
33
- * @method null|bool getCookieShouldBeReceived()
34
- * @method Mage_Core_Model_Session setCookieShouldBeReceived(bool $flag)
35
- * @method Mage_Core_Model_Session unsCookieShouldBeReceived()
36
- */
37
- class Mage_Core_Model_Session extends Mage_Core_Model_Session_Abstract
38
- {
39
- public function __construct($data=array())
40
- {
41
- $name = isset($data['name']) ? $data['name'] : null;
42
- $this->init('core', $name);
43
- }
44
-
45
- /**
46
- * Retrieve Session Form Key
47
- *
48
- * @return string A 16 bit unique key for forms
49
- */
50
- public function getFormKey()
51
- {
52
- if (Mage::registry('replace_form_key') &&
53
- !Mage::app()->getRequest()->getParam('form_key', false)) {
54
- // flag request for ESI processing
55
- Mage::register('turpentine_esi_flag', true, true);
56
- return '{{form_key_esi_placeholder}}';
57
- } else {
58
- return $this->real_getFormKey();
59
- }
60
- }
61
-
62
- public function real_getFormKey()
63
- {
64
- if (!$this->getData('_form_key')) {
65
- $this->setData('_form_key', Mage::helper('core')->getRandomString(16));
66
- }
67
- return $this->getData('_form_key');
68
- }
69
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/design/adminhtml/default/default/template/turpentine/varnish_management.phtml DELETED
@@ -1,119 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Nexcess.net Turpentine Extension for Magento
5
- * Copyright (C) 2012 Nexcess.net L.L.C.
6
- *
7
- * This program is free software; you can redistribute it and/or modify
8
- * it under the terms of the GNU General Public License as published by
9
- * the Free Software Foundation; either version 2 of the License, or
10
- * (at your option) any later version.
11
- *
12
- * This program is distributed in the hope that it will be useful,
13
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
- * GNU General Public License for more details.
16
- *
17
- * You should have received a copy of the GNU General Public License along
18
- * with this program; if not, write to the Free Software Foundation, Inc.,
19
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20
- */
21
-
22
- ?>
23
- <br />
24
- <div class="content-header">
25
- <table cellspacing="0">
26
- <tr>
27
- <td>
28
- <h3><?php echo Mage::helper( 'turpentine/data' )
29
- ->__('Varnish Management') ?></h3>
30
- </td>
31
- <td class="form-buttons"></td>
32
- </tr>
33
- </table>
34
- </div>
35
- <table class="form-list varnish-management">
36
- <tr>
37
- <td class="scope-label">
38
- <button
39
- onclick="setLocation('<?php echo $this->getApplyConfigUrl()?>')"
40
- type="button"
41
- class="scalable save">
42
- <span><?php echo Mage::helper( 'turpentine/data' )
43
- ->__('Apply Varnish Config') ?></span>
44
- </button>
45
- </td>
46
- <td class="scope-label">
47
- <?php echo Mage::helper( 'turpentine/data' )
48
- ->__('Update the VCL configuration on the running Varnish instances')?>
49
- </td>
50
- </tr>
51
- <tr>
52
- <td class="scope-label">
53
- <button
54
- onclick="setLocation('<?php echo $this->getSaveConfigUrl()?>')"
55
- type="button"
56
- class="scalable save">
57
- <span><?php echo Mage::helper( 'turpentine/data' )
58
- ->__('Save Varnish Config') ?></span>
59
- </button>
60
- </td>
61
- <td class="scope-label">
62
- <?php echo Mage::helper( 'turpentine/data' )
63
- ->__('Save the configuration to a VCL file.')?>
64
- </td>
65
- </tr>
66
- <tr>
67
- <td class="scope-label">
68
- <button
69
- onclick="setLocation('<?php echo $this->getGetConfigUrl()?>')"
70
- type="button"
71
- class="scalable">
72
- <span><?php echo Mage::helper( 'turpentine/data' )
73
- ->__('Download Varnish Config') ?></span>
74
- </button>
75
- </td>
76
- <td class="scope-label">
77
- <?php echo Mage::helper( 'turpentine/data' )
78
- ->__('Download the generated VCL file.')?>
79
- </td>
80
- </tr>
81
- <tr>
82
- <?php if( Mage::helper( 'turpentine/varnish' )->isBypassEnabled() ): ?>
83
- <td class="scope-label">
84
- <button
85
- onclick="setLocation('<?php echo $this->getSwitchNavigationUrl( 'varnish' ); ?>')"
86
- type="button"
87
- class="scalable back">
88
- <span><?php echo Mage::helper( 'turpentine/data' )
89
- ->__('Deactivate Varnish Bypass') ?></span>
90
- </button>
91
- </td>
92
- <td class="scope-label">
93
- <?php echo Mage::helper( 'turpentine/data' )
94
- ->__('Remove the bypass cookie and use again Varnish.')?>
95
- </td>
96
- <?php else: ?>
97
- <td class="scope-label">
98
- <button
99
- onclick="setLocation('<?php echo $this->getSwitchNavigationUrl( 'default' ); ?>')"
100
- type="button"
101
- class="scalable delete">
102
- <span><?php echo Mage::helper( 'turpentine/data' )
103
- ->__('Activate Varnish Bypass') ?></span>
104
- </button>
105
- </td>
106
- <td class="scope-label">
107
- <?php echo Mage::helper( 'turpentine/data' )
108
- ->__('Create a cookie to bypass Varnish only for your session.')?>
109
- </td>
110
- <?php endif; ?>
111
- </tr>
112
- </table>
113
- <?php echo $this->getChildHtml(); ?>
114
-
115
- <style>
116
- .varnish-management button {
117
- width: 190px;
118
- }
119
- </style>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/design/frontend/base/default/layout/turpentine_esi.xml CHANGED
@@ -96,6 +96,7 @@
96
  <action method="setEsiOptions">
97
  <params>
98
  <access>private</access>
 
99
  <flush_events>
100
  <poll_vote_add/>
101
  </flush_events>
@@ -177,6 +178,39 @@
177
  -->
178
  </catalog_product_compare_index>
179
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
180
 
181
  <!-- Checkout -->
182
 
96
  <action method="setEsiOptions">
97
  <params>
98
  <access>private</access>
99
+ <method>ajax</method>
100
  <flush_events>
101
  <poll_vote_add/>
102
  </flush_events>
178
  -->
179
  </catalog_product_compare_index>
180
 
181
+ <!-- Catalog Search -->
182
+
183
+ <!--
184
+ If the search input box is inside the header, it needs to contain the current search string after searching.
185
+ The block below overrules the ESI Options for the header on the search results page.
186
+ We change the scope of the header to "page", so the current URL is passed to the ESI request.
187
+ We set the TTL to 0, because the same user is probably not going to search for the same string again.
188
+ -->
189
+ <catalogsearch_result_index>
190
+ <reference name="header">
191
+ <action method="setEsiOptions">
192
+ <params>
193
+ <access>private</access>
194
+ <scope>page</scope>
195
+ <ttl>0</ttl>
196
+ </params>
197
+ </action>
198
+ </reference>
199
+ </catalogsearch_result_index>
200
+
201
+ <!-- fixes issues with 'recently viewed products' in CE 1.9's RWD theme -->
202
+ <catalog_category_layered_nochildren>
203
+ <reference name="left.reports.product.viewed">
204
+ <action method="setEsiOptions">
205
+ <params>
206
+ <access>private</access>
207
+ <flush_events>
208
+ <catalog_controller_product_view/>
209
+ </flush_events>
210
+ </params>
211
+ </action>
212
+ </reference>
213
+ </catalog_category_layered_nochildren>
214
 
215
  <!-- Checkout -->
216
 
app/design/frontend/base/default/template/turpentine/ajax.phtml DELETED
@@ -1,81 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Nexcess.net Turpentine Extension for Magento
5
- * Copyright (C) 2012 Nexcess.net L.L.C.
6
- *
7
- * This program is free software; you can redistribute it and/or modify
8
- * it under the terms of the GNU General Public License as published by
9
- * the Free Software Foundation; either version 2 of the License, or
10
- * (at your option) any later version.
11
- *
12
- * This program is distributed in the hope that it will be useful,
13
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
- * GNU General Public License for more details.
16
- *
17
- * You should have received a copy of the GNU General Public License along
18
- * with this program; if not, write to the Free Software Foundation, Inc.,
19
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20
- */
21
-
22
- $debugEnabled = (bool)Mage::helper( 'turpentine/esi' )->getEsiDebugEnabled();
23
- $blockTag = sprintf( 'turpentine-esi-block-%s',
24
- Mage::helper( 'turpentine/data' )->secureHash( $this->getNameInLayout() ) );
25
-
26
- if( $debugEnabled ) {
27
- echo sprintf( '<!-- AJAX START [%s] -->', $this->getNameInLayout() ) . PHP_EOL;
28
- }
29
- /**
30
- * Note that the new content will be inside the "turpentine-esi-block" div
31
- * which could possible alter how things are displayed. If this turns out to
32
- * be an issue we'll have to go back to using Ajax.Request so the container
33
- * block is completely replaced which means no nice appear effect.
34
- *
35
- * @link http://prototypejs.org/doc/latest/ajax/index.html
36
- * @link http://prototypejs.org/doc/latest/ajax/Ajax/Request/index.html
37
- * @link http://prototypejs.org/doc/latest/dom/Element/replace/index.html
38
- * @link http://madrobby.github.com/scriptaculous/effect-appear/
39
- *
40
- * @link http://api.jquery.com/jQuery.ajax/
41
- * @link http://api.jquery.com/fadeIn/
42
- */
43
- $_prototypeFunction = $debugEnabled ? 'onComplete' : 'onSuccess';
44
- $_jQueryFunction = $debugEnabled ? 'always' : 'done';
45
- echo <<<HTML
46
- <div id="$blockTag" style="display: none">
47
- <script type="text/javascript">
48
- (function() {
49
- var blockTag = {$this->helper('core')->jsonEncode($blockTag)}, esiUrl = {$this->helper('core')->jsonEncode($this->getEsiUrl())};
50
- if (typeof Ajax === 'object' && typeof Ajax.Updater === 'function') {
51
- new Ajax.Updater(
52
- blockTag,
53
- esiUrl,
54
- {
55
- method: "get",
56
- evalScripts: true,
57
- {$_prototypeFunction}: function() {
58
- $(blockTag).appear({
59
- duration: 0.3
60
- });
61
- }
62
- }
63
- );
64
- } else if (typeof jQuery === 'function') {
65
- jQuery.ajax(
66
- {
67
- url: esiUrl,
68
- type: "get",
69
- dataType: "html"
70
- }
71
- ).{$_jQueryFunction}(function() {
72
- $(blockTag).fadeIn(300);
73
- });
74
- }
75
- })();
76
- </script>
77
- </div>
78
- HTML;
79
- if( $debugEnabled ) {
80
- echo sprintf( '<!-- AJAX END [%s] -->', $this->getNameInLayout() ) . PHP_EOL;
81
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/design/frontend/base/default/template/turpentine/notices.phtml DELETED
@@ -1,36 +0,0 @@
1
- <?php
2
- /**
3
- * Nexcess.net Turpentine Extension for Magento
4
- * Copyright (C) 2012 Nexcess.net L.L.C.
5
- *
6
- * This program is free software; you can redistribute it and/or modify
7
- * it under the terms of the GNU General Public License as published by
8
- * the Free Software Foundation; either version 2 of the License, or
9
- * (at your option) any later version.
10
- *
11
- * This program is distributed in the hope that it will be useful,
12
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
- * GNU General Public License for more details.
15
- *
16
- * You should have received a copy of the GNU General Public License along
17
- * with this program; if not, write to the Free Software Foundation, Inc.,
18
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19
- */
20
- ?>
21
-
22
- <?php if($this->helper( 'turpentine/varnish' )->shouldDisplayNotice()): ?>
23
- <div class="varnish-global-notice">
24
- <div class="notice-inner">
25
- <p>
26
- <strong><?php echo $this->__('The cookie that allows bypassing Varnish is present in your browser.'); ?></strong><br />
27
- <?php echo $this->__('Remember that this navigation mode should be only activated for testing. You will suffer a decline in overall performance until you delete this cookie.'); ?>
28
- </p>
29
- </div>
30
- </div>
31
- <style>
32
- .varnish-global-notice { border:1px solid #cfcfcf; border-width:0 0 1px; background:#ffff90; font-size:12px; line-height:1.25; text-align:center; color:#2f2f2f; }
33
- .varnish-global-notice .notice-inner { width:860px; margin:0 auto; padding:12px 0 12px 0px; text-align:left; }
34
- .varnish-global-notice .notice-inner p { margin:0; padding:10px; }
35
- </style>
36
- <?php endif; ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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>12:52:16</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>0a4d2675add584670af235ed2f30418a243cadde</__commit_hash><version>0.6.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="8bd4e7e4540ed816721907cb0ac03a02" name="varnish_management.phtml" /></dir></dir></dir></dir></dir><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><file hash="a587e1860ad07546bc7b1459240d3223" 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="252356c9ea115fca63e52d54f67d755f" 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="d68418bab75e0b308aeb0fda34bca2cd" name="EsiController.php" /><dir name="Varnish"><file hash="625118bfe342139b7fd9464c05d1b0a6" name="ManagementController.php" /></dir></dir><dir name="Helper"><file hash="2d7286c589b7a3e2f8fe873bd12afe3c" name="Debug.php" /><file hash="802e269b0c80131efbb070309fdc610f" name="Varnish.php" /><file hash="a31045d661a62dac444f82e44ed4f139" name="Esi.php" /><file hash="6a51baf37c84a11f877d432ac47a6f5f" name="Data.php" /><file hash="913d0762f9df7696f1217f82791f1b78" name="Cron.php" /><file hash="6b637be4eac4c924fc1f02b2d49699c3" name="Ban.php" /></dir><dir name="Model"><file hash="c2cb79001524617febbfddf099d09f37" name="Session.php" /><dir name="Observer"><file hash="9d57fad69ff42b71c66ca26bc3372317" name="Debug.php" /><file hash="7244a8ce600e980d612409595b9b6b9b" name="Varnish.php" /><file hash="f2fd1a9d421b5152dd88b8736ba9c58d" name="Esi.php" /><file hash="a34e79218e8ca1fefad303b9399bda9d" name="Cron.php" /><file hash="704cf901bd456b51c263becd0f260d64" name="Ban.php" /></dir><dir name="Dummy"><file hash="2fc1189ace2d0e7383041d16a31df16b" name="Request.php" /></dir><dir name="Config"><dir name="Select"><file hash="9348c5e58037fd97d89b84ccab4ef2d0" name="Toggle.php" /><file hash="dc472f34c25b1688cfa9fa206958c536" name="Version.php" /><file hash="2e01b14592189b3f6a8a05be5ef4c69c" name="StripWhitespace.php" /></dir></dir><dir name="PageCache"><dir name="Container"><file hash="139e8a9bfa209316036e798fff654a8a" name="Notices.php" /></dir></dir><dir name="Varnish"><file hash="f2dcb48cb4f60b8112a82b308ec7ec8b" name="Admin.php" /><dir name="Configurator"><file hash="82d0abe0123272e59e6c319dfdd4e9dc" name="Version3.php" /><file hash="b831b872fcb05d9c723149159db0eed1" name="Version2.php" /><file hash="e4a7a543cf31934f339d2ca139a42ccc" name="Abstract.php" /></dir><dir name="Admin"><file hash="c3d44d59ece358553d2cfa8f92964d39" name="Socket.php" /></dir></dir><dir name="Shim"><dir name="Mage"><dir name="Core"><file hash="821bff6c2fb372e3ffb39abf6453b3f8" name="Layout.php" /><file hash="4a1aa246373520936f0e4b5b3a3baf25" name="App.php" /><file hash="9e5d87f0aa84c9fb1541db83aba69abd" name="Config.php" /></dir></dir></dir></dir><dir name="etc"><file hash="747adeecb56525d9cc9e530ee37b85fb" name="config.xml" /><file hash="610f28a7533a5ea999ea8795874f9086" name="system.xml" /><file hash="3b608fbcca3d307833d10604dff23966" name="cache.xml" /></dir><dir name="misc"><file hash="ba5d5c7263cd90eea3785953e3549041" name="uuid.c" /><file hash="6aea8f5efa5f82dffb864c5df0cb252c" name="version-2.vcl" /><file hash="17048d1cf4967eec32e8a4a768288151" name="version-3.vcl" /></dir><dir name="Block"><file hash="e9b03d651a8da9b1d32c4fd2f4781792" name="Management.php" /><file hash="390cf75d04b1b098cad562229b649c2d" name="Notices.php" /><dir name="Core"><file hash="e7e7b84449ae8d16f0952f5258a9615e" name="Messages.php" /></dir><dir name="Catalog"><dir name="Product"><dir name="List"><file hash="ce9fca4c273987759f284fe31c1597f5" name="Toolbar.php" /></dir></dir></dir></dir><dir name="sql" /></dir></dir></target><target name="magelocal"><dir name="Mage"><dir name="Core"><dir name="Model"><file hash="4d51274ab710e722706ce78b32944fd4" name="Session.php" /></dir></dir></dir></target></contents><dependencies><required><php><min>5.2.13</min><max>6.0.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>2014-10-01</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>11:56:08</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>42cd7044e41e01bd7ebce968d6b05001838afd3a</__commit_hash><version>0.6.3</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></dir></dir><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><file hash="7b6eab8bd2e7528eafb647c3e2ba8634" name="turpentine_esi.xml" /></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="Helper"><file hash="a7d1c51e24f9d35373fc8533871120a3" name="Esi.php" /><file hash="802e269b0c80131efbb070309fdc610f" name="Varnish.php" /><file hash="913d0762f9df7696f1217f82791f1b78" name="Cron.php" /><file hash="0ee525f0fba5236f05ad2289fe2f2292" name="Data.php" /><file hash="6b637be4eac4c924fc1f02b2d49699c3" name="Ban.php" /><file hash="4a448ad2fe5b5a253a37d3f4aa3dd1bb" name="Debug.php" /></dir><dir name="misc"><file hash="7c24835522ec526d212ea98add1ceb2a" name="version-3.vcl" /><file hash="ba5d5c7263cd90eea3785953e3549041" name="uuid.c" /><file hash="6298eb180a1ae61a79b0cf929be61144" name="version-2.vcl" /></dir><dir name="etc"><file hash="6dd44a194829f6e28daa977efe324f22" name="system.xml" /><file hash="3b608fbcca3d307833d10604dff23966" name="cache.xml" /><file hash="1194d7176973fa7bcd8f6ad4c7d9b346" name="config.xml" /></dir><dir name="controllers"><file hash="3446129075986c4143e9d74d5154cf64" name="EsiController.php" /><dir name="Adminhtml"><file hash="fb44492ff908e0dd28a4fa62e382bd3e" name="CacheController.php" /></dir><dir name="Varnish"><file hash="625118bfe342139b7fd9464c05d1b0a6" name="ManagementController.php" /></dir></dir><dir name="Model"><file hash="c2cb79001524617febbfddf099d09f37" name="Session.php" /><dir name="Shim"><dir name="Mage"><dir name="Core"><file hash="9e5d87f0aa84c9fb1541db83aba69abd" name="Config.php" /><file hash="821bff6c2fb372e3ffb39abf6453b3f8" name="Layout.php" /><file hash="4a1aa246373520936f0e4b5b3a3baf25" name="App.php" /></dir></dir></dir><dir name="PageCache"><dir name="Container"><file hash="139e8a9bfa209316036e798fff654a8a" name="Notices.php" /></dir></dir><dir name="Dummy"><file hash="f6611808da53ffa00561a8f76b26016e" name="Request.php" /></dir><dir name="Varnish"><file hash="6c1a8e5e3f412bff082c6df136e5db1a" name="Admin.php" /><dir name="Admin"><file hash="c3d44d59ece358553d2cfa8f92964d39" name="Socket.php" /></dir><dir name="Configurator"><file hash="b831b872fcb05d9c723149159db0eed1" name="Version2.php" /><file hash="82d0abe0123272e59e6c319dfdd4e9dc" name="Version3.php" /><file hash="fd99025d6f79c2a2dfe5a910099b6ac6" name="Abstract.php~" /><file hash="d63b4714180cb963d81d32a3fa31e95e" name="Abstract.php" /></dir></dir><dir name="Observer"><file hash="4d97c660f6ad74162f842d5d2bfa53d7" name="Esi.php" /><file hash="7244a8ce600e980d612409595b9b6b9b" name="Varnish.php" /><file hash="a34e79218e8ca1fefad303b9399bda9d" name="Cron.php" /><file hash="5b6c57ab373444fcac7a42262f8178d5" name="Ban.php" /><file hash="9d57fad69ff42b71c66ca26bc3372317" name="Debug.php" /></dir><dir name="Core"><file hash="d4f63abc6d34c923c6e64a522b6fc36e" name="Session.php" /></dir><dir name="Config"><dir name="Select"><file hash="2e01b14592189b3f6a8a05be5ef4c69c" name="StripWhitespace.php" /><file hash="dc472f34c25b1688cfa9fa206958c536" name="Version.php" /><file hash="9348c5e58037fd97d89b84ccab4ef2d0" name="Toggle.php" /></dir></dir></dir><dir name="Block"><file hash="e9b03d651a8da9b1d32c4fd2f4781792" name="Management.php" /><file hash="390cf75d04b1b098cad562229b649c2d" name="Notices.php" /><dir name="Adminhtml"><dir name="Cache"><file hash="798cf7afa80e0a06be2b8c6cb2bef02b" name="Grid.php" /></dir></dir><dir name="Catalog"><dir name="Product"><dir name="List"><file hash="ce9fca4c273987759f284fe31c1597f5" name="Toolbar.php" /></dir></dir></dir><dir name="Core"><file hash="f9b035bb701943aa12755abdb029fa8f" name="Messages.php" /></dir><dir name="Poll"><file hash="bf9ca23a445776435e38e6c8be9976ea" name="ActivePoll.php" /></dir></dir></dir></dir></target></contents><dependencies><required><php><min>5.2.13</min><max>6.0.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>2015-07-28</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>