| Index: third_party/tlslite/tlslite/SessionCache.py
|
| diff --git a/third_party/tlslite/tlslite/SessionCache.py b/third_party/tlslite/tlslite/SessionCache.py
|
| deleted file mode 100644
|
| index 34cf0b0ec4e2de8d1f23ff242f9fbc4c8d8fc980..0000000000000000000000000000000000000000
|
| --- a/third_party/tlslite/tlslite/SessionCache.py
|
| +++ /dev/null
|
| @@ -1,103 +0,0 @@
|
| -"""Class for caching TLS sessions."""
|
| -
|
| -import thread
|
| -import time
|
| -
|
| -class SessionCache:
|
| - """This class is used by the server to cache TLS sessions.
|
| -
|
| - Caching sessions allows the client to use TLS session resumption
|
| - and avoid the expense of a full handshake. To use this class,
|
| - simply pass a SessionCache instance into the server handshake
|
| - function.
|
| -
|
| - This class is thread-safe.
|
| - """
|
| -
|
| - #References to these instances
|
| - #are also held by the caller, who may change the 'resumable'
|
| - #flag, so the SessionCache must return the same instances
|
| - #it was passed in.
|
| -
|
| - def __init__(self, maxEntries=10000, maxAge=14400):
|
| - """Create a new SessionCache.
|
| -
|
| - @type maxEntries: int
|
| - @param maxEntries: The maximum size of the cache. When this
|
| - limit is reached, the oldest sessions will be deleted as
|
| - necessary to make room for new ones. The default is 10000.
|
| -
|
| - @type maxAge: int
|
| - @param maxAge: The number of seconds before a session expires
|
| - from the cache. The default is 14400 (i.e. 4 hours)."""
|
| -
|
| - self.lock = thread.allocate_lock()
|
| -
|
| - # Maps sessionIDs to sessions
|
| - self.entriesDict = {}
|
| -
|
| - #Circular list of (sessionID, timestamp) pairs
|
| - self.entriesList = [(None,None)] * maxEntries
|
| -
|
| - self.firstIndex = 0
|
| - self.lastIndex = 0
|
| - self.maxAge = maxAge
|
| -
|
| - def __getitem__(self, sessionID):
|
| - self.lock.acquire()
|
| - try:
|
| - self._purge() #Delete old items, so we're assured of a new one
|
| - session = self.entriesDict[sessionID]
|
| -
|
| - #When we add sessions they're resumable, but it's possible
|
| - #for the session to be invalidated later on (if a fatal alert
|
| - #is returned), so we have to check for resumability before
|
| - #returning the session.
|
| -
|
| - if session.valid():
|
| - return session
|
| - else:
|
| - raise KeyError()
|
| - finally:
|
| - self.lock.release()
|
| -
|
| -
|
| - def __setitem__(self, sessionID, session):
|
| - self.lock.acquire()
|
| - try:
|
| - #Add the new element
|
| - self.entriesDict[sessionID] = session
|
| - self.entriesList[self.lastIndex] = (sessionID, time.time())
|
| - self.lastIndex = (self.lastIndex+1) % len(self.entriesList)
|
| -
|
| - #If the cache is full, we delete the oldest element to make an
|
| - #empty space
|
| - if self.lastIndex == self.firstIndex:
|
| - del(self.entriesDict[self.entriesList[self.firstIndex][0]])
|
| - self.firstIndex = (self.firstIndex+1) % len(self.entriesList)
|
| - finally:
|
| - self.lock.release()
|
| -
|
| - #Delete expired items
|
| - def _purge(self):
|
| - currentTime = time.time()
|
| -
|
| - #Search through the circular list, deleting expired elements until
|
| - #we reach a non-expired element. Since elements in list are
|
| - #ordered in time, we can break once we reach the first non-expired
|
| - #element
|
| - index = self.firstIndex
|
| - while index != self.lastIndex:
|
| - if currentTime - self.entriesList[index][1] > self.maxAge:
|
| - del(self.entriesDict[self.entriesList[index][0]])
|
| - index = (index+1) % len(self.entriesList)
|
| - else:
|
| - break
|
| - self.firstIndex = index
|
| -
|
| -def _test():
|
| - import doctest, SessionCache
|
| - return doctest.testmod(SessionCache)
|
| -
|
| -if __name__ == "__main__":
|
| - _test()
|
|
|