[Twisted-Python] twisted.web uses twisted.protocols
Moshe Zadka
moshez at zadka.site.co.il
Sun Apr 29 22:57:45 MDT 2001
Well, not the official version, but here's a patch:
Index: twisted/web.py
===================================================================
RCS file: /cvs/TwistedPython/twisted/web.py,v
retrieving revision 1.82
diff -c -r1.82 web.py
*** twisted/web.py 2001/04/27 13:27:37 1.82
--- twisted/web.py 2001/04/30 04:56:59
***************
*** 29,34 ****
--- 29,35 ----
from twisted import reflect
from twisted import gloop
from twisted import copyright
+ from twisted.protocols import http
# Useful constants
***************
*** 206,219 ****
! class Request:
! """web.Request(blob)
- This defines HTTP request. 'blob' is a list of lines that
- represent the request to parse.
- """
-
- content = None
code = HTTP.OK
# HTML generation helpers
--- 207,214 ----
! class Request(http.HTTPRequestHandler):
code = HTTP.OK
# HTML generation helpers
***************
*** 238,270 ****
else:
return name
! def __init__(self, blob):
! # parse the blob
! # ...
! split = string.split
! find = string.find
! lower = string.lower
!
! blobs = split(blob, '\r\n')
! reqstring = blobs.pop(0)
! received = self.received = {}
! args = self.args = {}
self.stack = []
self.headers = {}
-
- reqfields = split(reqstring, ' ')
! assert 2 <= len(reqfields) <=3, "Invalid request format."
- self.method, self.uri = reqfields[0], reqfields[1]
-
- if len(reqfields) == 2:
- # we are dealing with HTTP/0.9
- self.clientproto = "HTTP/0.9"
- else:
- self.clientproto = reqfields[2]
-
- ###self.uri = urllib.unquote(self.uri)
x = split(self.uri,'?')
if len(x) == 1:
--- 233,257 ----
else:
return name
! def _parse_argstring(self, argstring, split=string.split):
! for kvp in split(argstring, '&'):
! keyval = map(urllib.unquote, split(kvp, '='))
! if len(keyval) != 2:
! continue
! arg = self.args[key] = self.args.get(key, [])
! arg.append(value)
!
! def handleRequest(self, command, selector, version, headers, content):
! from string import split
! self.received = headers
! self.args = {}
self.stack = []
self.headers = {}
! self.method, self.uri = command, selector
! self.clientproto = version
! self.content = content
x = split(self.uri,'?')
if len(x) == 1:
***************
*** 273,311 ****
if len(x) != 2:
print "May ignore parts of this invalid URI:",repr(self.uri)
self.path, argstring = urllib.unquote(x[0]), x[1]
! for kvp in split(argstring,'&'):
! keyval = map(urllib.unquote, split(kvp, '='))
! if len(keyval)==2:
! key, value = keyval
! if args.has_key(key):
! args[key].append(value)
! else:
! args[key] = [value]
! for header in blobs:
! x = find(header,":")
! if x != -1:
! received[lower(header[:x])] = header[x+2:]
! else:
! print 'Invalid HTTP/1.1 protocol message?'
! print header
! try:
! self.requiredContent = int(received['content-length'])
! except:
! self.requiredContent = 0
def __repr__(self):
return '<%s %s %s>'% (self.method, self.uri, self.clientproto)
-
-
_host = socket.gethostbyaddr(socket.gethostname())[0]
! def process(self, server):
"Process a request."
# Log the request to a file.
print self
! self.setHeader('server', Server.version)
self.setHeader('date', date_time_string())
self.setHeader('content-type', "text/html")
self.setHeader('connection', 'close')
--- 260,279 ----
if len(x) != 2:
print "May ignore parts of this invalid URI:",repr(self.uri)
self.path, argstring = urllib.unquote(x[0]), x[1]
! self._parse_args(argstring)
! self.process()
def __repr__(self):
return '<%s %s %s>'% (self.method, self.uri, self.clientproto)
_host = socket.gethostbyaddr(socket.gethostname())[0]
! def process(self):
"Process a request."
# Log the request to a file.
print self
! self.setHeader('server', self.server.version)
self.setHeader('date', date_time_string())
self.setHeader('content-type', "text/html")
self.setHeader('connection', 'close')
***************
*** 327,336 ****
raise 'bad content-type'
# Resource Identification
! self.server = server
! self.selector = server.selector
! self.server_port = server.port
! resource = server.resource(self)
body = resource.render(self)
if body == NOT_DONE_YET:
return
--- 295,303 ----
raise 'bad content-type'
# Resource Identification
! self.selector = self.handler.server.selector
! self.server_port = self.handler.server.port
! resource = self.handler.server.resource(self)
body = resource.render(self)
if body == NOT_DONE_YET:
return
***************
*** 371,392 ****
Write some data as a result of an HTTP request. The first
time this is called, it writes out response data.
"""
! if self.startedWriting:
! self.handler.write(data)
! else:
self.startedWriting = 1
if self.clientproto != "HTTP/0.9":
message = HTTP.responses.get(self.code, "Unknown Status")
! self.write("%s %s %s\r\n" % (HTTP.protocol_version,
! str(self.code), message) )
! for header in self.headers.items():
! self.write("%s: %s\r\n" % header)
! self.write('\r\n')
! self.write(data)
def finish(self):
! self.handler.stopConsuming()
! del self.handler
def setHeader(self, k, v):
self.headers[string.lower(k)] = v
--- 338,355 ----
Write some data as a result of an HTTP request. The first
time this is called, it writes out response data.
"""
! if not self.startedWriting:
self.startedWriting = 1
if self.clientproto != "HTTP/0.9":
message = HTTP.responses.get(self.code, "Unknown Status")
! self.sendStatus(self.code, message)
! for name, value in self.headers.items():
! self.sendHeader(name, value)
! self.endHeaders()
! self.handler.write(data)
def finish(self):
! self.handler.close()
def setHeader(self, k, v):
self.headers[string.lower(k)] = v
***************
*** 1393,1447 ****
class HTTPHandler(net.GenericHandler):
! contentLength = 0
request = None
- recvd = ""
def connectionLost(self, reason):
self.request = None
net.GenericHandler.connectionLost(self, reason)
- def _process(self, request):
- """ (private) """
- request.handler = self
- request.process(self.server)
-
def handleData(self, data):
! recvd = self.recvd = self.recvd + data
! if not self.request:
! # HTTP/0.9 special handling.
! firstend = string.find(recvd, '\r\n')
! reqend = -1
! if firstend != -1:
! first = recvd[:firstend]
! spaces = string.count(first, ' ')
! if spaces == 1:
! # we are HTTP/0.9
! reqend = firstend
!
! if reqend < 0:
! # we didn't encounter 0.9, so proceed normally.
! reqend = string.find(recvd, '\r\n\r\n')
!
! if reqend != -1:
! reqdata = recvd[:reqend]
! self.recvd = recvd = recvd[reqend+4:]
!
! request = Request(reqdata)
! request.client = self.client
! request.handler = self
! cl = request.requiredContent
! if cl:
! self.contentLength = cl
! self.request = request
! else:
! self._process(request)
! return
! if self.contentLength:
! if len(self.recvd) >= self.contentLength:
! self.request.content = recvd[:self.contentLength]
! self._process(self.request)
class Server(net.GenericServer, authenticator.SessionManager, config.Configurable):
handler = HTTPHandler
--- 1356,1376 ----
class HTTPHandler(net.GenericHandler):
!
request = None
def connectionLost(self, reason):
self.request = None
net.GenericHandler.connectionLost(self, reason)
def handleData(self, data):
! if self.request is None:
! self.request = Request(self)
! self.request.server = self.server
! self.request.handleData(data)
! def close(self):
! self.loseConnection()
class Server(net.GenericServer, authenticator.SessionManager, config.Configurable):
handler = HTTPHandler
More information about the Twisted-Python
mailing list