Changeset 203
- Timestamp:
- 05/22/05 14:38:04
- Files:
-
- branches/ticket-132/cherrypy/_cpdefaults.py (modified) (2 diffs)
- branches/ticket-132/cherrypy/_cphttptools.py (modified) (4 diffs)
- branches/ticket-132/cherrypy/_cpserver.py (modified) (1 diff)
- branches/ticket-132/cherrypy/lib/session/basesession.py (modified) (2 diffs)
- branches/ticket-132/cherrypy/lib/session/filesession.py (modified) (1 diff)
- branches/ticket-132/cherrypy/lib/session/ramsession.py (modified) (3 diffs)
- branches/ticket-132/cherrypy/lib/session/sessionmap.py (modified) (1 diff)
- branches/ticket-132/cherrypy/lib/session/urlrewriteforsessionhelper.py (copied) (copied from branches/kender-experimental/cherrypy/lib/filter/urlrewriteforsessionhelper.py)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
branches/ticket-132/cherrypy/_cpdefaults.py
r201 r203 33 33 34 34 import time, thread, os, cpg 35 import cPickle as pickle35 #import cPickle as pickle 36 36 37 37 def _cpLogMessage(msg, context = '', severity = 0): … … 66 66 from lib.session.ramsession import RamSession 67 67 from lib.session.GenericSqlSession import GenericSqlSession 68 from lib.session.filesession import FileSession 68 69 _sessionTypes = { 69 70 'ram' : RamSession, 70 'file' : None,71 'file' : FileSession, 71 72 'sql' : GenericSqlSession 72 73 } branches/ticket-132/cherrypy/_cphttptools.py
r201 r203 227 227 # Still save session data 228 228 if cpg.getConfig('session', 'storageType') and not cpg.request.isStatic: 229 cpg. _sessionData.saveSessionMap()229 cpg.sessionManager.saveSessionMap() 230 230 231 231 wfile.write('%s %s\r\n' % (cpg.response.headerMap['protocolVersion'], cpg.response.headerMap['Status'])) … … 268 268 # Save session data 269 269 if cpg.getConfig('session', 'storageType') and not cpg.request.isStatic: 270 cpg. _sessionData.saveSessionMap()270 cpg.sessionManager.saveSessionMap() 271 271 272 272 … … 306 306 (cpg._lastSessionCleanUpTime + cpg.getConfig('session', 'cleanUpDelay') * 60) <= now): 307 307 cpg._lastSessionCleanUpTime = now 308 cpg. _sessionData.cleanUpOldSessions()308 cpg.sessionManager.cleanUpOldSessions() 309 309 310 310 # Save original values (in case they get modified by filters) … … 377 377 378 378 # robinson 379 # the new session system might need to peek at the object so this code was moved380 # from above381 382 379 # Get session data 383 380 if cpg.getConfig('session', 'storageType') and not cpg.request.isStatic: 384 cpg. _sessionData.loadSessionMap()381 cpg.sessionManager.loadSessionMap() 385 382 386 383 # Remove "root" from objectPathList and join it to get objectPath branches/ticket-132/cherrypy/_cpserver.py
r201 r203 77 77 sessionType = cpg.getConfig('session', 'storageType') 78 78 79 cpg. _sessionData= _sessionTypes[sessionType]()79 cpg.sessionManager = _sessionTypes[sessionType]() 80 80 81 81 try: 82 onStartThreadList.append(cpg. _sessionData.onStartThread)82 onStartThreadList.append(cpg.sessionManager.onStartThread) 83 83 except AttributeError: 84 84 pass branches/ticket-132/cherrypy/lib/session/basesession.py
r201 r203 79 79 def newSession(self): 80 80 """ Return a new sessionMap instance """ 81 # this needs to check the config file for default values 81 82 return SessionMapClass(dataKeys = { '__sessionKey': self.generateSessionId() }) 82 83 84 def getSessionKey(self): 85 """ 86 Returns the current sessionkey, return None if there is no session. 87 Applications should never need to call this function. It is public 88 so it can be redifined (to use url based sessions or other magic) 89 """ 90 91 cpg = cherrypy.cpg 92 try: 93 return cpg.request.simpleCookie[cpg.getConfig('session', 'cookieName')].value 94 except: 95 return None 96 97 def setSessionKey(self, sessionKey): 98 """ 99 Sets the session key in a cookie. Aplications should not call this function, 100 but it might be usefull to redefine it. 101 """ 102 103 cpg = cherrypy.cpg 104 cpg.response.simpleCookie[cpg.getConfig('session', 'cookieName')] = sessionKey 105 cpg.response.simpleCookie[cpg.getConfig('session', 'cookieName')]['path'] = '/' 106 cpg.response.simpleCookie[cpg.getConfig('session', 'cookieName')]['version'] = 1 107 83 108 def loadSessionMap(self, autoCreate = True): 84 """ loads the curent session map or create a new one, unless createNew is false (then sessionMap = None) """ 109 """ 110 The server calls this function on every request to load that session map 111 """ 85 112 cpg = cherrypy.cpg 86 113 87 # First, get sessionKey from cookie88 try: sessionKey = cpg.request.simpleCookie[cpg.getConfig('session', 'cookieName')].value89 except: sessionKey=None 114 # First, get sessionKey from wherever it is stored 115 sessionKey = self.getSessionKey() 116 90 117 if sessionKey: 91 118 # Load session data from wherever it was stored … … 97 124 if not sessionKey or not sessionMap: 98 125 if autoCreate: 99 sessionMap = cpg._sessionData.newSession()126 sessionMap = self.newSession() 100 127 else: 101 128 sessionMap = None 102 129 103 cpg.response.simpleCookie[cpg.getConfig('session', 'cookieName')] = sessionMap['__sessionKey'] 104 cpg.response.simpleCookie[cpg.getConfig('session', 'cookieName')]['path'] = '/' 105 cpg.response.simpleCookie[cpg.getConfig('session', 'cookieName')]['version'] = 1 130 self.setSessionKey(sessionMap['__sessionKey']) 106 131 107 132 cpg.request.sessionMap = sessionMap 108 133 109 134 def saveSessionMap(self): 110 """ saves the sessionMap """ 135 """ 136 This function saves the current sessionMap, it is automatically called 137 by the server for every request. Applications should not call this function 138 """ 111 139 cpg = cherrypy.cpg 112 140 self.__setitem__(cpg.request.sessionMap['__sessionKey'], cpg.request.sessionMap) branches/ticket-132/cherrypy/lib/session/filesession.py
r183 r203 28 28 29 29 import time 30 from basesession import BaseSession , BaseSessionObject30 from basesession import BaseSession 31 31 import cherrypy.cpg 32 import mrow 33 import os 34 import cPickle as pickle 35 class FileSession(BaseSession): 36 37 __lock = mrow.RWLock() 38 39 def sessionReader(sessionFunc): 40 """Decorates a function as being a reader of the sessionMap. 41 42 Acquires a read lock on the sessionMap before calling `sessionFunc`, then 43 releases the lock after the call completes. 44 45 `sessionFunc` will also be called with a named argument, `sessionMap`, as a 46 convenience, set to `cpg.request.sessionMap`. 47 48 """ 49 def _inner(self, *args, **kw): 50 lock = self.__lock.reader() 51 try: 52 return sessionFunc(self, *args, **kw) 53 finally: 54 lock.release() 55 return _inner 56 57 58 def sessionWriter(sessionFunc): 59 """Same as sessionReader, except obtains an exclusive write lock.""" 60 def _inner(self, sessionKey, sessionValue): 61 lock = self.__lock.writer() 62 try: 63 return sessionFunc(self, sessionKey, sessionValue) 64 finally: 65 lock.release() 66 return _inner 67 68 def newSession(self): 69 ns = {}#self.dataKeys.copy() 70 ns.update({ 71 '__createdAt' : time.time(), 72 '__timeout' : cherrypy.cpg.getConfig('session', 'timeout') * 60, 73 '__maxAge' : None, 74 '__lastAccess' : time.time(), 75 '__sessionKey' : self.generateSessionId() 76 }) 77 return ns.copy() 78 79 def __getitem__(self, sessionKey): 80 sessionStorageFileDir = cherrypy.cpg.getConfig('session', 'storageFileDir') 81 fname = os.path.join(sessionStorageFileDir, sessionKey) 82 if os.path.exists(fname): 83 f = open(fname, "rb") 84 sessionData = pickle.load(f) 85 f.close() 86 return sessionData 87 else: return None 88 __getitem__ = sessionReader(__getitem__) 89 90 def __setitem__(self, sessionKey, sessionData): 91 sessionStorageFileDir = cherrypy.cpg.getConfig('session', 'storageFileDir') 92 93 fname=os.path.join(sessionStorageFileDir,sessionKey) 94 f = open(fname,"wb") 95 pickle.dump(sessionData, f) 96 f.close() 97 __setitem__ = sessionWriter(__setitem__) 32 98 33 class FileSession(BaseSession): 34 __data = {} 35 class sessionObject(BaseSessionObject): 36 def __init__(self): 37 self['expirationTime'] = time.time() + cherrypy.cpg.getConfig('session', 'timeout') * 60 38 39 def data(self): 40 return self.__data 99 def __delitem__(self, sessionKey): 100 sessionStorageFileDir = cherrypy.cpg.getConfig('session', 'storageFileDir') 101 lock = self.__lock.writer() 102 try: 103 del self.__data[sessionKey] 104 finally: 105 lock.release() 41 106 42 def get(self, sessionId, default = None): 43 return self.__data.get(sessionId, default) 107 def cleanUpOldSessions(self): 108 print 'cleaning' 109 sessionStorageFileDir = cherrypy.cpg.getConfig('session', 'storageFileDir') 110 sessionFileList = os.listdir(sessionStorageFileDir) 44 111 45 def __getitem__(self, sessionId): 46 return self.__data[sessionId] 112 for sessionKey in sessionFileList: 113 sessionData = self.__getitem__(sessionKey) 114 timeout = sessionData['__timeout'] 115 maxAge = sessionData['__maxAge'] 116 sessionAge = sessionData['__lastAccess'] - sessionData['__createdAt'] 117 for key in sessionData: 118 print key, sessionData[key] 119 if (timeout and timeout < sessionAge) or (maxAge and maxAge < sessionAge): 120 try: 121 os.remove(os.path.join(sessionStorageFileDir, sessionKey)) 122 except: 123 print 'exception cleaning' 124 pass 47 125 48 def __setitem__(self, sessionId, value):49 self.__data['expirationTime'] = time.time() + cherrypy.cpg.getConfig('session', 'timeout') * 6050 self.__data[sessionId] = value51 52 def cleanUpOldSessions(self):53 now = time.time()54 for key in __data:55 if __data[key]['expirationTime']:56 del __data[key]branches/ticket-132/cherrypy/lib/session/ramsession.py
r201 r203 28 28 29 29 import time 30 from basesession import BaseSession 30 from basesession import BaseSession 31 from sessionmap import SessionMapClass 31 32 import cherrypy.cpg 32 33 import mrow … … 45 46 self.dataKeys = {} 46 47 __lock = mrow.RWLock() 48 47 49 def sessionReader(sessionFunc): 48 50 """Decorates a function as being a reader of the sessionMap. … … 109 111 now = time.time() 110 112 for sessionKey in __data: 111 timeout = self['timeout'] 112 maxAge = self['maxAge'] 113 sessionAge = self['lastAccess'] -self['createdAt'] 113 sessionData = __data[sessionKey] 114 timeout = sessionData['__timeout'] 115 maxAge = sessionData['__maxAge'] 116 sessionAge = sessionData['__lastAccess'] - sessionData['__createdAt'] 114 117 if (timeout and timeout < sessionAge) or (maxAge and maxAge < sessionAge): 115 se lf.__delitem__(sessionKey)118 sessionData.__delitem__(sessionKey) 116 119 branches/ticket-132/cherrypy/lib/session/sessionmap.py
r200 r203 55 55 56 56 def __init__(self, sessionData = {}): 57 self.__sessionData = sessionData 57 self.__sessionData = sessionData.copy() 58 58 59 59 """

