Changeset 665
- Timestamp:
- 09/19/05 17:09:36
- Files:
-
- trunk/cherrypy/__init__.py (modified) (1 diff)
- trunk/cherrypy/_cphttpserver.py (modified) (1 diff)
- trunk/cherrypy/_cpwsgi.py (modified) (1 diff)
- trunk/cherrypy/lib/filter/cachefilter.py (modified) (3 diffs)
- trunk/cherrypy/lib/filter/sessionauthenticatefilter.py (modified) (2 diffs)
- trunk/cherrypy/lib/filter/sessionfilter.py (modified) (13 diffs)
- trunk/cherrypy/lib/filter/xmlrpcfilter.py (modified) (3 diffs)
- 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/__init__.py
r654 r665 55 55 from cherrypy._cpthreadinglocal import local 56 56 57 # Create a threadlocal object to hold the request and response objects. 58 # In this way, we can easily dump those objects when we stop/start a 59 # new HTTP conversation. 60 serving = local() 61 62 class _AttributeDump: 63 pass 64 65 class _ThreadLocalProxy: 66 67 def __init__(self, attrname): 68 self.__dict__["__attrname__"] = attrname 69 70 def purge__(self): 71 """Make a new, emtpy proxied object in cherrypy.serving.""" 72 setattr(serving, self.__attrname__, _AttributeDump()) 73 74 def __getattr__(self, name): 75 childobject = getattr(serving, self.__attrname__) 76 return getattr(childobject, name) 77 78 def __setattr__(self, name, value): 79 childobject = getattr(serving, self.__attrname__) 80 setattr(childobject, name, value) 81 82 def __delattr__(self, name): 83 childobject = getattr(serving, self.__attrname__) 84 delattr(childobject, name) 85 57 86 # Create request and response object (the same objects will be used 58 # throughout the entire life of the webserver) 59 request = local() 60 response = local() 87 # throughout the entire life of the webserver, but will redirect 88 # to the "serving" object) 89 request = _ThreadLocalProxy('request') 90 response = _ThreadLocalProxy('response') 61 91 62 92 # Create threadData object as a thread-specific all-purpose storage trunk/cherrypy/_cphttpserver.py
r583 r665 81 81 if not self.parse_request(): # An error code has been sent, just exit 82 82 return 83 84 cherrypy.request.purge__() 85 cherrypy.response.purge__() 83 86 84 87 cherrypy.request.multithread = cherrypy.config.get("server.threadPool") > 1 trunk/cherrypy/_cpwsgi.py
r626 r665 89 89 90 90 try: 91 cherrypy.request.purge__() 92 cherrypy.response.purge__() 93 91 94 # LOGON_USER is served by IIS, and is the name of the 92 95 # user after having been mapped to a local account. trunk/cherrypy/lib/filter/cachefilter.py
r555 r665 126 126 global cherrypy 127 127 import cherrypy 128 cherrypy. threadData.cacheable = True128 cherrypy.request.cacheable = True 129 129 130 130 def beforeMain(self): … … 137 137 138 138 cacheData = cherrypy._cache.get() 139 cherrypy. threadData.cacheable = not cacheData139 cherrypy.request.cacheable = not cacheData 140 140 if cacheData: 141 141 expirationTime, lastModified, obj = cacheData … … 159 159 return 160 160 161 if cherrypy. threadData.cacheable:161 if cherrypy.request.cacheable: 162 162 status = cherrypy.response.status 163 163 headers = cherrypy.response.headers trunk/cherrypy/lib/filter/sessionauthenticatefilter.py
r598 r665 70 70 elif cherrypy.request.path.endswith('doLogout'): 71 71 cherrypy.session[sessionKey] = None 72 cherrypy. threadData.user = None72 cherrypy.request.user = None 73 73 fromPage = cherrypy.request.paramMap.get('fromPage', '..') 74 74 cherrypy.response.body = httptools.redirect(fromPage) … … 99 99 if loadUserByUsername: 100 100 username = cherrypy.session[sessionKey] 101 cherrypy. threadData.user = loadUserByUsername(username)101 cherrypy.request.user = loadUserByUsername(username) trunk/cherrypy/lib/filter/sessionfilter.py
r647 r665 28 28 29 29 """ Session implementation for CherryPy. 30 We use cherrypy. threadDatato store some convenient variables as30 We use cherrypy.request to store some convenient variables as 31 31 well as data about the session for the current request. Instead of 32 polluting cherrypy. threadDatawe use a dummy object called33 cherrypy. threadData._session (sess) to store these variables.32 polluting cherrypy.request we use a dummy object called 33 cherrypy.request._session (sess) to store these variables. 34 34 35 35 Variables used to store config options: … … 89 89 conf = cherrypy.config.get 90 90 91 cherrypy. threadData._session = EmptyClass()92 sess = cherrypy. threadData._session91 cherrypy.request._session = EmptyClass() 92 sess = cherrypy.request._session 93 93 now = datetime.datetime.now() 94 94 # Dont enable session if sessionFilter is off or if this is a … … 187 187 self._clean(sess) 188 188 189 sess = cherrypy. threadData._session189 sess = cherrypy.request._session 190 190 if not sess.sessionStorage: 191 191 # Sessions are not enabled: do nothing … … 197 197 198 198 def afterErrorResponse(self): 199 sess = cherrypy. threadData._session199 sess = cherrypy.request._session 200 200 if not sess.sessionStorage: 201 201 # Sessions are not enabled: do nothing … … 223 223 224 224 def acquireLock(self): 225 sess = cherrypy. threadData._session225 sess = cherrypy.request._session 226 226 id = cherrypy.session['_id'] 227 227 lock = cherrypy._sessionLockDict.get(id) … … 238 238 239 239 def releaseLock(self): 240 sess = cherrypy. threadData._session240 sess = cherrypy.request._session 241 241 id = cherrypy.session['_id'] 242 242 cherrypy._sessionLockDict[id].release() … … 244 244 245 245 def cleanUp(self): 246 sess = cherrypy. threadData._session246 sess = cherrypy.request._session 247 247 toBeDeleted = [] 248 248 now = datetime.datetime.now() … … 278 278 279 279 def acquireLock(self): 280 sess = cherrypy. threadData._session280 sess = cherrypy.request._session 281 281 filePath = self._getFilePath(cherrypy.session['_id']) 282 282 lockFilePath = filePath + self.LOCK_SUFFIX … … 285 285 286 286 def releaseLock(self): 287 sess = cherrypy. threadData._session287 sess = cherrypy.request._session 288 288 filePath = self._getFilePath(cherrypy.session['_id']) 289 289 lockFilePath = filePath + self.LOCK_SUFFIX … … 292 292 293 293 def cleanUp(self): 294 sess = cherrypy. threadData._session294 sess = cherrypy.request._session 295 295 storagePath = cherrypy.config.get('sessionFilter.storagePath') 296 296 now = datetime.datetime.now() … … 326 326 327 327 def _lockFile(self, path): 328 sess = cherrypy. threadData._session328 sess = cherrypy.request._session 329 329 startTime = time.time() 330 330 while True: … … 403 403 404 404 def cleanUp(self): 405 sess = cherrypy. threadData._session405 sess = cherrypy.request._session 406 406 now = datetime.datetime.now() 407 407 self.cursor.execute( … … 424 424 # to be thread-specific so we use a special wrapper that forwards 425 425 # calls to cherrypy.session to a thread-specific dictionary called 426 # cherrypy. threadData._session.sessionData426 # cherrypy.request._session.sessionData 427 427 class SessionWrapper: 428 428 429 429 def __getattr__(self, name): 430 sess = cherrypy. threadData._session430 sess = cherrypy.request._session 431 431 if sess.sessionStorage is None: 432 432 raise SessionNotEnabledError() trunk/cherrypy/lib/filter/xmlrpcfilter.py
r569 r665 149 149 def beforeRequestBody(self): 150 150 """ Called after the request header has been read/parsed""" 151 cherrypy. threadData.xmlRpcFilterOn = cherrypy.config.get('xmlRpcFilter.on', False)152 if not cherrypy. threadData.xmlRpcFilterOn:151 cherrypy.request.xmlRpcFilterOn = cherrypy.config.get('xmlRpcFilter.on', False) 152 if not cherrypy.request.xmlRpcFilterOn: 153 153 return True 154 154 … … 183 183 def beforeFinalize(self): 184 184 """ Called before finalizing output """ 185 if (not cherrypy. threadData.xmlRpcFilterOn185 if (not cherrypy.request.xmlRpcFilterOn 186 186 or not cherrypy.request.isRPC): 187 187 return … … 202 202 def beforeErrorResponse(self): 203 203 try: 204 if not cherrypy. threadData.xmlRpcFilterOn:204 if not cherrypy.request.xmlRpcFilterOn: 205 205 return 206 206 body = ''.join([chunk for chunk in cherrypy.response.body]) trunk/cherrypy/test/helper.py
r660 r665 101 101 if body is not None: 102 102 body = StringIO.StringIO(body) 103 104 cherrypy.request.purge__() 105 cherrypy.response.purge__() 103 106 104 107 cherrypy.server.request((self.HOST, self.PORT), self.HOST, trunk/cherrypy/test/test_core.py
r641 r665 254 254 def upload(self, file): 255 255 return "Size: %s" % len(file.file.read()) 256 257 class ThreadLocal(Test): 258 259 def index(self): 260 existing = repr(getattr(cherrypy.request, "asdf", None)) 261 cherrypy.request.asdf = "hello" 262 return existing 263 256 264 257 265 logFile = os.path.join(localDir, "error.log") … … 310 318 ('/foo/nex', 'baz', 'that2'), 311 319 ] 320 cherrypy.request.purge__() 312 321 for path, key, expected in tests: 313 322 cherrypy.request.path = path … … 669 678 self.assertStatus("413 Request Entity Too Large") 670 679 self.assertInBody("Request Entity Too Large") 680 681 def testEmptyThreadlocals(self): 682 results = [] 683 for x in xrange(20): 684 self.getPage("/threadlocal/") 685 results.append(self.body) 686 self.assertEqual(results, ["None"] * 20) 687 671 688 672 689 if __name__ == '__main__':

