home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyc (Python 2.6)
-
- import logging
-
- try:
- from hashlib import md5
- except ImportError:
- from md5 import new as md5
-
- import re
- import cherrypy
- from cherrypy.lib import http as _http
-
- def validate_etags(autotags = False):
- response = cherrypy.response
- if hasattr(response, 'ETag'):
- return None
- (status, reason, msg) = _http.valid_status(response.status)
- etag = response.headers.get('ETag')
- if not etag and autotags:
- if status == 200:
- etag = response.collapse_body()
- etag = '"%s"' % md5(etag).hexdigest()
- response.headers['ETag'] = etag
-
-
- response.ETag = etag
-
-
- def validate_since():
- response = cherrypy.response
- lastmod = response.headers.get('Last-Modified')
- if lastmod:
- (status, reason, msg) = _http.valid_status(response.status)
- request = cherrypy.request
- since = request.headers.get('If-Unmodified-Since')
- if since and since != lastmod:
- if status >= 200 or status <= 299 or status == 412:
- raise cherrypy.HTTPError(412)
- status == 412
-
- since = request.headers.get('If-Modified-Since')
- if since and since == lastmod:
- if status >= 200 or status <= 299 or status == 304:
- if request.method in ('GET', 'HEAD'):
- raise cherrypy.HTTPRedirect([], 304)
- request.method in ('GET', 'HEAD')
- raise cherrypy.HTTPError(412)
- status == 304
-
-
-
-
- def proxy(base = None, local = 'X-Forwarded-Host', remote = 'X-Forwarded-For', scheme = 'X-Forwarded-Proto'):
- request = cherrypy.request
- if scheme:
- s = request.headers.get(scheme, None)
- if s == 'on' and 'ssl' in scheme.lower():
- scheme = 'https'
- else:
- scheme = s
-
- if not scheme:
- scheme = request.base[:request.base.find('://')]
-
- if local:
- base = request.headers.get(local, base)
-
- if not base:
- port = cherrypy.request.local.port
- if port == 80:
- base = '127.0.0.1'
- else:
- base = '127.0.0.1:%s' % port
-
- if base.find('://') == -1:
- base = scheme + '://' + base
-
- request.base = base
- if remote:
- xff = request.headers.get(remote)
- if xff:
- if remote == 'X-Forwarded-For':
- xff = xff.split(',')[-1].strip()
-
- request.remote.ip = xff
-
-
-
-
- def ignore_headers(headers = ('Range',)):
- request = cherrypy.request
- for name in headers:
- if name in request.headers:
- del request.headers[name]
- continue
-
-
-
- def response_headers(headers = None):
- for name, value in []:
- cherrypy.response.headers[name] = value
-
- response_headers.failsafe = True
-
- def referer(pattern, accept = True, accept_missing = False, error = 403, message = 'Forbidden Referer header.'):
-
- try:
- match = bool(re.match(pattern, cherrypy.request.headers['Referer']))
- if accept == match:
- return None
- except KeyError:
- if accept_missing:
- return None
- except:
- accept_missing
-
- raise cherrypy.HTTPError(error, message)
-
-
- class SessionAuth(object):
- session_key = 'username'
-
- def check_username_and_password(self, username, password):
- pass
-
-
- def anonymous(self):
- pass
-
-
- def on_login(self, username):
- pass
-
-
- def on_logout(self, username):
- pass
-
-
- def on_check(self, username):
- pass
-
-
- def login_screen(self, from_page = '..', username = '', error_msg = '', **kwargs):
- return '<html><body>\nMessage: %(error_msg)s\n<form method="post" action="do_login">\n Login: <input type="text" name="username" value="%(username)s" size="10" /><br />\n Password: <input type="password" name="password" size="10" /><br />\n <input type="hidden" name="from_page" value="%(from_page)s" /><br />\n <input type="submit" />\n</form>\n</body></html>' % {
- 'from_page': from_page,
- 'username': username,
- 'error_msg': error_msg }
-
-
- def do_login(self, username, password, from_page = '..', **kwargs):
- error_msg = self.check_username_and_password(username, password)
- if error_msg:
- body = self.login_screen(from_page, username, error_msg)
- cherrypy.response.body = body
- if cherrypy.response.headers.has_key('Content-Length'):
- del cherrypy.response.headers['Content-Length']
-
- return True
- self.on_login(username)
- if not from_page:
- pass
- raise cherrypy.HTTPRedirect('/')
-
-
- def do_logout(self, from_page = '..', **kwargs):
- sess = cherrypy.session
- username = sess.get(self.session_key)
- sess[self.session_key] = None
- if username:
- cherrypy.request.login = None
- self.on_logout(username)
-
- raise cherrypy.HTTPRedirect(from_page)
-
-
- def do_check(self):
- sess = cherrypy.session
- request = cherrypy.request
- username = sess.get(self.session_key)
- if not username:
- sess[self.session_key] = username = self.anonymous()
-
- if not username:
- cherrypy.response.body = self.login_screen(cherrypy.url(qs = request.query_string))
- if cherrypy.response.headers.has_key('Content-Length'):
- del cherrypy.response.headers['Content-Length']
-
- return True
- cherrypy.request.login = username
- self.on_check(username)
-
-
- def run(self):
- request = cherrypy.request
- path = request.path_info
- if path.endswith('login_screen'):
- return self.login_screen(**request.params)
- if path.endswith('do_login'):
- return self.do_login(**request.params)
- if path.endswith('do_logout'):
- return self.do_logout(**request.params)
- return self.do_check()
-
-
-
- def session_auth(**kwargs):
- sa = SessionAuth()
- for k, v in kwargs.iteritems():
- setattr(sa, k, v)
-
- return sa.run()
-
- session_auth.__doc__ = [] + [](_[1])
-
- def log_traceback(severity = logging.DEBUG):
- cherrypy.log('', 'HTTP', severity = severity, traceback = True)
-
-
- def log_request_headers():
- h = [ ' %s: %s' % (k, v) for k, v in cherrypy.request.header_list ]
- cherrypy.log('\nRequest Headers:\n' + '\n'.join(h), 'HTTP')
-
-
- def log_hooks():
- msg = []
- _cprequest = _cprequest
- import cherrypy
- points = _cprequest.hookpoints
- for k in cherrypy.request.hooks.keys():
- if k not in points:
- points.append(k)
- continue
-
- for k in points:
- msg.append(' %s:' % k)
- v = cherrypy.request.hooks.get(k, [])
- v.sort()
- for h in v:
- msg.append(' %r' % h)
-
-
- cherrypy.log('\nRequest Hooks for ' + cherrypy.url() + ':\n' + '\n'.join(msg), 'HTTP')
-
-
- def redirect(url = '', internal = True):
- if internal:
- raise cherrypy.InternalRedirect(url)
- internal
- raise cherrypy.HTTPRedirect(url)
-
-
- def trailing_slash(missing = True, extra = False):
- request = cherrypy.request
- pi = request.path_info
- if request.is_index is True:
- if missing:
- if not pi.endswith('/'):
- new_url = cherrypy.url(pi + '/', request.query_string)
- raise cherrypy.HTTPRedirect(new_url)
- pi.endswith('/')
-
- elif request.is_index is False:
- if extra:
- if pi.endswith('/') and pi != '/':
- new_url = cherrypy.url(pi[:-1], request.query_string)
- raise cherrypy.HTTPRedirect(new_url)
- pi != '/'
-
-
-
-
- def flatten():
- import types
-
- def flattener(input):
- for x in input:
- if not isinstance(x, types.GeneratorType):
- yield x
- continue
- for y in flattener(x):
- yield y
-
-
-
- response = cherrypy.response
- response.body = flattener(response.body)
-
-
- def accept(media = None):
- if not media:
- return None
- if isinstance(media, basestring):
- media = [
- media]
-
- ranges = cherrypy.request.headers.elements('Accept')
- if not ranges:
- return media[0]
- for element in ranges:
- if element.qvalue > 0:
- if element.value == '*/*':
- return media[0]
- if element.value.endswith('/*'):
- mtype = element.value[:-1]
- for m in media:
- if m.startswith(mtype):
- return m
-
- elif element.value in media:
- return element.value
- element.value == '*/*'
- continue
- ranges
-
- ah = cherrypy.request.headers.get('Accept')
- if ah is None:
- msg = 'Your client did not send an Accept header.'
- else:
- msg = 'Your client sent this Accept header: %s.' % ah
- msg += ' But this resource only emits these media types: %s.' % ', '.join(media)
- raise cherrypy.HTTPError(406, msg)
-
-