[Twisted-Python] no 'headers' in server.Request instance problem

Jon Dyte jon at totient.demon.co.uk
Thu Jun 13 13:51:17 EDT 2002

glyph at twistedmatrix.com wrote :-> From: Itamar Shtull-Trauring <twisted at itamarst.org>
> Subject: Re: [Twisted-Python] no 'headers' in server.Request instance problem
> Date: Thu, 13 Jun 2002 01:37:41 +0200
> > BTW - you don't need to use twisted.web.server.Request - since the 
> > refactor to HTTP you only need twisted.protocols.http.Request, no need 
> > to use twisted.web unless you are using it as a web framework.
> Actually you don't need to use Request at all.  If you want this to work with
> other twisted.web servers, it would be best to structure your work as additions
> to Resource, not Request.
> What functionality are you adding at the Request level?
> -- 
>  |    <`'>    |  Glyph Lefkowitz: Traveling Sorcerer  |
>  |   < _/ >   |  Lead Developer,  the Twisted project  |
>  |  < ___/ >  |      http://www.twistedmatrix.com      |

I'm not really adding any functionality. I was merely making a
previous Twisted/Quixote script work with Twisted-0.18.0, which is how
I found the reported problem. This script is so short I include it



Demo of an HTTP server built on top of Twisted Python that serves a
Quixote application, and also supports an SMTP interface.


# created 2002/03/19, AMK

__revision__ = "$Id$"

import string, cStringIO

from quixote.http_request import HTTPRequest
from quixote.publish import Publisher

from twisted.cred.service import Service
from twisted.internet.app import Application
from twisted.mail import mail
from twisted.protocols import protocol, http
from twisted.web import server

# Ports this server will listen on
HTTP_PORT = 8098
SMTP_PORT = 8099

import quixote

publisher = Publisher('quixote.demo')

class QuixoteTWRequest (http.Request):
    def process(self):
        environ = self.create_environment()
        ## this seek is important
        stdin = self.content
        request = HTTPRequest(stdin, environ)
        stdout = cStringIO.StringIO()
        stderr = cStringIO.StringIO()

        publisher.publish(stdin, stdout, stderr, environ)
        output = stdout.getvalue()
        #for hdr, value in request.response.headers.items():
        #    self.setHeader(hdr, value)
	## as per message on quixote list
        self.startedWriting = 1
        self.write(output.replace("Status:", "HTTP/1.1"))

    def create_environment (self):
        host = self.getHeader('host') or self.getHost()
        if ':' in host:
            serverName = string.split(host, ':')[0]
            serverName = host
        content_type = self.getHeader('content-type')
        typ, remote_addr, remote_port = self.transport.getPeer()

        env = {
               "PATH_INFO":         self.path,
               "SERVER_SOFTWARE":   server.version,
               "SERVER_NAME":       serverName,
               "GATEWAY_INTERFACE": "CGI/1.1",
               "REMOTE_ADDR":       remote_addr,
               "REMOTE_PORT":       str(remote_port),
               "SERVER_PROTOCOL":   self.clientproto,
               "SERVER_PORT":       str(HTTP_PORT),
               "REQUEST_METHOD":    self.method,
               "SCRIPT_NAME":       "",
               "SCRIPT_FILENAME":   "",
               "REQUEST_URI":       self.uri,
               "CONTENT_TYPE":      content_type,
        return env

class QuixoteFactory (http.HTTPFactory):
    def buildProtocol (self, addr):
        h = http.HTTPChannel()
        h.requestFactory = QuixoteTWRequest
        h.factory = self
        return h

def run ():
    app = Application('Quixote')
    app.listenTCP(HTTP_PORT, QuixoteFactory())

if __name__ == '__main__':

More information about the Twisted-Python mailing list