Download Install Tutorial Docs FAQ Tools WikiLicense Team IRC Planet Involvement Shop Book

root/tags/cherrypy-2.0.0/cherrypy/_cpdefaults.py

Revision 157 (checked in by rdelon, 3 years ago)

Fixed ticket #125

Line 
1 """
2 Copyright (c) 2004, CherryPy Team (team@cherrypy.org)
3 All rights reserved.
4
5 Redistribution and use in source and binary forms, with or without modification,
6 are permitted provided that the following conditions are met:
7
8     * Redistributions of source code must retain the above copyright notice,
9       this list of conditions and the following disclaimer.
10     * Redistributions in binary form must reproduce the above copyright notice,
11       this list of conditions and the following disclaimer in the documentation
12       and/or other materials provided with the distribution.
13     * Neither the name of the CherryPy Team nor the names of its contributors
14       may be used to endorse or promote products derived from this software
15       without specific prior written permission.
16
17 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
18 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
21 FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
23 SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
24 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
25 OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 """
28
29
30 """
31 A module containing a few utility classes/functions used by CherryPy
32 """
33
34 import time, thread, os, cpg
35 import cPickle as pickle
36
37 def _cpLogMessage(msg, context = '', severity = 0):
38     """ Default method for logging messages """
39
40     nowTuple = time.localtime(time.time())
41     nowStr = '%04d/%02d/%02d %02d:%02d:%02d' % (nowTuple[:6])
42     if severity == 0:
43         level = "INFO"
44     elif severity == 1:
45         level = "WARNING"
46     elif severity == 2:
47         level = "ERROR"
48     else:
49         lebel = "UNKNOWN"
50     try:
51         logToScreen = int(cpg.configOption.logToScreen)
52     except:
53         logToScreen = True
54     s = nowStr + ' ' + context + ' ' + level + ' ' + msg
55     if logToScreen:
56         print s
57     if cpg.configOption.logFile:
58         f = open(cpg.configOption.logFile, 'ab')
59         f.write(s + '\n')
60         f.close()
61
62 def _cpOnError():
63     """ Default _cpOnError method """
64
65     import traceback, StringIO
66     bodyFile = StringIO.StringIO()
67     traceback.print_exc(file = bodyFile)
68     cpg.response.body = [bodyFile.getvalue()]
69     cpg.response.headerMap['Content-Type'] = 'text/plain'
70
71 def _cpSaveSessionData(sessionId, sessionData, expirationTime,
72         threadPool = None, sessionStorageType = None,
73         sessionStorageFileDir = None):
74     """ Save session data if needed """
75
76     if threadPool is None:
77         threadPool = cpg.configOption.threadPool
78     if sessionStorageType is None:
79         sessionStorageType =  cpg.configOption.sessionStorageType
80     if sessionStorageFileDir is None:
81         sessionStorageFileDir = cpg.configOption.sessionStorageFileDir
82
83     t = time.localtime(expirationTime)
84     if sessionStorageType == 'file':
85         fname=os.path.join(sessionStorageFileDir,sessionId)
86         if threadPool > 1:
87             cpg._sessionFileLock.acquire()
88         f = open(fname,"wb")
89         pickle.dump((sessionData, expirationTime), f)
90         f.close()
91         if threadPool > 1:
92             cpg._sessionFileLock.release()
93
94     elif sessionStorageType=="ram":
95         # Update expiration time
96         cpg._sessionMap[sessionId] = (sessionData, expirationTime)
97
98     """ TODO: implement cookie storage type
99     elif sessionStorageType == "cookie":
100         
101          TODO: set siteKey in _cpConfig
102             # Get site key from config file or compute it
103             try: cpg._SITE_KEY_ = configFile.get('server','siteKey')
104             except:
105                 _SITE_KEY_ = ''
106                 for i in range(30):
107                     _SITE_KEY_ += random.choice(string.letters)
108
109         # Update expiration time
110         sessionData = (sessionData, expirationTime)
111         dumpStr = pickle.dumps(_sessionData)
112         try: dumpStr = zlib.compress(dumpStr)
113         except: pass # zlib is not available in all python distros
114         dumpStr = binascii.hexlify(dumpStr) # Need to hexlify it because it will be stored in a cookie
115         cpg.response.simpleCookie['CSession'] = dumpStr
116         cpg.response.simpleCookie['CSession-sig'] = md5.md5(dumpStr + cpg.configOption.siteKey).hexdigest()
117         cpg.response.simpleCookie['CSession']['path'] = '/'
118         cpg.response.simpleCookie['CSession']['max-age'] = sessionTimeout * 60
119         cpg.response.simpleCookie['CSession-sig']['path'] = '/'
120         cpg.response.simpleCookie['CSession-sig']['max-age'] = sessionTimeout * 60
121     """
122
123 def _cpLoadSessionData(sessionId, threadPool = None, sessionStorageType = None,
124         sessionStorageFileDir = None):
125     """ Return the session data for a given sessionId.
126         The _expirationTime will be checked by the caller of this function
127     """
128
129     if threadPool is None:
130         threadPool = cpg.configOption.threadPool
131     if sessionStorageType is None:
132         sessionStorageType =  cpg.configOption.sessionStorageType
133     if sessionStorageFileDir is None:
134         sessionStorageFileDir = cpg.configOption.sessionStorageFileDir
135
136     if sessionStorageType == "ram":
137         if cpg._sessionMap.has_key(sessionId):
138             return cpg._sessionMap[sessionId]
139         else: return None
140
141     elif sessionStorageType == "file":
142         fname = os.path.join(sessionStorageFileDir, sessionId)
143         if os.path.exists(fname):
144             if threadPool > 1:
145                 cpg._sessionFileLock.acquire()
146             f = open(fname, "rb")
147             sessionData = pickle.load(f)
148             f.close()
149             if threadPool > 1:
150                 cpg._sessionFileLock.release()
151             return sessionData
152         else: return None
153
154     """ TODO: implement cookie storage type
155     elif _sessionStorageType == "cookie":
156         if request.simpleCookie.has_key('CSession') and request.simpleCookie.has_key('CSession-sig'):
157             data = request.simpleCookie['CSession'].value
158             sig  = request.simpleCookie['CSession-sig'].value
159             if md5.md5(data + cpg.configOption.siteKey).hexdigest() == sig:
160                 try:
161                     dumpStr = binascii.unhexlify(data)
162                     try: dumpStr = zlib.decompress(dumpStr)
163                     except: pass # zlib is not available in all python distros
164                     dumpStr = pickle.loads(dumpStr)
165                     return dumpStr
166                 except: pass
167         return None
168     """
169
170 def _cpCleanUpOldSessions(threadPool = None, sessionStorageType = None,
171         sessionStorageFileDir = None):
172     """ Clean up old sessions """
173
174     if threadPool is None:
175         threadPool = cpg.configOption.threadPool
176     if sessionStorageType is None:
177         sessionStorageType =  cpg.configOption.sessionStorageType
178     if sessionStorageFileDir is None:
179         sessionStorageFileDir = cpg.configOption.sessionStorageFileDir
180
181     # Clean up old session data
182     now = time.time()
183     if sessionStorageType == "ram":
184         sessionIdToDeleteList = []
185         for sessionId, (dummy, expirationTime) in cpg._sessionMap.items():
186             if expirationTime < now:
187                 sessionIdToDeleteList.append(sessionId)
188         for sessionId in sessionIdToDeleteList:
189             del cpg._sessionMap[sessionId]
190
191     elif sessionStorageType=="file":
192         # This process is very expensive because we go through all files, parse them and then delete them if the session is expired
193         # One optimization would be to just store a list of (sessionId, expirationTime) in *one* file
194         sessionFileList = os.listdir(sessionStorageFileDir)
195         for sessionId in sessionFileList:
196             try:
197                 dummy, expirationTime = _cpLoadSessionData(sessionId)
198                 if expirationTime < now:
199                     os.remove(os.path.join(sessionStorageFileDir, sessionId))
200             except:
201                 pass
202
203     elif sessionStorageType == "cookie":
204         # Nothing to do in this case: the session data is stored on the client
205         pass
206
207 _cpFilterList = []
Note: See TracBrowser for help on using the browser.

Hosted by WebFaction

Log in as guest/cpguest to create tickets