~ubuntu-branches/ubuntu/natty/moin/natty-updates

« back to all changes in this revision

Viewing changes to MoinMoin/request/request_standalone.py

  • Committer: Bazaar Package Importer
  • Author(s): Jonas Smedegaard
  • Date: 2008-06-22 21:17:13 UTC
  • mto: This revision was merged to the branch mainline in revision 18.
  • Revision ID: james.westby@ubuntu.com-20080622211713-inlv5k4eifxckelr
ImportĀ upstreamĀ versionĀ 1.7.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# -*- coding: iso-8859-1 -*-
 
2
"""
 
3
    MoinMoin - Standalone Moin Server Request Implementation
 
4
 
 
5
    @copyright: 2001-2003 Juergen Hermann <jh@web.de>,
 
6
                2003-2006 MoinMoin:ThomasWaldmann
 
7
    @license: GNU GPL, see COPYING for details.
 
8
"""
 
9
import cgi
 
10
 
 
11
from MoinMoin import log
 
12
logging = log.getLogger(__name__)
 
13
 
 
14
from MoinMoin.request import RequestBase, RemoteClosedConnection
 
15
 
 
16
class Request(RequestBase):
 
17
    """ specialized on StandAlone Server (MoinMoin.server.server_standalone) requests """
 
18
    script_name = ''
 
19
 
 
20
    def __init__(self, sa, properties={}):
 
21
        """
 
22
        @param sa: stand alone server object
 
23
        @param properties: ...
 
24
        """
 
25
        try:
 
26
            self.sareq = sa
 
27
            self.wfile = sa.wfile
 
28
            self.rfile = sa.rfile
 
29
            self.headers = sa.headers
 
30
            self.is_ssl = 0
 
31
 
 
32
            # Copy 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', '')
 
36
            try:
 
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')
 
44
 
 
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]
 
51
 
 
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)
 
57
 
 
58
            ##self.debugEnvironment(sa.headers)
 
59
 
 
60
            RequestBase.__init__(self, properties)
 
61
 
 
62
        except Exception, err:
 
63
            self.fail(err)
 
64
 
 
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'},
 
68
                                keep_blank_values=1)
 
69
        return RequestBase._setup_args_from_cgi_form(self, form)
 
70
 
 
71
    def read(self, n):
 
72
        """ Read from input stream """
 
73
        if n is None:
 
74
            logging.warning("calling request.read(None) might block")
 
75
            return self.rfile.read()
 
76
        else:
 
77
            return self.rfile.read(n)
 
78
 
 
79
    def write(self, *data):
 
80
        """ Write to output stream. """
 
81
        data = self.encode(data)
 
82
        try:
 
83
            self.wfile.write(data)
 
84
        except Exception:
 
85
            raise RemoteClosedConnection()
 
86
 
 
87
    def flush(self):
 
88
        self.wfile.flush()
 
89
 
 
90
    def finish(self):
 
91
        RequestBase.finish(self)
 
92
        self.wfile.flush()
 
93
 
 
94
    # Headers ----------------------------------------------------------
 
95
 
 
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()
 
108