summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/httplib.py41
1 files changed, 26 insertions, 15 deletions
diff --git a/Lib/httplib.py b/Lib/httplib.py
index 34ed2da..d9fd6dd 100644
--- a/Lib/httplib.py
+++ b/Lib/httplib.py
@@ -479,6 +479,7 @@ class HTTPConnection:
def __init__(self, host, port=None, strict=None):
self.sock = None
+ self._buffer = []
self.__response = None
self.__state = _CS_IDLE
@@ -543,7 +544,7 @@ class HTTPConnection:
else:
raise NotConnected()
- # send the data to the server. if we get a broken pipe, then close
+ # send the data to the server. if we get a broken pipe, then closesdwu
# the socket. we want to reconnect when somebody tries to send again.
#
# NOTE: we DO propagate the error, though, because we cannot simply
@@ -557,6 +558,23 @@ class HTTPConnection:
self.close()
raise
+ def _output(self, s):
+ """Add a line of output to the current request buffer.
+
+ Aassumes that the line does *not* end with \r\n.
+ """
+ self._buffer.append(s)
+
+ def _send_output(self):
+ """Send the currently buffered request and clear the buffer.
+
+ Appends an extra \r\n to the buffer.
+ """
+ self._buffer.extend(("", ""))
+ msg = "\r\n".join(self._buffer)
+ del self._buffer[:]
+ self.send(msg)
+
def putrequest(self, method, url, skip_host=0):
"""Send a request to the server.
@@ -565,6 +583,7 @@ class HTTPConnection:
"""
# check if a prior response has been completed
+ # XXX What if it hasn't?
if self.__response and self.__response.isclosed():
self.__response = None
@@ -594,16 +613,9 @@ class HTTPConnection:
if not url:
url = '/'
- str = '%s %s %s\r\n' % (method, url, self._http_vsn_str)
+ str = '%s %s %s' % (method, url, self._http_vsn_str)
- try:
- self.send(str)
- except socket.error, v:
- # trap 'Broken pipe' if we're allowed to automatically reconnect
- if v[0] != 32 or not self.auto_open:
- raise
- # try one more time (the socket was closed; this will reopen)
- self.send(str)
+ self._output(str)
if self._http_vsn == 11:
# Issue some standard headers for better HTTP/1.1 compliance
@@ -664,8 +676,8 @@ class HTTPConnection:
if self.__state != _CS_REQ_STARTED:
raise CannotSendHeader()
- str = '%s: %s\r\n' % (header, value)
- self.send(str)
+ str = '%s: %s' % (header, value)
+ self._output(str)
def endheaders(self):
"""Indicate that the last header line has been sent to the server."""
@@ -675,7 +687,7 @@ class HTTPConnection:
else:
raise CannotSendHeader()
- self.send('\r\n')
+ self._send_output()
def request(self, method, url, body=None, headers={}):
"""Send a complete request to the server."""
@@ -1202,6 +1214,7 @@ def test():
):
print "https://%s%s" % (host, selector)
hs = HTTPS()
+ hs.set_debuglevel(dl)
hs.connect(host)
hs.putrequest('GET', selector)
hs.endheaders()
@@ -1214,8 +1227,6 @@ def test():
for header in headers.headers: print header.strip()
print
- return
-
# Test a buggy server -- returns garbled status line.
# http://www.yahoo.com/promotions/mom_com97/supermom.html
c = HTTPConnection("promotions.yahoo.com")