view MoinMoin/request/ @ 1116:4aae51ce0172

support if-modified-since and if-none-match for Twisted, Standalone and CLI, cleanup
author Thomas Waldmann <tw AT waldmann-edv DOT de>
date Tue, 01 Aug 2006 10:21:06 +0200
parents e30022bc628f
children 91ffa85ac616
line wrap: on
line source
# -*- coding: iso-8859-1 -*-
    MoinMoin - Standalone Moin Server Request Implementation

    @copyright: 2001-2003 by Jürgen Hermann <>,
                2003-2006 MoinMoin:ThomasWaldmann
    @license: GNU GPL, see COPYING for details.
import sys, os, cgi

from MoinMoin import config
from MoinMoin.request import RequestBase

class Request(RequestBase):
    """ specialized on StandAlone Server (MoinMoin.server.standalone) requests """
    script_name = ''

    def __init__(self, sa, properties={}):
        @param sa: stand alone server object
        @param properties: ...
            self.sareq = sa
            self.wfile = sa.wfile
            self.rfile = sa.rfile
            self.headers = sa.headers
            self.is_ssl = 0

            # Copy headers
            self.http_accept_language = (sa.headers.getheader('accept-language')
                                         or self.http_accept_language)
            self.http_user_agent = sa.headers.getheader('user-agent', '')
            co = filter(None, sa.headers.getheaders('cookie'))
            self.saved_cookie = ', '.join(co) or ''
            self.if_modified_since = (sa.headers.getheader('if-modified-since')
                                      or self.if_modified_since)
            self.if_none_match = (sa.headers.getheader('if-none-match')
                                  or self.if_none_match)

            # Copy rest from standalone request   
            self.server_name = sa.server.server_name
            self.server_port = str(sa.server.server_port)
            self.request_method = sa.command
            self.request_uri = sa.path
            self.remote_addr = sa.client_address[0]

            # Values that need more work                        
            self.path_info, self.query_string = self.splitURI(sa.path)


            RequestBase.__init__(self, properties)

        except Exception, err:

    def _setup_args_from_cgi_form(self):
        """ Override to create standalone form """
        form = cgi.FieldStorage(self.rfile, headers=self.headers, environ={'REQUEST_METHOD': 'POST'})
        return RequestBase._setup_args_from_cgi_form(self, form)

    def read(self, n=None):
        """ Read from input stream
        Since will block, content-length will be used instead.
        TODO: test with n > content length, or when calling several times
        with smaller n but total over content length.
        if n is None:
                n = int(self.headers.get('content-length'))
            except (TypeError, ValueError):
                import warnings
                warnings.warn("calling when content-length is "
                              "not available will block")

    def write(self, *data):
        """ Write to output stream. """

    def flush(self):

    def finish(self):

    # Headers ----------------------------------------------------------

    def _emit_http_headers(self, headers):
        """ private method to send out preprocessed list of HTTP headers """
        st_header, other_headers = headers[0], headers[1:]
        status = st_header.split(':', 1)[1].lstrip()
        status_code, status_msg = status.split(' ', 1)
        status_code = int(status_code)
        self.sareq.send_response(status_code, status_msg)
        for header in other_headers:
            key, value = header.split(':', 1)
            value = value.lstrip()
            self.sareq.send_header(key, value)