[Web-SIG] httplib and 100-continue support
deron.meranda at gmail.com
Tue May 25 21:58:42 CEST 2010
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" )
conn.putheader( "Content-Length", str(data_length) )
conn.putheader( "Expect", "100-continue" )
# 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
More information about the Web-SIG