mirror of
https://github.com/python/cpython.git
synced 2025-11-24 20:30:18 +00:00
Patch #1065257: Support passing open files as body in
HTTPConnection.request().
This commit is contained in:
parent
1ee79f16e8
commit
040a927cd1
4 changed files with 44 additions and 3 deletions
|
|
@ -304,9 +304,14 @@ Example: \code{httplib.responses[httplib.NOT_FOUND]} is \code{'Not Found'}.
|
||||||
This will send a request to the server using the HTTP request method
|
This will send a request to the server using the HTTP request method
|
||||||
\var{method} and the selector \var{url}. If the \var{body} argument is
|
\var{method} and the selector \var{url}. If the \var{body} argument is
|
||||||
present, it should be a string of data to send after the headers are finished.
|
present, it should be a string of data to send after the headers are finished.
|
||||||
|
Alternatively, it may be an open file object, in which case the
|
||||||
|
contents of the file is sent; this file object should support
|
||||||
|
\code{fileno()} and \code{read()} methods.
|
||||||
The header Content-Length is automatically set to the correct value.
|
The header Content-Length is automatically set to the correct value.
|
||||||
The \var{headers} argument should be a mapping of extra HTTP headers to send
|
The \var{headers} argument should be a mapping of extra HTTP headers to send
|
||||||
with the request.
|
with the request.
|
||||||
|
|
||||||
|
\versionchanged[\var{body} can be a file object]{2.6}
|
||||||
\end{methoddesc}
|
\end{methoddesc}
|
||||||
|
|
||||||
\begin{methoddesc}{getresponse}{}
|
\begin{methoddesc}{getresponse}{}
|
||||||
|
|
|
||||||
|
|
@ -704,7 +704,15 @@ class HTTPConnection:
|
||||||
if self.debuglevel > 0:
|
if self.debuglevel > 0:
|
||||||
print "send:", repr(str)
|
print "send:", repr(str)
|
||||||
try:
|
try:
|
||||||
self.sock.sendall(str)
|
blocksize=8192
|
||||||
|
if hasattr(str,'read') :
|
||||||
|
if self.debuglevel > 0: print "sendIng a read()able"
|
||||||
|
data=str.read(blocksize)
|
||||||
|
while data:
|
||||||
|
self.sock.sendall(data)
|
||||||
|
data=str.read(blocksize)
|
||||||
|
else:
|
||||||
|
self.sock.sendall(str)
|
||||||
except socket.error, v:
|
except socket.error, v:
|
||||||
if v[0] == 32: # Broken pipe
|
if v[0] == 32: # Broken pipe
|
||||||
self.close()
|
self.close()
|
||||||
|
|
@ -879,7 +887,21 @@ class HTTPConnection:
|
||||||
self.putrequest(method, url, **skips)
|
self.putrequest(method, url, **skips)
|
||||||
|
|
||||||
if body and ('content-length' not in header_names):
|
if body and ('content-length' not in header_names):
|
||||||
self.putheader('Content-Length', str(len(body)))
|
thelen=None
|
||||||
|
try:
|
||||||
|
thelen=str(len(body))
|
||||||
|
except TypeError, te:
|
||||||
|
# If this is a file-like object, try to
|
||||||
|
# fstat its file descriptor
|
||||||
|
import os
|
||||||
|
try:
|
||||||
|
thelen = str(os.fstat(body.fileno()).st_size)
|
||||||
|
except (AttributeError, OSError):
|
||||||
|
# Don't send a length if this failed
|
||||||
|
if self.debuglevel > 0: print "Cannot stat!!"
|
||||||
|
|
||||||
|
if thelen is not None:
|
||||||
|
self.putheader('Content-Length',thelen)
|
||||||
for hdr, value in headers.iteritems():
|
for hdr, value in headers.iteritems():
|
||||||
self.putheader(hdr, value)
|
self.putheader(hdr, value)
|
||||||
self.endheaders()
|
self.endheaders()
|
||||||
|
|
|
||||||
|
|
@ -10,9 +10,10 @@ class FakeSocket:
|
||||||
def __init__(self, text, fileclass=StringIO.StringIO):
|
def __init__(self, text, fileclass=StringIO.StringIO):
|
||||||
self.text = text
|
self.text = text
|
||||||
self.fileclass = fileclass
|
self.fileclass = fileclass
|
||||||
|
self.data = ''
|
||||||
|
|
||||||
def sendall(self, data):
|
def sendall(self, data):
|
||||||
self.data = data
|
self.data += data
|
||||||
|
|
||||||
def makefile(self, mode, bufsize=None):
|
def makefile(self, mode, bufsize=None):
|
||||||
if mode != 'r' and mode != 'rb':
|
if mode != 'r' and mode != 'rb':
|
||||||
|
|
@ -133,6 +134,16 @@ class BasicTest(TestCase):
|
||||||
self.fail("Did not expect response from HEAD request")
|
self.fail("Did not expect response from HEAD request")
|
||||||
resp.close()
|
resp.close()
|
||||||
|
|
||||||
|
def test_send_file(self):
|
||||||
|
expected = 'GET /foo HTTP/1.1\r\nHost: example.com\r\n' \
|
||||||
|
'Accept-Encoding: identity\r\nContent-Length:'
|
||||||
|
|
||||||
|
body = open(__file__, 'rb')
|
||||||
|
conn = httplib.HTTPConnection('example.com')
|
||||||
|
sock = FakeSocket(body)
|
||||||
|
conn.sock = sock
|
||||||
|
conn.request('GET', '/foo', body)
|
||||||
|
self.assertTrue(sock.data.startswith(expected))
|
||||||
|
|
||||||
class OfflineTest(TestCase):
|
class OfflineTest(TestCase):
|
||||||
def test_responses(self):
|
def test_responses(self):
|
||||||
|
|
|
||||||
|
|
@ -96,6 +96,9 @@ Core and builtins
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Patch #1065257: Support passing open files as body in
|
||||||
|
HTTPConnection.request().
|
||||||
|
|
||||||
- Bug #1569790: mailbox.py: Maildir.get_folder() and MH.get_folder()
|
- Bug #1569790: mailbox.py: Maildir.get_folder() and MH.get_folder()
|
||||||
weren't passing the message factory on to newly created Maildir/MH
|
weren't passing the message factory on to newly created Maildir/MH
|
||||||
objects.
|
objects.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue