I'm trying to use httplib to make a PUT request.  I'd like to
be able to correctly use the 100-continue expectation
handshake as HTTP/1.1 recommends, such that I wait for
a 100 status code back before I send the body.  The only
examples I've found immediately send the request body
without waiting for a 100 status return.


I'd like to do something similar to:

-----
conn = httplib.HTTPConnection( ... )
conn.putrequest( "PUT", url )
if data_length is None:
    conn.putheader( "Transfer-Encoding", "chunked" )
else:
    conn.putheader( "Content-Length", str(data_length) )
conn.putheader( "Expect", "100-continue" )
conn.endheaders()

# Wait for any of: timeout, 100, or other error status

if timeout or got_100:
    # Start sending data using conn.send() method
-----

There are two problems trying to do this:

1. The endheaders() doesn't actually send any data.
You have to do a conn.send( "" ) with an empty string
for the headers to get to the server, which is needed
before it can then send back a 100 (or other status code).

2. There's no way to wait for a 100 response, or wait for
a response with a timeout -- both of which are needed
to do the 100-continue logic of HTTP/1.1.

Solving #1 is easy, as long as you know to do it.

Solving #2 appears to require changes to the httplib
library.  Something along the lines of adding additional
optional arguments to the getresponse() method, as in:

resp = conn.getresponse( ignore_continue=False, timeout=5 )

if resp is None:
   # timeout occured
elif resp.status == httplib.CONTINUE:
   # got 100 continue
elif resp.status == httplib.EXPECTATION_FAILED:
   # server doesn't understand 100-continue
elif resp.status == httplib.REQUEST_ENTITY_TOO_LARGE:
   # message too large for server
elif resp.status == httplib.LENGTH_REQUIRED:
   # can't do chunked encoding, etc.


Is there in fact some way to do this that I'm missing, and if
not is this something that makes sense to try to fix in
httplib?

-- 
Deron Meranda
http://deron.meranda.us/
_______________________________________________
Web-SIG mailing list
Web-SIG@python.org
Web SIG: http://www.python.org/sigs/web-sig
Unsubscribe: 
http://mail.python.org/mailman/options/web-sig/archive%40mail-archive.com

Reply via email to