Hi
This is a slightly modified version of Andrew Kuchlings' script,
(posted a while back) to work with Twisted-0.18.0 from
http://www.twistedmatrix.com without the SMTP part.
The only problem I can still see is that of the headers from
Quixote (bar the status) ending up in the webpage.
Jon
"""qserv
Demo of an HTTP server built on top of Twisted Python that serves a
Quixote application..
"""
# 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
import quixote
quixote.enable_ptl()
publisher = Publisher('quixote.demo')
publisher.read_config('quixote.conf')
publisher.setup_logs()
class QuixoteTWRequest (server.Request):
def process(self):
environ = self.create_environment()
## this seek is important, it doesnt work without it
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()
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()