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

glyph@twistedmatrix.com wrote :-> From: Itamar Shtull-Trauring <twisted@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 here. Jon """qserv 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 quixote.enable_ptl() publisher = Publisher('quixote.demo') publisher.read_config('quixote.conf') publisher.setup_logs() class QuixoteTWRequest (http.Request): def process(self): environ = self.create_environment() ## this seek is important self.content.seek(0,0) stdin = self.content request = HTTPRequest(stdin, environ) stdout = cStringIO.StringIO() stderr = cStringIO.StringIO() publisher.publish(stdin, stdout, stderr, environ) output = stdout.getvalue() #self.write(output) #self.setResponseCode(request.response.status_code) #for hdr, value in request.response.headers.items(): # self.setHeader(hdr, value) #self.finish() ## as per message on quixote list self.startedWriting = 1 self.write(output.replace("Status:", "HTTP/1.1")) self.finish() def create_environment (self): host = self.getHeader('host') or self.getHost() if ':' in host: serverName = string.split(host, ':')[0] else: 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()) app.run(save=0) if __name__ == '__main__': run()
participants (1)
-
Jon Dyte