diff options
author | Martin v. Löwis <martin@v.loewis.de> | 2006-11-12 10:32:47 (GMT) |
---|---|---|
committer | Martin v. Löwis <martin@v.loewis.de> | 2006-11-12 10:32:47 (GMT) |
commit | 040a927cd14e799454b246dd1f56fd7f4fdff03a (patch) | |
tree | 1d7e405492eecb89f90faf3751ee0368a81f2a56 /Lib/httplib.py | |
parent | 1ee79f16e859fd0a6ea3af64a539b5198b8ab7a3 (diff) | |
download | cpython-040a927cd14e799454b246dd1f56fd7f4fdff03a.zip cpython-040a927cd14e799454b246dd1f56fd7f4fdff03a.tar.gz cpython-040a927cd14e799454b246dd1f56fd7f4fdff03a.tar.bz2 |
Patch #1065257: Support passing open files as body in
HTTPConnection.request().
Diffstat (limited to 'Lib/httplib.py')
-rw-r--r-- | Lib/httplib.py | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/Lib/httplib.py b/Lib/httplib.py index 5ae5efc..1e0037f 100644 --- a/Lib/httplib.py +++ b/Lib/httplib.py @@ -704,7 +704,15 @@ class HTTPConnection: if self.debuglevel > 0: print "send:", repr(str) 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: if v[0] == 32: # Broken pipe self.close() @@ -879,7 +887,21 @@ class HTTPConnection: self.putrequest(method, url, **skips) 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(): self.putheader(hdr, value) self.endheaders() |