| 1 |
# Copyright 2005 Gentoo Foundation
|
| 2 |
# Distributed under the terms of the GNU General Public License v2
|
| 3 |
#
|
| 4 |
|
| 5 |
"""Simple request/response handling objects"""
|
| 6 |
|
| 7 |
__revision__ = "$Id$"
|
| 8 |
__authors__ = ["Scott Hadfield <hadfield@gentoo.org>",
|
| 9 |
"Ian Leitch <port001@gentoo.org>"]
|
| 10 |
__modulename__ = "request"
|
| 11 |
|
| 12 |
import cgi
|
| 13 |
import Cookie
|
| 14 |
import os
|
| 15 |
|
| 16 |
import sessionutils
|
| 17 |
from glsr.setup import config
|
| 18 |
|
| 19 |
class CgiHandler:
|
| 20 |
def __init__(self):
|
| 21 |
self._session_store = None
|
| 22 |
|
| 23 |
self.response = BaseResponse()
|
| 24 |
self.request = BaseRequest()
|
| 25 |
|
| 26 |
if config.SessionEnable:
|
| 27 |
self._session_store = sessionutils.SessionStorage(
|
| 28 |
config.StorageType)
|
| 29 |
self._session_store.load_store()
|
| 30 |
|
| 31 |
self.session = sessionutils.Session(self._session_store)
|
| 32 |
|
| 33 |
for key in self.session.attrs.keys():
|
| 34 |
arg_dict = {key: self.session.attrs[key]}
|
| 35 |
self._session_store.update_session(
|
| 36 |
sessionutils.get_id(), **arg_dict)
|
| 37 |
|
| 38 |
if self.session.is_persistent() == True:
|
| 39 |
self._session_store.set_persistent(self.session.get_id(), True)
|
| 40 |
else:
|
| 41 |
self._session_store.set_persistent(self.session.get_id(), False)
|
| 42 |
|
| 43 |
session_cookie = Cookie.SimpleCookie()
|
| 44 |
session_cookie[config.CookieName] = self.session.get_id()
|
| 45 |
session_cookie[config.CookieName]['path'] = '/'
|
| 46 |
# Uncomment for release
|
| 47 |
#session_cookie[config.CookieName]['domain'] = self._harm.request.host
|
| 48 |
|
| 49 |
if self.session.is_persistent() == False:
|
| 50 |
session_cookie[config.CookieName]['max-age'] = config.Timeout * 60
|
| 51 |
|
| 52 |
cookie_str = session_cookie[config.CookieName].OutputString()
|
| 53 |
self.response.add_header('Set-Cookie', cookie_str)
|
| 54 |
|
| 55 |
if not self.response.headers.has_key('Content-Type'):
|
| 56 |
self.response.add_header('Content-Type', 'text/html')
|
| 57 |
|
| 58 |
def __del__(self):
|
| 59 |
if config.SessionEnable:
|
| 60 |
self._session_store.save_store()
|
| 61 |
|
| 62 |
class BaseRequest:
|
| 63 |
def __init__(self):
|
| 64 |
self._form = cgi.FieldStorage()
|
| 65 |
# TODO: Use a __getitem__ method to build these on demand.
|
| 66 |
self.forms = self._build_forms()
|
| 67 |
self.queries = self._build_queries()
|
| 68 |
|
| 69 |
self.client_address = os.environ["REMOTE_ADDR"]
|
| 70 |
|
| 71 |
def _build_forms(self):
|
| 72 |
return self._form
|
| 73 |
|
| 74 |
def _build_queries(self):
|
| 75 |
query_str = {}
|
| 76 |
for key in self._form.keys():
|
| 77 |
query_str[key] = self._form.getvalue(key)
|
| 78 |
|
| 79 |
return query_str
|
| 80 |
|
| 81 |
class BaseResponse:
|
| 82 |
|
| 83 |
def __init__(self):
|
| 84 |
self.headers = {}
|
| 85 |
self.body = ""
|
| 86 |
self.status = 0
|
| 87 |
self.encoding = 'utf-8'
|
| 88 |
|
| 89 |
def add_header(self, htype, value):
|
| 90 |
if self.headers.has_key(htype):
|
| 91 |
return
|
| 92 |
self.headers[htype] = value
|
| 93 |
|
| 94 |
def remove_header(self, htype):
|
| 95 |
if self.headers.has_key(htype):
|
| 96 |
self.headers.pop(htype)
|
| 97 |
|
| 98 |
def update_header(self, htype, value):
|
| 99 |
if self.headers.has_key(htype):
|
| 100 |
self.headers[htype] = value
|
| 101 |
|
| 102 |
def append_body(self, text):
|
| 103 |
self.body = "%s%s" % (self.body, text)
|
| 104 |
|
| 105 |
def send(self):
|
| 106 |
for htype, hval in self.headers.iteritems():
|
| 107 |
if htype == "Content-Type":
|
| 108 |
continue
|
| 109 |
print "%s: %s" % (htype, hval)
|
| 110 |
|
| 111 |
if "Content-Type" in self.headers:
|
| 112 |
print "Content-Type: %s\n" % self.headers["Content-Type"]
|
| 113 |
|
| 114 |
print self.body
|