[Twisted-Python] First Port to twisted.protocols

Moshe Zadka moshez at zadka.site.co.il
Tue Apr 17 15:24:15 EDT 2001


On Tue, 17 Apr 2001 21:58:38 +0300, Moshe Zadka <moshez at zadka.site.co.il> wrote:
 
> Here's a first rough patch to do that:
> 
> Please do *not* apply it -- I've got some ideas about improving the
> HTTP handlers to make it even smoother.
> 
> Stay tuned!

Thank you for your patience.
A new patch attached, which uses the most work-saving features of
HTTPHandler to make the actual code which handles HTTP short
and highlevel.
-- 
"I'll be ex-DPL soon anyway so I'm        |LUKE: Is Perl better than Python?
looking for someplace else to grab power."|YODA: No...no... no. Quicker,
   -- Wichert Akkerman (on debian-private)|      easier, more seductive.
For public key, finger moshez at debian.org  |http://www.{python,debian,gnu}.org

Index: twisted/web.py
===================================================================
RCS file: /cvs/TwistedPython/twisted/web.py,v
retrieving revision 1.81
diff -c -r1.81 web.py
*** twisted/web.py	2001/04/12 17:32:14	1.81
--- twisted/web.py	2001/04/17 19:18:47
***************
*** 29,34 ****
--- 29,36 ----
  from twisted import reflect
  from twisted import gloop
  from twisted import copyright
+ import twisted.protocols.http
+ from twisted import protocols
  
  # Useful constants
  
***************
*** 238,280 ****
              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:
!             self.path = urllib.unquote(self.uri)
          else:
              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):
--- 240,265 ----
              else:
                  return name
  
!     def __init__(self, method, uri, version, request):
!         from string import split
! 
!         received = self.received = request
          args = self.args = {}
          self.stack = []
          self.headers = {}
  
!         self.method, self.uri, self.clientproto = method, uri, version
!         self.uri = urllib.unquote(self.uri)
          x = split(self.uri,'?')
  
          if len(x) == 1:
!             self.path = self.uri
          else:
              if len(x) != 2:
                  print "May ignore parts of this invalid URI:",repr(self.uri)
!             self.path, argstring = x[0], x[1]
              for kvp in split(argstring,'&'):
!                 keyval = split(kvp, '=')
                  if len(keyval)==2:
                      key, value = keyval
                      if args.has_key(key):
***************
*** 282,304 ****
                      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):
--- 267,277 ----
                      else:
                          args[key] = [value]
  
!         self.content = request.fp.read()
  
      def __repr__(self):
          return '<%s %s %s>'% (self.method, self.uri, self.clientproto)
  
      _host = socket.gethostbyaddr(socket.gethostname())[0]
  
      def process(self, server):
***************
*** 370,387 ****
          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()
--- 343,357 ----
          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.handler.sendStatus(self.code, message)
!                 for header, value in self.headers.items():
!                     self.handler.sendHeader(header, value)
!                 self.handler.endHeaders
!         self.handler.write(data)
  
      def finish(self):
          self.handler.stopConsuming()
***************
*** 1386,1441 ****
              return page
  
  
! 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,1372 ----
              return page
  
  
! class HTTPHandler(net.GenericHandler, protocols.http.HTTPHandler):
  
      def connectionLost(self, reason):
          self.request = None
          net.GenericHandler.connectionLost(self, reason)
  
!     def handleRFC822Request(self, command, selector, version, request):
!         self.request = Request(command, selector, version, request)
!         self.request.handler = self
!         self.request.process(self.server)
  
  
  class Server(net.GenericServer, authenticator.SessionManager, config.Configurable):
      handler = HTTPHandler





More information about the Twisted-Python mailing list