Changeset 838
- Timestamp:
- 11/26/05 16:22:29
- Files:
-
- trunk/cherrypy/_cphttpserver.py (modified) (1 diff)
- trunk/cherrypy/_cphttptools.py (modified) (1 diff)
- trunk/cherrypy/_cpwsgi.py (modified) (4 diffs)
- trunk/cherrypy/filters/__init__.py (modified) (2 diffs)
- trunk/cherrypy/filters/basefilter.py (modified) (1 diff)
- trunk/cherrypy/filters/cachefilter.py (modified) (2 diffs)
- trunk/cherrypy/filters/sessionfilter.py (modified) (1 diff)
- trunk/cherrypy/test/helper.py (modified) (1 diff)
- trunk/cherrypy/test/test_core.py (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/cherrypy/_cphttpserver.py
r802 r838 90 90 for chunk in response.body: 91 91 wfile.write(chunk) 92 request.close() 92 93 except: 93 94 s, h, b = _cputil.bareError() trunk/cherrypy/_cphttptools.py
r837 r838 28 28 self.scheme = scheme 29 29 self.executeMain = True 30 self.closed = False 31 32 def close(self): 33 self.closed = True 34 try: 35 applyFilters('onEndRequest') 36 cherrypy.serving.request = None 37 cherrypy.serving.response = None 38 except (KeyboardInterrupt, SystemExit): 39 raise 40 except: 41 cherrypy.log(_cputil.formatExc()) 42 43 def __del__(self): 44 if not self.closed: 45 self.close() 30 46 31 47 def run(self, requestLine, headers, rfile): trunk/cherrypy/_cpwsgi.py
r768 r838 58 58 sys.stderr = NullWriter() 59 59 60 request = None 60 61 try: 61 62 # LOGON_USER is served by IIS, and is the name of the … … 72 73 translate_headers(environ), 73 74 environ['wsgi.input']) 75 s, h, b = response.status, response.headers, response.body 76 exc = None 74 77 except (KeyboardInterrupt, SystemExit): 75 78 raise … … 81 84 s, h, b = _cputil.bareError(tb) 82 85 exc = sys.exc_info() 83 else:84 s, h, b = response.status, response.headers, response.body85 exc = None86 86 87 87 try: … … 93 93 chunk = str(chunk) 94 94 yield chunk 95 if request: 96 request.close() 95 97 except (KeyboardInterrupt, SystemExit): 96 98 raise trunk/cherrypy/filters/__init__.py
r814 r838 29 29 30 30 _input_methods = ['onStartResource', 'beforeRequestBody', 'beforeMain'] 31 _output_methods = ['beforeFinalize', 'onEndResource', 31 _output_methods = ['beforeFinalize', 'onEndResource', 'onEndRequest', 32 32 'beforeErrorResponse', 'afterErrorResponse'] 33 33 … … 50 50 'LogDebugInfoFilter' : logdebuginfofilter.LogDebugInfoFilter, 51 51 'NsgmlsFilter' : nsgmlsfilter.NsgmlsFilter, 52 'SessionAuthenticateFilter' : sessionauthenticatefilter.SessionAuthenticateFilter, 52 'SessionAuthenticateFilter': 53 sessionauthenticatefilter.SessionAuthenticateFilter, 53 54 'SessionFilter' : sessionfilter.SessionFilter, 54 55 'StaticFilter' : staticfilter.StaticFilter, trunk/cherrypy/filters/basefilter.py
r808 r838 34 34 """Called after finalizing the output (status, header, and body)""" 35 35 pass 36 37 def onEndRequest(self): 38 """Called when the server closes the request.""" 39 pass 36 40 trunk/cherrypy/filters/cachefilter.py
r837 r838 106 106 cherrypy.request.cacheable = not cacheData 107 107 if cacheData: 108 # found a hit! check the if-modified-since request header 108 109 expirationTime, lastModified, obj = cacheData 109 # found a hit! check the if-modified-since request header110 110 modifiedSince = cherrypy.request.headerMap.get('If-Modified-Since', None) 111 # print ("Cache hit: If-Modified-Since=%s, lastModified=%s" %112 # (modifiedSince, lastModified))113 111 if modifiedSince is not None and modifiedSince == lastModified: 114 112 cherrypy._cache.totNonModified += 1 … … 121 119 raise cherrypy.RequestHandled() 122 120 123 def onEndResource(self):124 """Close & fix the cache entry after content was fully written"""125 if not cherrypy.config.get('cacheFilter.on', False):121 def beforeFinalize(self): 122 if not (cherrypy.config.get('cacheFilter.on', False) and 123 cherrypy.request.cacheable): 126 124 return 127 125 128 if cherrypy.request.cacheable: 129 status = cherrypy.response.status 130 headers = cherrypy.response.headers 131 132 # Consume the body iterable. Only do this once! 133 body = cherrypy.response.collapse_body() 134 135 if cherrypy.response.headerMap.get('Pragma', None) != 'no-cache': 136 lastModified = cherrypy.response.headerMap.get('Last-Modified', None) 137 # saves the cache data 138 cherrypy._cache.put(lastModified, (status, headers, body)) 126 cherrypy.response._cachefilter_tee = [] 127 def tee(body): 128 """Tee response.body into response._cachefilter_tee (a list).""" 129 for chunk in body: 130 cherrypy.response._cachefilter_tee.append(chunk) 131 yield chunk 132 cherrypy.response.body = tee(cherrypy.response.body) 133 134 def onEndRequest(self): 135 # Close & fix the cache entry after content was fully written 136 if not (cherrypy.config.get('cacheFilter.on', False) and 137 cherrypy.request.cacheable): 138 return 139 140 response = cherrypy.response 141 status = response.status 142 headers = response.headers 143 body = ''.join([chunk for chunk in response._cachefilter_tee]) 144 145 if response.headerMap.get('Pragma', None) != 'no-cache': 146 lastModified = response.headerMap.get('Last-Modified', None) 147 # saves the cache data 148 cherrypy._cache.put(lastModified, (status, headers, body)) 139 149 140 150 trunk/cherrypy/filters/sessionfilter.py
r814 r838 160 160 # either before or after the body is returned 161 161 cherrypy.response.body = saveData(cherrypy.response.body, sess) 162 163 def onEndResource(self): 164 self._clean() 165 166 def afterErrorResponse(self): 167 self._clean() 168 169 def _clean(self): 162 163 def onEndRequest(self): 170 164 sess = cherrypy.request._session 171 165 if not getattr(sess, 'sessionStorage', None): trunk/cherrypy/test/helper.py
r834 r838 88 88 for chunk in response.body: 89 89 self.body.append(chunk) 90 request.close() 90 91 except: 91 92 if cherrypy.config.get("streamResponse", False): trunk/cherrypy/test/test_core.py
r834 r838 305 305 306 306 class NadsatFilter: 307 307 308 def beforeFinalize(self): 309 self.ended = False 308 310 def nadsat_it_up(body): 309 311 for chunk in body: … … 312 314 yield chunk 313 315 cherrypy.response.body = nadsat_it_up(cherrypy.response.body) 316 317 def onEndRequest(self): 318 # This runs after the request has been completely written out. 319 cherrypy.response.body = "razdrez" 320 self.ended = True 321 322 _nf = NadsatFilter() 314 323 315 324 class CPFilterList(Test): 316 325 317 _cpFilterList = [ NadsatFilter()]326 _cpFilterList = [_nf] 318 327 319 328 def index(self): … … 562 571 def testCPFilterList(self): 563 572 self.getPage("/cpfilterlist/") 573 # If body is "razdrez", then onEndRequest is being called too early. 564 574 self.assertBody("A horrorshow lomtick of cherry pie") 575 # If this fails, then onEndRequest isn't being called at all. 576 self.assertEqual(_nf.ended, True) 565 577 566 578 def testFlatten(self):

