1
# -*- coding: iso-8859-1 -*-
3
MoinMoin - Standalone Moin Server Request Implementation
5
@copyright: 2001-2003 Juergen Hermann <jh@web.de>,
6
2003-2006 MoinMoin:ThomasWaldmann
7
@license: GNU GPL, see COPYING for details.
11
from MoinMoin import log
12
logging = log.getLogger(__name__)
14
from MoinMoin.request import RequestBase, RemoteClosedConnection
16
class Request(RequestBase):
17
""" specialized on StandAlone Server (MoinMoin.server.server_standalone) requests """
20
def __init__(self, sa, properties={}):
22
@param sa: stand alone server object
23
@param properties: ...
29
self.headers = sa.headers
33
self.http_accept_language = (sa.headers.getheader('accept-language')
34
or self.http_accept_language)
35
self.http_user_agent = sa.headers.getheader('user-agent', '')
37
self.content_length = int(sa.headers.getheader('content-length'))
38
except (TypeError, ValueError):
39
self.content_length = None
40
co = [c for c in sa.headers.getheaders('cookie') if c]
41
self.saved_cookie = ', '.join(co) or ''
42
self.if_modified_since = sa.headers.getheader('if-modified-since')
43
self.if_none_match = sa.headers.getheader('if-none-match')
45
# Copy rest from standalone request
46
self.server_name = sa.server.server_name
47
self.server_port = str(sa.server.server_port)
48
self.request_method = sa.command
49
self.request_uri = sa.path
50
self.remote_addr = sa.client_address[0]
52
# Values that need more work
53
self.path_info, self.query_string = self.splitURI(sa.path)
54
self.setHttpReferer(sa.headers.getheader('referer'))
55
self.setHost(sa.headers.getheader('host'))
56
self.setURL(sa.headers)
58
##self.debugEnvironment(sa.headers)
60
RequestBase.__init__(self, properties)
62
except Exception, err:
65
def _setup_args_from_cgi_form(self):
66
""" Override to create standalone form """
67
form = cgi.FieldStorage(self.rfile, headers=self.headers, environ={'REQUEST_METHOD': 'POST'},
69
return RequestBase._setup_args_from_cgi_form(self, form)
72
""" Read from input stream """
74
logging.warning("calling request.read(None) might block")
75
return self.rfile.read()
77
return self.rfile.read(n)
79
def write(self, *data):
80
""" Write to output stream. """
81
data = self.encode(data)
83
self.wfile.write(data)
85
raise RemoteClosedConnection()
91
RequestBase.finish(self)
94
# Headers ----------------------------------------------------------
96
def _emit_http_headers(self, headers):
97
""" private method to send out preprocessed list of HTTP headers """
98
st_header, other_headers = headers[0], headers[1:]
99
status = st_header.split(':', 1)[1].lstrip()
100
status_code, status_msg = status.split(' ', 1)
101
status_code = int(status_code)
102
self.sareq.send_response(status_code, status_msg)
103
for header in other_headers:
104
key, value = header.split(':', 1)
105
value = value.lstrip()
106
self.sareq.send_header(key, value)
107
self.sareq.end_headers()