[Twisted-Python] twisted.web uses twisted.protocols
![](https://secure.gravatar.com/avatar/faeb19fbb879e56c1be4a300cfd80ec8.jpg?s=120&d=mm&r=g)
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
participants (1)
-
Moshe Zadka