Select weirdness

Ron Garret rNOSPAMon at flownet.com
Mon Apr 23 03:33:22 EDT 2007


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

> Ron Garret wrote:
> > 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.)
> 
> You don't *need* a select at all.

Yes I do, because what I'm really writing is a dispatching proxy that 
has to serve many simultaneous connections.

Here's the full story in case you're interested: We have an application 
that is currently fielded as a cgi.  We have a development server that 
needs to run multiple copies of the application at the same time.  This 
is so that developers can push changes into their private "sandboxes" 
for evaluation before going into the main development branch.  Each 
sandbox has its own source tree, its own database, and its own URL 
namespace.

There are a small number of URLs in the application that are performance 
bottlenecks (they are used to serve AJAX updates).  In order to 
alleviate that bottleneck without having to rewrite the whole 
application to run under mod_python or some such thing we've written a 
special dedicated server that handles only the AJAX requests.

The tricky part is that each developer needs to have their own copy of 
this server running because each developer can have different code that 
needs to run to serve those requests.  Assigning each developer a 
dedicated IP port would be a configuration nightmare, so these servers 
serve run on unix sockets rather than TCP sockets.

I have not been able to find a proxy server that can proxy to unix 
sockets, so I need to write my own.  Conceptually its a very simple 
thing: read the first line of an HTTP request, parse it with a regexp to 
extract the sandbox name, connect to the appropriate unix server socket, 
and then bidirectionally pipe bytes back and forth.  But it has to do 
this for multiple connections simultaneously, which is why I need select.

> >> Anyway, try the following instead:
> >>
> > 
> > That won't work for POST requests.
> >
> 
> Why not?

Because POST requests can be very complicated.

> Just add some more code to deal with the POST request body.

I was really hoping to avoid having to write a fully HTTP-aware proxy.

> There should be a content-length header to tell you how many
> bytes to read after the header section has finished.

Not if the content-transfer-encoding is chunked.  Or if there are 
multiple file attachments.

Also, even GET requests can become very complicated (from a protocol 
point of view) in HTTP 1.1.

rg



More information about the Python-list mailing list