Select weirdness

Ron Garret rNOSPAMon at flownet.com
Sun Apr 22 18:31:52 CEST 2007


In article <462b3e47$0$326$e4fe514c at news.xs4all.nl>,
 Irmen de Jong <irmen.NOSPAM at xs4all.nl> wrote:

> Ron Garret wrote:
> > Here's my code.  It's a teeny weeny little HTTP server.  (I'm not really 
> > trying to reinvent the wheel here.  What I'm really doing is writing a 
> > dispatching proxy server, but this is the shortest way to illustrate the 
> > problem I'm having):
> > 
> > from SocketServer import *
> > from socket import *
> > from select import select
> > 
> > class myHandler(StreamRequestHandler):
> >   def handle(self):
> >     print '>>>>>>>>>>>'
> >     while 1:
> >       sl = select([self.rfile],[],[])[0]
> >       if sl:
> >         l = self.rfile.readline()
> >         if len(l)<3: break
> >         print l,
> >         pass
> >       pass
> >     print>>self.wfile, 'HTTP/1.0 200 OK'
> >     print>>self.wfile, 'Content-type: text/plain'
> >     print>>self.wfile
> >     print>>self.wfile, 'foo'
> >     self.rfile.close()
> >     self.wfile.close()
> >     print '<<<<<<<<<<<<'
> >     pass
> >   pass
> 
> 
> You shouldn't use a select() of your own inside the handle method.
> The socketserver takes care of that for you.

I don't understand why socketserver calling select should matter.  (And 
BTW, there are no calls to select in SocketServer.py.  I'm using 
Python2.5.)

> What you need to do is read the input from the socket until you've reached
> the end-of-input marker. That marker is an empty line containing just "\r\n"
> when dealing with HTTP GET requests.
>
> Any reason don't want to use the BasicHTTPServer that comes with Python?

Yes, but it's a long story.  What I'm really doing is writing a 
dispatching proxy.  It reads the HTTP request and then redirects it to a 
number of different servers depending on the URL.  The servers are all 
local and served off of unix sockets, not TCP sockets (which is why I 
can't just configure Apache to do this).

The reason I'm running this weird configuration (in case you're 
wondering) is because this is a development machine and multiple copies 
of the same website run on it simultaneously.  Each copy of the site 
runs a customized server to handle AJAX requests efficiently.

> 
> Anyway, try the following instead:
> 

That won't work for POST requests.

rg



More information about the Python-list mailing list