blob: 5593b39b0e4f1c9c50b1d78a63238bbc7f4a2b46 [file] [log] [blame]
Greg Stein5e0fa402000-06-26 08:28:01 +00001"""HTTP/1.1 client library
Guido van Rossum41999c11997-12-09 00:12:23 +00002
Greg Stein5e0fa402000-06-26 08:28:01 +00003<intro stuff goes here>
4<other stuff, too>
Guido van Rossum41999c11997-12-09 00:12:23 +00005
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006HTTPConnection goes through a number of "states", which define when a client
Greg Stein5e0fa402000-06-26 08:28:01 +00007may legally make another request or fetch the response for a particular
8request. This diagram details these state transitions:
Guido van Rossum41999c11997-12-09 00:12:23 +00009
Greg Stein5e0fa402000-06-26 08:28:01 +000010 (null)
11 |
12 | HTTPConnection()
13 v
14 Idle
15 |
16 | putrequest()
17 v
18 Request-started
19 |
20 | ( putheader() )* endheaders()
21 v
22 Request-sent
23 |
24 | response = getresponse()
25 v
26 Unread-response [Response-headers-read]
27 |\____________________
Tim Peters5ceadc82001-01-13 19:16:21 +000028 | |
29 | response.read() | putrequest()
30 v v
31 Idle Req-started-unread-response
32 ______/|
33 / |
34 response.read() | | ( putheader() )* endheaders()
35 v v
36 Request-started Req-sent-unread-response
37 |
38 | response.read()
39 v
40 Request-sent
Greg Stein5e0fa402000-06-26 08:28:01 +000041
42This diagram presents the following rules:
43 -- a second request may not be started until {response-headers-read}
44 -- a response [object] cannot be retrieved until {request-sent}
45 -- there is no differentiation between an unread response body and a
46 partially read response body
47
48Note: this enforcement is applied by the HTTPConnection class. The
49 HTTPResponse class does not enforce this state machine, which
50 implies sophisticated clients may accelerate the request/response
51 pipeline. Caution should be taken, though: accelerating the states
52 beyond the above pattern may imply knowledge of the server's
53 connection-close behavior for certain requests. For example, it
54 is impossible to tell whether the server will close the connection
55 UNTIL the response headers have been read; this means that further
56 requests cannot be placed into the pipeline until it is known that
57 the server will NOT be closing the connection.
58
59Logical State __state __response
60------------- ------- ----------
61Idle _CS_IDLE None
62Request-started _CS_REQ_STARTED None
63Request-sent _CS_REQ_SENT None
64Unread-response _CS_IDLE <response_class>
65Req-started-unread-response _CS_REQ_STARTED <response_class>
66Req-sent-unread-response _CS_REQ_SENT <response_class>
Guido van Rossum41999c11997-12-09 00:12:23 +000067"""
Guido van Rossum23acc951994-02-21 16:36:04 +000068
Barry Warsaw820c1202008-06-12 04:06:45 +000069import email.parser
70import email.message
Serhiy Storchakae4db7692014-12-23 16:28:28 +020071import http
Jeremy Hylton636950f2009-03-28 04:34:21 +000072import io
73import os
74import socket
Senthil Kumaran7bc0d872010-12-19 10:49:52 +000075import collections
Jeremy Hylton1afc1692008-06-18 20:49:58 +000076from urllib.parse import urlsplit
Guido van Rossum23acc951994-02-21 16:36:04 +000077
Thomas Wouters47b49bf2007-08-30 22:15:33 +000078__all__ = ["HTTPResponse", "HTTPConnection",
Skip Montanaro951a8842001-06-01 16:25:38 +000079 "HTTPException", "NotConnected", "UnknownProtocol",
Jeremy Hylton7c75c992002-06-28 23:38:14 +000080 "UnknownTransferEncoding", "UnimplementedFileMode",
81 "IncompleteRead", "InvalidURL", "ImproperConnectionState",
82 "CannotSendRequest", "CannotSendHeader", "ResponseNotReady",
Georg Brandl6aab16e2006-02-17 19:17:25 +000083 "BadStatusLine", "error", "responses"]
Skip Montanaro2dd42762001-01-23 15:35:05 +000084
Guido van Rossum23acc951994-02-21 16:36:04 +000085HTTP_PORT = 80
Guido van Rossum09c8b6c1999-12-07 21:37:17 +000086HTTPS_PORT = 443
87
Greg Stein5e0fa402000-06-26 08:28:01 +000088_UNKNOWN = 'UNKNOWN'
89
90# connection states
91_CS_IDLE = 'Idle'
92_CS_REQ_STARTED = 'Request-started'
93_CS_REQ_SENT = 'Request-sent'
94
Martin v. Löwis39a31782004-09-18 09:03:49 +000095
Serhiy Storchakae4db7692014-12-23 16:28:28 +020096# hack to maintain backwards compatibility
97globals().update(http.HTTPStatus.__members__)
Martin v. Löwis39a31782004-09-18 09:03:49 +000098
Serhiy Storchakae4db7692014-12-23 16:28:28 +020099# another hack to maintain backwards compatibility
Georg Brandl6aab16e2006-02-17 19:17:25 +0000100# Mapping status codes to official W3C names
Serhiy Storchakae4db7692014-12-23 16:28:28 +0200101responses = {v: v.phrase for v in http.HTTPStatus.__members__.values()}
Georg Brandl6aab16e2006-02-17 19:17:25 +0000102
Georg Brandl80ba8e82005-09-29 20:16:07 +0000103# maximal amount of data to read at one time in _safe_read
104MAXAMOUNT = 1048576
105
Senthil Kumaran5466bf12010-12-18 16:55:23 +0000106# maximal line length when calling readline().
107_MAXLINE = 65536
Georg Brandlbf3f8eb2013-10-27 07:34:48 +0100108_MAXHEADERS = 100
109
Senthil Kumaran5466bf12010-12-18 16:55:23 +0000110
Barry Warsaw820c1202008-06-12 04:06:45 +0000111class HTTPMessage(email.message.Message):
Jeremy Hylton6c5e28c2009-03-31 14:35:53 +0000112 # XXX The only usage of this method is in
113 # http.server.CGIHTTPRequestHandler. Maybe move the code there so
114 # that it doesn't need to be part of the public API. The API has
115 # never been defined so this could cause backwards compatibility
116 # issues.
117
Barry Warsaw820c1202008-06-12 04:06:45 +0000118 def getallmatchingheaders(self, name):
119 """Find all header lines matching a given header name.
Jeremy Hylton6d0a4c72002-07-07 16:51:37 +0000120
Barry Warsaw820c1202008-06-12 04:06:45 +0000121 Look through the list of headers and find all lines matching a given
122 header name (and their continuation lines). A list of the lines is
123 returned, without interpretation. If the header does not occur, an
124 empty list is returned. If the header occurs multiple times, all
125 occurrences are returned. Case is not important in the header name.
Jeremy Hylton6d0a4c72002-07-07 16:51:37 +0000126
Jeremy Hylton6d0a4c72002-07-07 16:51:37 +0000127 """
Barry Warsaw820c1202008-06-12 04:06:45 +0000128 name = name.lower() + ':'
129 n = len(name)
130 lst = []
131 hit = 0
132 for line in self.keys():
133 if line[:n].lower() == name:
134 hit = 1
135 elif not line[:1].isspace():
136 hit = 0
137 if hit:
138 lst.append(line)
139 return lst
Jeremy Hylton6d0a4c72002-07-07 16:51:37 +0000140
Jeremy Hylton98eb6c22009-03-27 18:31:36 +0000141def parse_headers(fp, _class=HTTPMessage):
Barry Warsaw820c1202008-06-12 04:06:45 +0000142 """Parses only RFC2822 headers from a file pointer.
143
144 email Parser wants to see strings rather than bytes.
145 But a TextIOWrapper around self.rfile would buffer too many bytes
146 from the stream, bytes which we later need to read as bytes.
147 So we read the correct bytes here, as bytes, for email Parser
148 to parse.
149
150 """
Barry Warsaw820c1202008-06-12 04:06:45 +0000151 headers = []
152 while True:
Senthil Kumaran5466bf12010-12-18 16:55:23 +0000153 line = fp.readline(_MAXLINE + 1)
154 if len(line) > _MAXLINE:
155 raise LineTooLong("header line")
Barry Warsaw820c1202008-06-12 04:06:45 +0000156 headers.append(line)
Georg Brandlbf3f8eb2013-10-27 07:34:48 +0100157 if len(headers) > _MAXHEADERS:
158 raise HTTPException("got more than %d headers" % _MAXHEADERS)
Barry Warsaw820c1202008-06-12 04:06:45 +0000159 if line in (b'\r\n', b'\n', b''):
160 break
161 hstring = b''.join(headers).decode('iso-8859-1')
Jeremy Hylton98eb6c22009-03-27 18:31:36 +0000162 return email.parser.Parser(_class=_class).parsestr(hstring)
Greg Stein5e0fa402000-06-26 08:28:01 +0000163
Jeremy Hyltond46aa372002-07-06 18:48:07 +0000164
Kristján Valur Jónsson8e5d0ca2014-03-19 10:07:26 +0000165class HTTPResponse(io.BufferedIOBase):
Jeremy Hyltond46aa372002-07-06 18:48:07 +0000166
167 # See RFC 2616 sec 19.6 and RFC 1945 sec 6 for details.
168
Jeremy Hylton811fc142007-08-03 13:30:02 +0000169 # The bytes from the socket object are iso-8859-1 strings.
170 # See RFC 2616 sec 2.2 which notes an exception for MIME-encoded
171 # text following RFC 2047. The basic status line parsing only
172 # accepts iso-8859-1.
173
Senthil Kumaran052ddb02013-03-18 14:11:41 -0700174 def __init__(self, sock, debuglevel=0, method=None, url=None):
Jeremy Hylton6c5e28c2009-03-31 14:35:53 +0000175 # If the response includes a content-length header, we need to
176 # make sure that the client doesn't read more than the
Jeremy Hylton39b198d2007-08-04 19:22:00 +0000177 # specified number of bytes. If it does, it will block until
Jeremy Hylton6c5e28c2009-03-31 14:35:53 +0000178 # the server times out and closes the connection. This will
179 # happen if a self.fp.read() is done (without a size) whether
180 # self.fp is buffered or not. So, no self.fp.read() by
181 # clients unless they know what they are doing.
Benjamin Petersonf72d9fb2009-02-08 00:29:20 +0000182 self.fp = sock.makefile("rb")
Jeremy Hylton30f86742000-09-18 22:50:38 +0000183 self.debuglevel = debuglevel
Jeremy Hyltonc1b2cb92003-05-05 16:13:58 +0000184 self._method = method
Greg Stein5e0fa402000-06-26 08:28:01 +0000185
Jeremy Hylton6c5e28c2009-03-31 14:35:53 +0000186 # The HTTPResponse object is returned via urllib. The clients
187 # of http and urllib expect different attributes for the
188 # headers. headers is used here and supports urllib. msg is
189 # provided as a backwards compatibility layer for http
190 # clients.
191
192 self.headers = self.msg = None
Greg Stein5e0fa402000-06-26 08:28:01 +0000193
Greg Steindd6eefb2000-07-18 09:09:48 +0000194 # from the Status-Line of the response
Tim Peters07e99cb2001-01-14 23:47:14 +0000195 self.version = _UNKNOWN # HTTP-Version
196 self.status = _UNKNOWN # Status-Code
197 self.reason = _UNKNOWN # Reason-Phrase
Greg Stein5e0fa402000-06-26 08:28:01 +0000198
Tim Peters07e99cb2001-01-14 23:47:14 +0000199 self.chunked = _UNKNOWN # is "chunked" being used?
200 self.chunk_left = _UNKNOWN # bytes left to read in current chunk
201 self.length = _UNKNOWN # number of bytes left in response
202 self.will_close = _UNKNOWN # conn will close at end of response
Greg Stein5e0fa402000-06-26 08:28:01 +0000203
Jeremy Hyltonbe4fcf12002-06-28 22:38:01 +0000204 def _read_status(self):
Senthil Kumaran5466bf12010-12-18 16:55:23 +0000205 line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
206 if len(line) > _MAXLINE:
207 raise LineTooLong("status line")
Jeremy Hylton30f86742000-09-18 22:50:38 +0000208 if self.debuglevel > 0:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000209 print("reply:", repr(line))
Jeremy Hyltonb6769522003-06-29 17:55:05 +0000210 if not line:
211 # Presumably, the server closed the connection before
212 # sending a valid response.
213 raise BadStatusLine(line)
Greg Steindd6eefb2000-07-18 09:09:48 +0000214 try:
Antoine Pitrou988dbd72010-12-17 17:35:56 +0000215 version, status, reason = line.split(None, 2)
Greg Steindd6eefb2000-07-18 09:09:48 +0000216 except ValueError:
217 try:
Antoine Pitrou988dbd72010-12-17 17:35:56 +0000218 version, status = line.split(None, 1)
Greg Steindd6eefb2000-07-18 09:09:48 +0000219 reason = ""
220 except ValueError:
Antoine Pitrou988dbd72010-12-17 17:35:56 +0000221 # empty version will cause next test to fail.
Jeremy Hyltond46aa372002-07-06 18:48:07 +0000222 version = ""
Jeremy Hyltone5d0e842007-08-03 13:45:24 +0000223 if not version.startswith("HTTP/"):
Serhiy Storchakab5b9c8c2013-02-06 10:31:57 +0200224 self._close_conn()
Antoine Pitrou988dbd72010-12-17 17:35:56 +0000225 raise BadStatusLine(line)
Greg Stein5e0fa402000-06-26 08:28:01 +0000226
Jeremy Hylton23d40472001-04-13 14:57:08 +0000227 # The status code is a three-digit number
228 try:
Jeremy Hyltonbe4fcf12002-06-28 22:38:01 +0000229 status = int(status)
Jeremy Hylton23d40472001-04-13 14:57:08 +0000230 if status < 100 or status > 999:
231 raise BadStatusLine(line)
232 except ValueError:
233 raise BadStatusLine(line)
Jeremy Hyltonbe4fcf12002-06-28 22:38:01 +0000234 return version, status, reason
Greg Stein5e0fa402000-06-26 08:28:01 +0000235
Jeremy Hylton39c03802002-07-12 14:04:09 +0000236 def begin(self):
Jeremy Hylton6c5e28c2009-03-31 14:35:53 +0000237 if self.headers is not None:
Jeremy Hyltonbe4fcf12002-06-28 22:38:01 +0000238 # we've already started reading the response
239 return
240
241 # read until we get a non-100 response
Raymond Hettingerb2e0b922003-02-26 22:45:18 +0000242 while True:
Jeremy Hyltonbe4fcf12002-06-28 22:38:01 +0000243 version, status, reason = self._read_status()
Martin v. Löwis39a31782004-09-18 09:03:49 +0000244 if status != CONTINUE:
Jeremy Hyltonbe4fcf12002-06-28 22:38:01 +0000245 break
246 # skip the header from the 100 response
Raymond Hettingerb2e0b922003-02-26 22:45:18 +0000247 while True:
Senthil Kumaran5466bf12010-12-18 16:55:23 +0000248 skip = self.fp.readline(_MAXLINE + 1)
249 if len(skip) > _MAXLINE:
250 raise LineTooLong("header line")
251 skip = skip.strip()
Jeremy Hyltonbe4fcf12002-06-28 22:38:01 +0000252 if not skip:
253 break
254 if self.debuglevel > 0:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000255 print("header:", skip)
Tim Petersc411dba2002-07-16 21:35:23 +0000256
Jeremy Hylton6c5e28c2009-03-31 14:35:53 +0000257 self.code = self.status = status
Jeremy Hyltonbe4fcf12002-06-28 22:38:01 +0000258 self.reason = reason.strip()
Antoine Pitrou988dbd72010-12-17 17:35:56 +0000259 if version in ("HTTP/1.0", "HTTP/0.9"):
260 # Some servers might still return "0.9", treat it as 1.0 anyway
Greg Steindd6eefb2000-07-18 09:09:48 +0000261 self.version = 10
Jeremy Hyltone5d0e842007-08-03 13:45:24 +0000262 elif version.startswith("HTTP/1."):
Tim Peters07e99cb2001-01-14 23:47:14 +0000263 self.version = 11 # use HTTP/1.1 code for HTTP/1.x where x>=1
Greg Steindd6eefb2000-07-18 09:09:48 +0000264 else:
265 raise UnknownProtocol(version)
Greg Stein5e0fa402000-06-26 08:28:01 +0000266
Jeremy Hylton6c5e28c2009-03-31 14:35:53 +0000267 self.headers = self.msg = parse_headers(self.fp)
Barry Warsaw820c1202008-06-12 04:06:45 +0000268
Jeremy Hylton30f86742000-09-18 22:50:38 +0000269 if self.debuglevel > 0:
Jeremy Hylton6c5e28c2009-03-31 14:35:53 +0000270 for hdr in self.headers:
Jeremy Hyltone5d0e842007-08-03 13:45:24 +0000271 print("header:", hdr, end=" ")
Greg Stein5e0fa402000-06-26 08:28:01 +0000272
Greg Steindd6eefb2000-07-18 09:09:48 +0000273 # are we using the chunked-style of transfer encoding?
Jeremy Hylton6c5e28c2009-03-31 14:35:53 +0000274 tr_enc = self.headers.get("transfer-encoding")
Jeremy Hyltond229b3a2002-09-03 19:24:24 +0000275 if tr_enc and tr_enc.lower() == "chunked":
Jeremy Hylton236156f2008-12-15 03:00:50 +0000276 self.chunked = True
Greg Steindd6eefb2000-07-18 09:09:48 +0000277 self.chunk_left = None
278 else:
Jeremy Hylton236156f2008-12-15 03:00:50 +0000279 self.chunked = False
Greg Stein5e0fa402000-06-26 08:28:01 +0000280
Greg Steindd6eefb2000-07-18 09:09:48 +0000281 # will the connection close at the end of the response?
Jeremy Hylton22b3a492002-11-13 17:27:43 +0000282 self.will_close = self._check_close()
Greg Stein5e0fa402000-06-26 08:28:01 +0000283
Greg Steindd6eefb2000-07-18 09:09:48 +0000284 # do we have a Content-Length?
285 # NOTE: RFC 2616, S4.4, #3 says we ignore this if tr_enc is "chunked"
Jeremy Hylton0ee5eeb2007-08-04 03:25:17 +0000286 self.length = None
Jeremy Hylton6c5e28c2009-03-31 14:35:53 +0000287 length = self.headers.get("content-length")
Barry Warsaw820c1202008-06-12 04:06:45 +0000288
289 # are we using the chunked-style of transfer encoding?
Jeremy Hylton6c5e28c2009-03-31 14:35:53 +0000290 tr_enc = self.headers.get("transfer-encoding")
Greg Steindd6eefb2000-07-18 09:09:48 +0000291 if length and not self.chunked:
Jeremy Hylton30a81812000-09-14 20:34:27 +0000292 try:
293 self.length = int(length)
294 except ValueError:
Christian Heimesa612dc02008-02-24 13:08:18 +0000295 self.length = None
296 else:
297 if self.length < 0: # ignore nonsensical negative lengths
298 self.length = None
299 else:
300 self.length = None
Greg Stein5e0fa402000-06-26 08:28:01 +0000301
Greg Steindd6eefb2000-07-18 09:09:48 +0000302 # does the body have a fixed length? (of zero)
Martin v. Löwis39a31782004-09-18 09:03:49 +0000303 if (status == NO_CONTENT or status == NOT_MODIFIED or
Jeremy Hyltonc1b2cb92003-05-05 16:13:58 +0000304 100 <= status < 200 or # 1xx codes
Jeremy Hyltone5d0e842007-08-03 13:45:24 +0000305 self._method == "HEAD"):
Greg Steindd6eefb2000-07-18 09:09:48 +0000306 self.length = 0
Greg Stein5e0fa402000-06-26 08:28:01 +0000307
Greg Steindd6eefb2000-07-18 09:09:48 +0000308 # if the connection remains open, and we aren't using chunked, and
309 # a content-length was not provided, then assume that the connection
310 # WILL close.
Jeremy Hylton0ee5eeb2007-08-04 03:25:17 +0000311 if (not self.will_close and
312 not self.chunked and
313 self.length is None):
Jeremy Hylton236156f2008-12-15 03:00:50 +0000314 self.will_close = True
Greg Stein5e0fa402000-06-26 08:28:01 +0000315
Jeremy Hylton22b3a492002-11-13 17:27:43 +0000316 def _check_close(self):
Jeremy Hylton6c5e28c2009-03-31 14:35:53 +0000317 conn = self.headers.get("connection")
Jeremy Hylton22b3a492002-11-13 17:27:43 +0000318 if self.version == 11:
319 # An HTTP/1.1 proxy is assumed to stay open unless
320 # explicitly closed.
Jeremy Hylton6c5e28c2009-03-31 14:35:53 +0000321 conn = self.headers.get("connection")
Raymond Hettingerbac788a2004-05-04 09:21:43 +0000322 if conn and "close" in conn.lower():
Jeremy Hylton22b3a492002-11-13 17:27:43 +0000323 return True
324 return False
325
Jeremy Hylton2c178252004-08-07 16:28:14 +0000326 # Some HTTP/1.0 implementations have support for persistent
327 # connections, using rules different than HTTP/1.1.
Jeremy Hylton22b3a492002-11-13 17:27:43 +0000328
Christian Heimes895627f2007-12-08 17:28:33 +0000329 # For older HTTP, Keep-Alive indicates persistent connection.
Jeremy Hylton6c5e28c2009-03-31 14:35:53 +0000330 if self.headers.get("keep-alive"):
Jeremy Hylton22b3a492002-11-13 17:27:43 +0000331 return False
Tim Peters77c06fb2002-11-24 02:35:35 +0000332
Jeremy Hylton2c178252004-08-07 16:28:14 +0000333 # At least Akamai returns a "Connection: Keep-Alive" header,
334 # which was supposed to be sent by the client.
335 if conn and "keep-alive" in conn.lower():
336 return False
337
Jeremy Hylton22b3a492002-11-13 17:27:43 +0000338 # Proxy-Connection is a netscape hack.
Jeremy Hylton6c5e28c2009-03-31 14:35:53 +0000339 pconn = self.headers.get("proxy-connection")
Raymond Hettingerbac788a2004-05-04 09:21:43 +0000340 if pconn and "keep-alive" in pconn.lower():
Jeremy Hylton22b3a492002-11-13 17:27:43 +0000341 return False
342
343 # otherwise, assume it will close
344 return True
345
Serhiy Storchakab5b9c8c2013-02-06 10:31:57 +0200346 def _close_conn(self):
347 fp = self.fp
348 self.fp = None
349 fp.close()
350
Greg Steindd6eefb2000-07-18 09:09:48 +0000351 def close(self):
Serhiy Storchakab5b9c8c2013-02-06 10:31:57 +0200352 super().close() # set "closed" flag
Greg Steindd6eefb2000-07-18 09:09:48 +0000353 if self.fp:
Serhiy Storchakab5b9c8c2013-02-06 10:31:57 +0200354 self._close_conn()
Greg Stein5e0fa402000-06-26 08:28:01 +0000355
Jeremy Hyltondf5f6b52007-08-08 17:36:33 +0000356 # These implementations are for the benefit of io.BufferedReader.
357
358 # XXX This class should probably be revised to act more like
359 # the "raw stream" that BufferedReader expects.
360
Jeremy Hyltondf5f6b52007-08-08 17:36:33 +0000361 def flush(self):
Serhiy Storchakab5b9c8c2013-02-06 10:31:57 +0200362 super().flush()
363 if self.fp:
364 self.fp.flush()
Jeremy Hyltondf5f6b52007-08-08 17:36:33 +0000365
Jeremy Hyltona7cff022009-04-01 02:35:56 +0000366 def readable(self):
367 return True
368
Jeremy Hyltondf5f6b52007-08-08 17:36:33 +0000369 # End of "raw stream" methods
370
Greg Steindd6eefb2000-07-18 09:09:48 +0000371 def isclosed(self):
Serhiy Storchakab5b9c8c2013-02-06 10:31:57 +0200372 """True if the connection is closed."""
Greg Steindd6eefb2000-07-18 09:09:48 +0000373 # NOTE: it is possible that we will not ever call self.close(). This
374 # case occurs when will_close is TRUE, length is None, and we
375 # read up to the last byte, but NOT past it.
376 #
377 # IMPLIES: if will_close is FALSE, then self.close() will ALWAYS be
378 # called, meaning self.isclosed() is meaningful.
379 return self.fp is None
380
381 def read(self, amt=None):
382 if self.fp is None:
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000383 return b""
Greg Steindd6eefb2000-07-18 09:09:48 +0000384
Senthil Kumaran71fb6c82010-04-28 17:39:48 +0000385 if self._method == "HEAD":
Serhiy Storchakab5b9c8c2013-02-06 10:31:57 +0200386 self._close_conn()
Senthil Kumaran71fb6c82010-04-28 17:39:48 +0000387 return b""
388
Antoine Pitrou38d96432011-12-06 22:33:57 +0100389 if amt is not None:
Kristján Valur Jónsson8e5d0ca2014-03-19 10:07:26 +0000390 # Amount is given, implement using readinto
391 b = bytearray(amt)
392 n = self.readinto(b)
393 return memoryview(b)[:n].tobytes()
Antoine Pitrou38d96432011-12-06 22:33:57 +0100394 else:
395 # Amount is not given (unbounded read) so we must check self.length
396 # and self.chunked
Tim Peters230a60c2002-11-09 05:08:07 +0000397
Antoine Pitrou38d96432011-12-06 22:33:57 +0100398 if self.chunked:
399 return self._readall_chunked()
400
Jeremy Hyltondef9d2a2004-11-07 16:13:49 +0000401 if self.length is None:
Greg Steindd6eefb2000-07-18 09:09:48 +0000402 s = self.fp.read()
403 else:
Antoine Pitroubeec61a2013-02-02 22:49:34 +0100404 try:
405 s = self._safe_read(self.length)
406 except IncompleteRead:
Serhiy Storchakab5b9c8c2013-02-06 10:31:57 +0200407 self._close_conn()
Antoine Pitroubeec61a2013-02-02 22:49:34 +0100408 raise
Jeremy Hyltondef9d2a2004-11-07 16:13:49 +0000409 self.length = 0
Serhiy Storchakab5b9c8c2013-02-06 10:31:57 +0200410 self._close_conn() # we read everything
Greg Steindd6eefb2000-07-18 09:09:48 +0000411 return s
412
Antoine Pitrou38d96432011-12-06 22:33:57 +0100413 def readinto(self, b):
414 if self.fp is None:
415 return 0
416
417 if self._method == "HEAD":
Serhiy Storchakab6c86fd2013-02-06 10:35:40 +0200418 self._close_conn()
Antoine Pitrou38d96432011-12-06 22:33:57 +0100419 return 0
420
421 if self.chunked:
422 return self._readinto_chunked(b)
423
Greg Steindd6eefb2000-07-18 09:09:48 +0000424 if self.length is not None:
Antoine Pitrou38d96432011-12-06 22:33:57 +0100425 if len(b) > self.length:
Greg Steindd6eefb2000-07-18 09:09:48 +0000426 # clip the read to the "end of response"
Antoine Pitrou38d96432011-12-06 22:33:57 +0100427 b = memoryview(b)[0:self.length]
Greg Steindd6eefb2000-07-18 09:09:48 +0000428
429 # we do not use _safe_read() here because this may be a .will_close
430 # connection, and the user is reading more bytes than will be provided
431 # (for example, reading in 1k chunks)
Antoine Pitrou38d96432011-12-06 22:33:57 +0100432 n = self.fp.readinto(b)
Serhiy Storchaka1c84ac12013-12-17 21:50:02 +0200433 if not n and b:
Antoine Pitroubeec61a2013-02-02 22:49:34 +0100434 # Ideally, we would raise IncompleteRead if the content-length
435 # wasn't satisfied, but it might break compatibility.
Serhiy Storchakab5b9c8c2013-02-06 10:31:57 +0200436 self._close_conn()
Antoine Pitrou6a35e182013-02-02 23:04:56 +0100437 elif self.length is not None:
Antoine Pitrou38d96432011-12-06 22:33:57 +0100438 self.length -= n
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000439 if not self.length:
Serhiy Storchakab5b9c8c2013-02-06 10:31:57 +0200440 self._close_conn()
Antoine Pitrou38d96432011-12-06 22:33:57 +0100441 return n
Greg Steindd6eefb2000-07-18 09:09:48 +0000442
Antoine Pitrou38d96432011-12-06 22:33:57 +0100443 def _read_next_chunk_size(self):
444 # Read the next chunk size from the file
445 line = self.fp.readline(_MAXLINE + 1)
446 if len(line) > _MAXLINE:
447 raise LineTooLong("chunk size")
448 i = line.find(b";")
449 if i >= 0:
450 line = line[:i] # strip chunk-extensions
451 try:
452 return int(line, 16)
453 except ValueError:
454 # close the connection as protocol synchronisation is
455 # probably lost
Serhiy Storchakab6c86fd2013-02-06 10:35:40 +0200456 self._close_conn()
Antoine Pitrou38d96432011-12-06 22:33:57 +0100457 raise
Jeremy Hyltond4c472c2002-09-03 20:49:06 +0000458
Antoine Pitrou38d96432011-12-06 22:33:57 +0100459 def _read_and_discard_trailer(self):
Jeremy Hyltond4c472c2002-09-03 20:49:06 +0000460 # read and discard trailer up to the CRLF terminator
461 ### note: we shouldn't have any trailers!
Raymond Hettingerb2e0b922003-02-26 22:45:18 +0000462 while True:
Senthil Kumaran5466bf12010-12-18 16:55:23 +0000463 line = self.fp.readline(_MAXLINE + 1)
464 if len(line) > _MAXLINE:
465 raise LineTooLong("trailer line")
Christian Heimes0bd4e112008-02-12 22:59:25 +0000466 if not line:
467 # a vanishingly small number of sites EOF without
468 # sending the trailer
469 break
Senthil Kumaran7e70a5c2012-04-29 10:39:49 +0800470 if line in (b'\r\n', b'\n', b''):
Jeremy Hyltond4c472c2002-09-03 20:49:06 +0000471 break
472
Kristján Valur Jónsson8e5d0ca2014-03-19 10:07:26 +0000473 def _get_chunk_left(self):
474 # return self.chunk_left, reading a new chunk if necessary.
475 # chunk_left == 0: at the end of the current chunk, need to close it
476 # chunk_left == None: No current chunk, should read next.
477 # This function returns non-zero or None if the last chunk has
478 # been read.
479 chunk_left = self.chunk_left
480 if not chunk_left: # Can be 0 or None
481 if chunk_left is not None:
482 # We are at the end of chunk. dicard chunk end
483 self._safe_read(2) # toss the CRLF at the end of the chunk
484 try:
485 chunk_left = self._read_next_chunk_size()
486 except ValueError:
487 raise IncompleteRead(b'')
488 if chunk_left == 0:
489 # last chunk: 1*("0") [ chunk-extension ] CRLF
490 self._read_and_discard_trailer()
491 # we read everything; close the "file"
492 self._close_conn()
493 chunk_left = None
494 self.chunk_left = chunk_left
495 return chunk_left
496
Antoine Pitrou38d96432011-12-06 22:33:57 +0100497 def _readall_chunked(self):
498 assert self.chunked != _UNKNOWN
Antoine Pitrou38d96432011-12-06 22:33:57 +0100499 value = []
Kristján Valur Jónsson8e5d0ca2014-03-19 10:07:26 +0000500 try:
501 while True:
502 chunk_left = self._get_chunk_left()
503 if chunk_left is None:
504 break
505 value.append(self._safe_read(chunk_left))
506 self.chunk_left = 0
507 return b''.join(value)
508 except IncompleteRead:
509 raise IncompleteRead(b''.join(value))
Tim Peters230a60c2002-11-09 05:08:07 +0000510
Antoine Pitrou38d96432011-12-06 22:33:57 +0100511 def _readinto_chunked(self, b):
512 assert self.chunked != _UNKNOWN
Antoine Pitrou38d96432011-12-06 22:33:57 +0100513 total_bytes = 0
514 mvb = memoryview(b)
Kristján Valur Jónsson8e5d0ca2014-03-19 10:07:26 +0000515 try:
516 while True:
517 chunk_left = self._get_chunk_left()
518 if chunk_left is None:
519 return total_bytes
Antoine Pitrou4ce6aa42011-12-06 22:34:36 +0100520
Kristján Valur Jónsson8e5d0ca2014-03-19 10:07:26 +0000521 if len(mvb) <= chunk_left:
522 n = self._safe_readinto(mvb)
523 self.chunk_left = chunk_left - n
524 return total_bytes + n
525
526 temp_mvb = mvb[:chunk_left]
Antoine Pitrou38d96432011-12-06 22:33:57 +0100527 n = self._safe_readinto(temp_mvb)
528 mvb = mvb[n:]
529 total_bytes += n
Kristján Valur Jónsson8e5d0ca2014-03-19 10:07:26 +0000530 self.chunk_left = 0
Antoine Pitrou38d96432011-12-06 22:33:57 +0100531
Kristján Valur Jónsson8e5d0ca2014-03-19 10:07:26 +0000532 except IncompleteRead:
533 raise IncompleteRead(bytes(b[0:total_bytes]))
Antoine Pitrou38d96432011-12-06 22:33:57 +0100534
Greg Steindd6eefb2000-07-18 09:09:48 +0000535 def _safe_read(self, amt):
536 """Read the number of bytes requested, compensating for partial reads.
537
538 Normally, we have a blocking socket, but a read() can be interrupted
539 by a signal (resulting in a partial read).
540
541 Note that we cannot distinguish between EOF and an interrupt when zero
542 bytes have been read. IncompleteRead() will be raised in this
543 situation.
544
545 This function should be used when <amt> bytes "should" be present for
546 reading. If the bytes are truly not available (due to EOF), then the
547 IncompleteRead exception can be used to detect the problem.
548 """
Georg Brandl80ba8e82005-09-29 20:16:07 +0000549 s = []
Greg Steindd6eefb2000-07-18 09:09:48 +0000550 while amt > 0:
Georg Brandl80ba8e82005-09-29 20:16:07 +0000551 chunk = self.fp.read(min(amt, MAXAMOUNT))
Greg Steindd6eefb2000-07-18 09:09:48 +0000552 if not chunk:
Benjamin Peterson6accb982009-03-02 22:50:25 +0000553 raise IncompleteRead(b''.join(s), amt)
Georg Brandl80ba8e82005-09-29 20:16:07 +0000554 s.append(chunk)
Raymond Hettingerb2e0b922003-02-26 22:45:18 +0000555 amt -= len(chunk)
Guido van Rossuma00f1232007-09-12 19:43:09 +0000556 return b"".join(s)
Greg Steindd6eefb2000-07-18 09:09:48 +0000557
Antoine Pitrou38d96432011-12-06 22:33:57 +0100558 def _safe_readinto(self, b):
559 """Same as _safe_read, but for reading into a buffer."""
560 total_bytes = 0
561 mvb = memoryview(b)
562 while total_bytes < len(b):
563 if MAXAMOUNT < len(mvb):
564 temp_mvb = mvb[0:MAXAMOUNT]
565 n = self.fp.readinto(temp_mvb)
566 else:
567 n = self.fp.readinto(mvb)
568 if not n:
569 raise IncompleteRead(bytes(mvb[0:total_bytes]), len(b))
570 mvb = mvb[n:]
571 total_bytes += n
572 return total_bytes
573
Kristján Valur Jónsson8e5d0ca2014-03-19 10:07:26 +0000574 def read1(self, n=-1):
575 """Read with at most one underlying system call. If at least one
576 byte is buffered, return that instead.
577 """
578 if self.fp is None or self._method == "HEAD":
579 return b""
580 if self.chunked:
581 return self._read1_chunked(n)
582 try:
583 result = self.fp.read1(n)
584 except ValueError:
585 if n >= 0:
586 raise
587 # some implementations, like BufferedReader, don't support -1
588 # Read an arbitrarily selected largeish chunk.
589 result = self.fp.read1(16*1024)
590 if not result and n:
591 self._close_conn()
592 return result
593
594 def peek(self, n=-1):
595 # Having this enables IOBase.readline() to read more than one
596 # byte at a time
597 if self.fp is None or self._method == "HEAD":
598 return b""
599 if self.chunked:
600 return self._peek_chunked(n)
601 return self.fp.peek(n)
602
603 def readline(self, limit=-1):
604 if self.fp is None or self._method == "HEAD":
605 return b""
606 if self.chunked:
607 # Fallback to IOBase readline which uses peek() and read()
608 return super().readline(limit)
609 result = self.fp.readline(limit)
610 if not result and limit:
611 self._close_conn()
612 return result
613
614 def _read1_chunked(self, n):
615 # Strictly speaking, _get_chunk_left() may cause more than one read,
616 # but that is ok, since that is to satisfy the chunked protocol.
617 chunk_left = self._get_chunk_left()
618 if chunk_left is None or n == 0:
619 return b''
620 if not (0 <= n <= chunk_left):
621 n = chunk_left # if n is negative or larger than chunk_left
622 read = self.fp.read1(n)
623 self.chunk_left -= len(read)
624 if not read:
625 raise IncompleteRead(b"")
626 return read
627
628 def _peek_chunked(self, n):
629 # Strictly speaking, _get_chunk_left() may cause more than one read,
630 # but that is ok, since that is to satisfy the chunked protocol.
631 try:
632 chunk_left = self._get_chunk_left()
633 except IncompleteRead:
634 return b'' # peek doesn't worry about protocol
635 if chunk_left is None:
636 return b'' # eof
637 # peek is allowed to return more than requested. Just request the
638 # entire chunk, and truncate what we get.
639 return self.fp.peek(chunk_left)[:chunk_left]
640
Antoine Pitroub353c122009-02-11 00:39:14 +0000641 def fileno(self):
642 return self.fp.fileno()
643
Greg Steindd6eefb2000-07-18 09:09:48 +0000644 def getheader(self, name, default=None):
Jeremy Hylton6c5e28c2009-03-31 14:35:53 +0000645 if self.headers is None:
Greg Steindd6eefb2000-07-18 09:09:48 +0000646 raise ResponseNotReady()
Senthil Kumaran9f8dc442010-08-02 11:04:58 +0000647 headers = self.headers.get_all(name) or default
648 if isinstance(headers, str) or not hasattr(headers, '__iter__'):
649 return headers
650 else:
651 return ', '.join(headers)
Greg Stein5e0fa402000-06-26 08:28:01 +0000652
Martin v. Löwisdeacce22004-08-18 12:46:26 +0000653 def getheaders(self):
654 """Return list of (header, value) tuples."""
Jeremy Hylton6c5e28c2009-03-31 14:35:53 +0000655 if self.headers is None:
Martin v. Löwisdeacce22004-08-18 12:46:26 +0000656 raise ResponseNotReady()
Jeremy Hylton6c5e28c2009-03-31 14:35:53 +0000657 return list(self.headers.items())
Martin v. Löwisdeacce22004-08-18 12:46:26 +0000658
Antoine Pitroub353c122009-02-11 00:39:14 +0000659 # We override IOBase.__iter__ so that it doesn't check for closed-ness
660
661 def __iter__(self):
662 return self
663
Jeremy Hylton6c5e28c2009-03-31 14:35:53 +0000664 # For compatibility with old-style urllib responses.
665
666 def info(self):
667 return self.headers
668
669 def geturl(self):
670 return self.url
671
672 def getcode(self):
673 return self.status
Greg Stein5e0fa402000-06-26 08:28:01 +0000674
675class HTTPConnection:
676
Greg Steindd6eefb2000-07-18 09:09:48 +0000677 _http_vsn = 11
678 _http_vsn_str = 'HTTP/1.1'
Greg Stein5e0fa402000-06-26 08:28:01 +0000679
Greg Steindd6eefb2000-07-18 09:09:48 +0000680 response_class = HTTPResponse
681 default_port = HTTP_PORT
682 auto_open = 1
Jeremy Hylton30f86742000-09-18 22:50:38 +0000683 debuglevel = 0
Antoine Pitrou90e47742013-01-02 22:10:47 +0100684 # TCP Maximum Segment Size (MSS) is determined by the TCP stack on
685 # a per-connection basis. There is no simple and efficient
686 # platform independent mechanism for determining the MSS, so
687 # instead a reasonable estimate is chosen. The getsockopt()
688 # interface using the TCP_MAXSEG parameter may be a suitable
689 # approach on some operating systems. A value of 16KiB is chosen
690 # as a reasonable estimate of the maximum MSS.
691 mss = 16384
Greg Stein5e0fa402000-06-26 08:28:01 +0000692
Senthil Kumaran052ddb02013-03-18 14:11:41 -0700693 def __init__(self, host, port=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
694 source_address=None):
Guido van Rossumd8faa362007-04-27 19:54:29 +0000695 self.timeout = timeout
Gregory P. Smithb4066372010-01-03 03:28:29 +0000696 self.source_address = source_address
Greg Steindd6eefb2000-07-18 09:09:48 +0000697 self.sock = None
Jeremy Hylton8531b1b2002-07-16 21:21:11 +0000698 self._buffer = []
Greg Steindd6eefb2000-07-18 09:09:48 +0000699 self.__response = None
700 self.__state = _CS_IDLE
Jeremy Hyltonc1b2cb92003-05-05 16:13:58 +0000701 self._method = None
Senthil Kumaran97f0c6b2009-07-25 04:24:38 +0000702 self._tunnel_host = None
703 self._tunnel_port = None
Georg Brandlc7c199f2011-01-22 22:06:24 +0000704 self._tunnel_headers = {}
Tim Petersc411dba2002-07-16 21:35:23 +0000705
Senthil Kumaran9da047b2014-04-14 13:07:56 -0400706 (self.host, self.port) = self._get_hostport(host, port)
707
708 # This is stored as an instance variable to allow unit
709 # tests to replace it with a suitable mockup
710 self._create_connection = socket.create_connection
Greg Stein5e0fa402000-06-26 08:28:01 +0000711
Senthil Kumaran47fff872009-12-20 07:10:31 +0000712 def set_tunnel(self, host, port=None, headers=None):
Senthil Kumaran9da047b2014-04-14 13:07:56 -0400713 """Set up host and port for HTTP CONNECT tunnelling.
Senthil Kumaran47fff872009-12-20 07:10:31 +0000714
Senthil Kumaran9da047b2014-04-14 13:07:56 -0400715 In a connection that uses HTTP CONNECT tunneling, the host passed to the
716 constructor is used as a proxy server that relays all communication to
717 the endpoint passed to `set_tunnel`. This done by sending an HTTP
718 CONNECT request to the proxy server when the connection is established.
719
720 This method must be called before the HTML connection has been
721 established.
722
723 The headers argument should be a mapping of extra HTTP headers to send
724 with the CONNECT request.
Senthil Kumaran47fff872009-12-20 07:10:31 +0000725 """
Senthil Kumaran9da047b2014-04-14 13:07:56 -0400726
727 if self.sock:
728 raise RuntimeError("Can't set up tunnel for established connection")
729
Serhiy Storchaka4ac7ed92014-12-12 09:29:15 +0200730 self._tunnel_host, self._tunnel_port = self._get_hostport(host, port)
Senthil Kumaran47fff872009-12-20 07:10:31 +0000731 if headers:
732 self._tunnel_headers = headers
733 else:
734 self._tunnel_headers.clear()
Senthil Kumaran97f0c6b2009-07-25 04:24:38 +0000735
Senthil Kumaran9da047b2014-04-14 13:07:56 -0400736 def _get_hostport(self, host, port):
Greg Steindd6eefb2000-07-18 09:09:48 +0000737 if port is None:
Skip Montanaro10e6e0e2004-09-14 16:32:02 +0000738 i = host.rfind(':')
Skip Montanarocae14d22004-09-14 17:55:21 +0000739 j = host.rfind(']') # ipv6 addresses have [...]
740 if i > j:
Skip Montanaro9d389972002-03-24 16:53:50 +0000741 try:
742 port = int(host[i+1:])
743 except ValueError:
Łukasz Langaa5a9a9c2011-10-18 21:17:39 +0200744 if host[i+1:] == "": # http://foo.com:/ == http://foo.com/
745 port = self.default_port
746 else:
747 raise InvalidURL("nonnumeric port: '%s'" % host[i+1:])
Greg Steindd6eefb2000-07-18 09:09:48 +0000748 host = host[:i]
749 else:
750 port = self.default_port
Raymond Hettinger4d037912004-10-14 15:23:38 +0000751 if host and host[0] == '[' and host[-1] == ']':
Brett Cannon0a1af4a2004-09-15 23:26:23 +0000752 host = host[1:-1]
Senthil Kumaran9da047b2014-04-14 13:07:56 -0400753
754 return (host, port)
Greg Stein5e0fa402000-06-26 08:28:01 +0000755
Jeremy Hylton30f86742000-09-18 22:50:38 +0000756 def set_debuglevel(self, level):
757 self.debuglevel = level
758
Senthil Kumaran97f0c6b2009-07-25 04:24:38 +0000759 def _tunnel(self):
Serhiy Storchaka4ac7ed92014-12-12 09:29:15 +0200760 connect_str = "CONNECT %s:%d HTTP/1.0\r\n" % (self._tunnel_host,
761 self._tunnel_port)
Senthil Kumaran97f0c6b2009-07-25 04:24:38 +0000762 connect_bytes = connect_str.encode("ascii")
763 self.send(connect_bytes)
Georg Brandlc7c199f2011-01-22 22:06:24 +0000764 for header, value in self._tunnel_headers.items():
Senthil Kumaran47fff872009-12-20 07:10:31 +0000765 header_str = "%s: %s\r\n" % (header, value)
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000766 header_bytes = header_str.encode("latin-1")
Senthil Kumaran47fff872009-12-20 07:10:31 +0000767 self.send(header_bytes)
Georg Brandlc7c199f2011-01-22 22:06:24 +0000768 self.send(b'\r\n')
Senthil Kumaran47fff872009-12-20 07:10:31 +0000769
Georg Brandlc7c199f2011-01-22 22:06:24 +0000770 response = self.response_class(self.sock, method=self._method)
Senthil Kumaran97f0c6b2009-07-25 04:24:38 +0000771 (version, code, message) = response._read_status()
Senthil Kumaran47fff872009-12-20 07:10:31 +0000772
Serhiy Storchakae4db7692014-12-23 16:28:28 +0200773 if code != http.HTTPStatus.OK:
Senthil Kumaran97f0c6b2009-07-25 04:24:38 +0000774 self.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +0200775 raise OSError("Tunnel connection failed: %d %s" % (code,
776 message.strip()))
Senthil Kumaran97f0c6b2009-07-25 04:24:38 +0000777 while True:
Senthil Kumaran5466bf12010-12-18 16:55:23 +0000778 line = response.fp.readline(_MAXLINE + 1)
779 if len(line) > _MAXLINE:
780 raise LineTooLong("header line")
Senthil Kumaranb12771a2012-04-23 23:50:07 +0800781 if not line:
782 # for sites which EOF without sending a trailer
783 break
Senthil Kumaran7e70a5c2012-04-29 10:39:49 +0800784 if line in (b'\r\n', b'\n', b''):
Senthil Kumaran97f0c6b2009-07-25 04:24:38 +0000785 break
786
Greg Steindd6eefb2000-07-18 09:09:48 +0000787 def connect(self):
788 """Connect to the host and port specified in __init__."""
Senthil Kumaran9da047b2014-04-14 13:07:56 -0400789 self.sock = self._create_connection((self.host,self.port),
790 self.timeout, self.source_address)
791
Senthil Kumaran97f0c6b2009-07-25 04:24:38 +0000792 if self._tunnel_host:
793 self._tunnel()
Greg Stein5e0fa402000-06-26 08:28:01 +0000794
Greg Steindd6eefb2000-07-18 09:09:48 +0000795 def close(self):
796 """Close the connection to the HTTP server."""
797 if self.sock:
Tim Peters07e99cb2001-01-14 23:47:14 +0000798 self.sock.close() # close it manually... there may be other refs
Greg Steindd6eefb2000-07-18 09:09:48 +0000799 self.sock = None
800 if self.__response:
801 self.__response.close()
802 self.__response = None
803 self.__state = _CS_IDLE
Greg Stein5e0fa402000-06-26 08:28:01 +0000804
Senthil Kumaran5a2da3b2010-10-02 10:33:13 +0000805 def send(self, data):
Senthil Kumaran7bc0d872010-12-19 10:49:52 +0000806 """Send `data' to the server.
807 ``data`` can be a string object, a bytes object, an array object, a
808 file-like object that supports a .read() method, or an iterable object.
809 """
810
Greg Steindd6eefb2000-07-18 09:09:48 +0000811 if self.sock is None:
812 if self.auto_open:
813 self.connect()
814 else:
815 raise NotConnected()
Greg Stein5e0fa402000-06-26 08:28:01 +0000816
Jeremy Hylton30f86742000-09-18 22:50:38 +0000817 if self.debuglevel > 0:
Senthil Kumaran5a2da3b2010-10-02 10:33:13 +0000818 print("send:", repr(data))
Jeremy Hylton636950f2009-03-28 04:34:21 +0000819 blocksize = 8192
Senthil Kumaran5a2da3b2010-10-02 10:33:13 +0000820 if hasattr(data, "read") :
Jeremy Hylton636950f2009-03-28 04:34:21 +0000821 if self.debuglevel > 0:
822 print("sendIng a read()able")
823 encode = False
Antoine Pitrouead1d622009-09-29 18:44:53 +0000824 try:
Senthil Kumaran5a2da3b2010-10-02 10:33:13 +0000825 mode = data.mode
Antoine Pitrouead1d622009-09-29 18:44:53 +0000826 except AttributeError:
827 # io.BytesIO and other file-like objects don't have a `mode`
828 # attribute.
829 pass
830 else:
831 if "b" not in mode:
832 encode = True
833 if self.debuglevel > 0:
834 print("encoding file using iso-8859-1")
Jeremy Hylton636950f2009-03-28 04:34:21 +0000835 while 1:
Senthil Kumaran5a2da3b2010-10-02 10:33:13 +0000836 datablock = data.read(blocksize)
837 if not datablock:
Jeremy Hylton636950f2009-03-28 04:34:21 +0000838 break
839 if encode:
Senthil Kumaran5a2da3b2010-10-02 10:33:13 +0000840 datablock = datablock.encode("iso-8859-1")
841 self.sock.sendall(datablock)
Andrew Svetlov7b2c8bb2013-04-12 22:49:19 +0300842 return
Senthil Kumaran7bc0d872010-12-19 10:49:52 +0000843 try:
Senthil Kumaran5a2da3b2010-10-02 10:33:13 +0000844 self.sock.sendall(data)
Senthil Kumaran7bc0d872010-12-19 10:49:52 +0000845 except TypeError:
846 if isinstance(data, collections.Iterable):
847 for d in data:
848 self.sock.sendall(d)
849 else:
Georg Brandl25e2cd12011-08-03 08:27:00 +0200850 raise TypeError("data should be a bytes-like object "
851 "or an iterable, got %r" % type(data))
Greg Stein5e0fa402000-06-26 08:28:01 +0000852
Jeremy Hylton8531b1b2002-07-16 21:21:11 +0000853 def _output(self, s):
854 """Add a line of output to the current request buffer.
Tim Peters469cdad2002-08-08 20:19:19 +0000855
Jeremy Hyltone3252ec2002-07-16 21:41:43 +0000856 Assumes that the line does *not* end with \\r\\n.
Jeremy Hylton8531b1b2002-07-16 21:21:11 +0000857 """
858 self._buffer.append(s)
859
Benjamin Peterson1742e402008-11-30 22:15:29 +0000860 def _send_output(self, message_body=None):
Jeremy Hylton8531b1b2002-07-16 21:21:11 +0000861 """Send the currently buffered request and clear the buffer.
862
Jeremy Hyltone3252ec2002-07-16 21:41:43 +0000863 Appends an extra \\r\\n to the buffer.
Benjamin Peterson822b21c2009-01-18 00:04:57 +0000864 A message_body may be specified, to be appended to the request.
Jeremy Hylton8531b1b2002-07-16 21:21:11 +0000865 """
Martin v. Löwisdd5a8602007-06-30 09:22:09 +0000866 self._buffer.extend((b"", b""))
867 msg = b"\r\n".join(self._buffer)
Jeremy Hylton8531b1b2002-07-16 21:21:11 +0000868 del self._buffer[:]
Benjamin Peterson1742e402008-11-30 22:15:29 +0000869 # If msg and message_body are sent in a single send() call,
870 # it will avoid performance problems caused by the interaction
Antoine Pitrou90e47742013-01-02 22:10:47 +0100871 # between delayed ack and the Nagle algorithm. However,
872 # there is no performance gain if the message is larger
873 # than MSS (and there is a memory penalty for the message
874 # copy).
875 if isinstance(message_body, bytes) and len(message_body) < self.mss:
Benjamin Peterson1742e402008-11-30 22:15:29 +0000876 msg += message_body
Benjamin Peterson822b21c2009-01-18 00:04:57 +0000877 message_body = None
Jeremy Hylton8531b1b2002-07-16 21:21:11 +0000878 self.send(msg)
Benjamin Peterson822b21c2009-01-18 00:04:57 +0000879 if message_body is not None:
Jeremy Hylton236654b2009-03-27 20:24:34 +0000880 # message_body was not a string (i.e. it is a file), and
881 # we must run the risk of Nagle.
Benjamin Peterson822b21c2009-01-18 00:04:57 +0000882 self.send(message_body)
Jeremy Hylton8531b1b2002-07-16 21:21:11 +0000883
Martin v. Löwisaf7dc8d2003-11-19 19:51:55 +0000884 def putrequest(self, method, url, skip_host=0, skip_accept_encoding=0):
Greg Steindd6eefb2000-07-18 09:09:48 +0000885 """Send a request to the server.
Greg Stein5e0fa402000-06-26 08:28:01 +0000886
Greg Steindd6eefb2000-07-18 09:09:48 +0000887 `method' specifies an HTTP request method, e.g. 'GET'.
888 `url' specifies the object being requested, e.g. '/index.html'.
Martin v. Löwisaf7dc8d2003-11-19 19:51:55 +0000889 `skip_host' if True does not add automatically a 'Host:' header
890 `skip_accept_encoding' if True does not add automatically an
891 'Accept-Encoding:' header
Greg Steindd6eefb2000-07-18 09:09:48 +0000892 """
Greg Stein5e0fa402000-06-26 08:28:01 +0000893
Greg Stein616a58d2003-06-24 06:35:19 +0000894 # if a prior response has been completed, then forget about it.
Greg Steindd6eefb2000-07-18 09:09:48 +0000895 if self.__response and self.__response.isclosed():
896 self.__response = None
Greg Stein5e0fa402000-06-26 08:28:01 +0000897
Tim Peters58eb11c2004-01-18 20:29:55 +0000898
Greg Steindd6eefb2000-07-18 09:09:48 +0000899 # in certain cases, we cannot issue another request on this connection.
900 # this occurs when:
901 # 1) we are in the process of sending a request. (_CS_REQ_STARTED)
902 # 2) a response to a previous request has signalled that it is going
903 # to close the connection upon completion.
904 # 3) the headers for the previous response have not been read, thus
905 # we cannot determine whether point (2) is true. (_CS_REQ_SENT)
906 #
907 # if there is no prior response, then we can request at will.
908 #
909 # if point (2) is true, then we will have passed the socket to the
910 # response (effectively meaning, "there is no prior response"), and
911 # will open a new one when a new request is made.
912 #
913 # Note: if a prior response exists, then we *can* start a new request.
914 # We are not allowed to begin fetching the response to this new
915 # request, however, until that prior response is complete.
916 #
917 if self.__state == _CS_IDLE:
918 self.__state = _CS_REQ_STARTED
919 else:
Jeremy Hylton6c5e28c2009-03-31 14:35:53 +0000920 raise CannotSendRequest(self.__state)
Greg Stein5e0fa402000-06-26 08:28:01 +0000921
Jeremy Hyltonc1b2cb92003-05-05 16:13:58 +0000922 # Save the method we use, we need it later in the response phase
923 self._method = method
Greg Steindd6eefb2000-07-18 09:09:48 +0000924 if not url:
925 url = '/'
Martin v. Löwisdd5a8602007-06-30 09:22:09 +0000926 request = '%s %s %s' % (method, url, self._http_vsn_str)
Greg Stein5e0fa402000-06-26 08:28:01 +0000927
Martin v. Löwisdd5a8602007-06-30 09:22:09 +0000928 # Non-ASCII characters should have been eliminated earlier
929 self._output(request.encode('ascii'))
Greg Stein5e0fa402000-06-26 08:28:01 +0000930
Greg Steindd6eefb2000-07-18 09:09:48 +0000931 if self._http_vsn == 11:
932 # Issue some standard headers for better HTTP/1.1 compliance
Greg Stein5e0fa402000-06-26 08:28:01 +0000933
Jeremy Hylton3921ff62002-03-09 06:07:23 +0000934 if not skip_host:
935 # this header is issued *only* for HTTP/1.1
936 # connections. more specifically, this means it is
937 # only issued when the client uses the new
938 # HTTPConnection() class. backwards-compat clients
939 # will be using HTTP/1.0 and those clients may be
940 # issuing this header themselves. we should NOT issue
941 # it twice; some web servers (such as Apache) barf
942 # when they see two Host: headers
Guido van Rossumf6922aa2001-01-14 21:03:01 +0000943
Jeremy Hylton3921ff62002-03-09 06:07:23 +0000944 # If we need a non-standard port,include it in the
945 # header. If the request is going through a proxy,
946 # but the host of the actual URL, not the host of the
947 # proxy.
Jeremy Hylton8acf1e02002-03-08 19:35:51 +0000948
Jeremy Hylton3921ff62002-03-09 06:07:23 +0000949 netloc = ''
950 if url.startswith('http'):
951 nil, netloc, nil, nil, nil = urlsplit(url)
952
953 if netloc:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000954 try:
955 netloc_enc = netloc.encode("ascii")
956 except UnicodeEncodeError:
957 netloc_enc = netloc.encode("idna")
958 self.putheader('Host', netloc_enc)
Jeremy Hylton3921ff62002-03-09 06:07:23 +0000959 else:
Senthil Kumaran9da047b2014-04-14 13:07:56 -0400960 if self._tunnel_host:
961 host = self._tunnel_host
962 port = self._tunnel_port
963 else:
964 host = self.host
965 port = self.port
966
Thomas Wouters477c8d52006-05-27 19:21:47 +0000967 try:
Senthil Kumaran9da047b2014-04-14 13:07:56 -0400968 host_enc = host.encode("ascii")
Thomas Wouters477c8d52006-05-27 19:21:47 +0000969 except UnicodeEncodeError:
Senthil Kumaran9da047b2014-04-14 13:07:56 -0400970 host_enc = host.encode("idna")
Senthil Kumaran74ebd9e2010-11-13 12:27:49 +0000971
972 # As per RFC 273, IPv6 address should be wrapped with []
973 # when used as Host header
974
Senthil Kumaran9da047b2014-04-14 13:07:56 -0400975 if host.find(':') >= 0:
Senthil Kumaran74ebd9e2010-11-13 12:27:49 +0000976 host_enc = b'[' + host_enc + b']'
977
Senthil Kumaran9da047b2014-04-14 13:07:56 -0400978 if port == self.default_port:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000979 self.putheader('Host', host_enc)
980 else:
Guido van Rossum98297ee2007-11-06 21:34:58 +0000981 host_enc = host_enc.decode("ascii")
Senthil Kumaran9da047b2014-04-14 13:07:56 -0400982 self.putheader('Host', "%s:%s" % (host_enc, port))
Greg Stein5e0fa402000-06-26 08:28:01 +0000983
Greg Steindd6eefb2000-07-18 09:09:48 +0000984 # note: we are assuming that clients will not attempt to set these
985 # headers since *this* library must deal with the
986 # consequences. this also means that when the supporting
987 # libraries are updated to recognize other forms, then this
988 # code should be changed (removed or updated).
Greg Stein5e0fa402000-06-26 08:28:01 +0000989
Greg Steindd6eefb2000-07-18 09:09:48 +0000990 # we only want a Content-Encoding of "identity" since we don't
991 # support encodings such as x-gzip or x-deflate.
Martin v. Löwisaf7dc8d2003-11-19 19:51:55 +0000992 if not skip_accept_encoding:
993 self.putheader('Accept-Encoding', 'identity')
Greg Stein5e0fa402000-06-26 08:28:01 +0000994
Greg Steindd6eefb2000-07-18 09:09:48 +0000995 # we can accept "chunked" Transfer-Encodings, but no others
996 # NOTE: no TE header implies *only* "chunked"
997 #self.putheader('TE', 'chunked')
Greg Stein5e0fa402000-06-26 08:28:01 +0000998
Greg Steindd6eefb2000-07-18 09:09:48 +0000999 # if TE is supplied in the header, then it must appear in a
1000 # Connection header.
1001 #self.putheader('Connection', 'TE')
Greg Stein5e0fa402000-06-26 08:28:01 +00001002
Greg Steindd6eefb2000-07-18 09:09:48 +00001003 else:
1004 # For HTTP/1.0, the server will assume "not chunked"
1005 pass
Greg Stein5e0fa402000-06-26 08:28:01 +00001006
Benjamin Petersonf608c612008-11-16 18:33:53 +00001007 def putheader(self, header, *values):
Greg Steindd6eefb2000-07-18 09:09:48 +00001008 """Send a request header line to the server.
Greg Stein5e0fa402000-06-26 08:28:01 +00001009
Greg Steindd6eefb2000-07-18 09:09:48 +00001010 For example: h.putheader('Accept', 'text/html')
1011 """
1012 if self.__state != _CS_REQ_STARTED:
1013 raise CannotSendHeader()
Greg Stein5e0fa402000-06-26 08:28:01 +00001014
Guido van Rossum98297ee2007-11-06 21:34:58 +00001015 if hasattr(header, 'encode'):
1016 header = header.encode('ascii')
Benjamin Petersonf608c612008-11-16 18:33:53 +00001017 values = list(values)
1018 for i, one_value in enumerate(values):
1019 if hasattr(one_value, 'encode'):
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001020 values[i] = one_value.encode('latin-1')
Senthil Kumaran58d5dbf2010-10-03 18:22:42 +00001021 elif isinstance(one_value, int):
1022 values[i] = str(one_value).encode('ascii')
Benjamin Petersonf608c612008-11-16 18:33:53 +00001023 value = b'\r\n\t'.join(values)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001024 header = header + b': ' + value
1025 self._output(header)
Greg Stein5e0fa402000-06-26 08:28:01 +00001026
Benjamin Peterson1742e402008-11-30 22:15:29 +00001027 def endheaders(self, message_body=None):
1028 """Indicate that the last header line has been sent to the server.
Greg Stein5e0fa402000-06-26 08:28:01 +00001029
Senthil Kumaranad87fa62011-10-05 23:26:49 +08001030 This method sends the request to the server. The optional message_body
1031 argument can be used to pass a message body associated with the
1032 request. The message body will be sent in the same packet as the
1033 message headers if it is a string, otherwise it is sent as a separate
1034 packet.
Benjamin Peterson1742e402008-11-30 22:15:29 +00001035 """
Greg Steindd6eefb2000-07-18 09:09:48 +00001036 if self.__state == _CS_REQ_STARTED:
1037 self.__state = _CS_REQ_SENT
1038 else:
1039 raise CannotSendHeader()
Benjamin Peterson1742e402008-11-30 22:15:29 +00001040 self._send_output(message_body)
Greg Stein5e0fa402000-06-26 08:28:01 +00001041
Greg Steindd6eefb2000-07-18 09:09:48 +00001042 def request(self, method, url, body=None, headers={}):
1043 """Send a complete request to the server."""
Jeremy Hylton636950f2009-03-28 04:34:21 +00001044 self._send_request(method, url, body, headers)
Greg Stein5e0fa402000-06-26 08:28:01 +00001045
Benjamin Peterson1742e402008-11-30 22:15:29 +00001046 def _set_content_length(self, body):
1047 # Set the content-length based on the body.
1048 thelen = None
1049 try:
1050 thelen = str(len(body))
1051 except TypeError as te:
1052 # If this is a file-like object, try to
1053 # fstat its file descriptor
Benjamin Peterson1742e402008-11-30 22:15:29 +00001054 try:
1055 thelen = str(os.fstat(body.fileno()).st_size)
1056 except (AttributeError, OSError):
1057 # Don't send a length if this failed
1058 if self.debuglevel > 0: print("Cannot stat!!")
1059
1060 if thelen is not None:
1061 self.putheader('Content-Length', thelen)
1062
Greg Steindd6eefb2000-07-18 09:09:48 +00001063 def _send_request(self, method, url, body, headers):
Jeremy Hylton636950f2009-03-28 04:34:21 +00001064 # Honor explicitly requested Host: and Accept-Encoding: headers.
Jeremy Hylton2c178252004-08-07 16:28:14 +00001065 header_names = dict.fromkeys([k.lower() for k in headers])
1066 skips = {}
1067 if 'host' in header_names:
1068 skips['skip_host'] = 1
1069 if 'accept-encoding' in header_names:
1070 skips['skip_accept_encoding'] = 1
Greg Stein5e0fa402000-06-26 08:28:01 +00001071
Jeremy Hylton2c178252004-08-07 16:28:14 +00001072 self.putrequest(method, url, **skips)
1073
Senthil Kumaran5fa4a892012-05-19 16:58:09 +08001074 if body is not None and ('content-length' not in header_names):
Benjamin Peterson1742e402008-11-30 22:15:29 +00001075 self._set_content_length(body)
Guido van Rossumcc2b0162007-02-11 06:12:03 +00001076 for hdr, value in headers.items():
Greg Steindd6eefb2000-07-18 09:09:48 +00001077 self.putheader(hdr, value)
Jeremy Hyltonef9f48e2009-03-26 22:04:05 +00001078 if isinstance(body, str):
Jeremy Hylton236654b2009-03-27 20:24:34 +00001079 # RFC 2616 Section 3.7.1 says that text default has a
1080 # default charset of iso-8859-1.
1081 body = body.encode('iso-8859-1')
Jeremy Hyltonef9f48e2009-03-26 22:04:05 +00001082 self.endheaders(body)
Greg Stein5e0fa402000-06-26 08:28:01 +00001083
Greg Steindd6eefb2000-07-18 09:09:48 +00001084 def getresponse(self):
Jeremy Hylton6c5e28c2009-03-31 14:35:53 +00001085 """Get the response from the server.
1086
1087 If the HTTPConnection is in the correct state, returns an
1088 instance of HTTPResponse or of whatever object is returned by
1089 class the response_class variable.
1090
1091 If a request has not been sent or if a previous response has
1092 not be handled, ResponseNotReady is raised. If the HTTP
1093 response indicates that the connection should be closed, then
1094 it will be closed before the response is returned. When the
1095 connection is closed, the underlying socket is closed.
1096 """
Greg Stein5e0fa402000-06-26 08:28:01 +00001097
Greg Stein616a58d2003-06-24 06:35:19 +00001098 # if a prior response has been completed, then forget about it.
Greg Steindd6eefb2000-07-18 09:09:48 +00001099 if self.__response and self.__response.isclosed():
1100 self.__response = None
Greg Stein5e0fa402000-06-26 08:28:01 +00001101
Greg Steindd6eefb2000-07-18 09:09:48 +00001102 # if a prior response exists, then it must be completed (otherwise, we
1103 # cannot read this response's header to determine the connection-close
1104 # behavior)
1105 #
1106 # note: if a prior response existed, but was connection-close, then the
1107 # socket and response were made independent of this HTTPConnection
1108 # object since a new request requires that we open a whole new
1109 # connection
1110 #
1111 # this means the prior response had one of two states:
1112 # 1) will_close: this connection was reset and the prior socket and
1113 # response operate independently
1114 # 2) persistent: the response was retained and we await its
1115 # isclosed() status to become true.
1116 #
1117 if self.__state != _CS_REQ_SENT or self.__response:
Jeremy Hylton6c5e28c2009-03-31 14:35:53 +00001118 raise ResponseNotReady(self.__state)
Greg Stein5e0fa402000-06-26 08:28:01 +00001119
Jeremy Hylton30f86742000-09-18 22:50:38 +00001120 if self.debuglevel > 0:
Jeremy Hyltond46aa372002-07-06 18:48:07 +00001121 response = self.response_class(self.sock, self.debuglevel,
Jeremy Hyltonc1b2cb92003-05-05 16:13:58 +00001122 method=self._method)
Jeremy Hylton30f86742000-09-18 22:50:38 +00001123 else:
Antoine Pitrou988dbd72010-12-17 17:35:56 +00001124 response = self.response_class(self.sock, method=self._method)
Greg Stein5e0fa402000-06-26 08:28:01 +00001125
Serhiy Storchakab491e052014-12-01 13:07:45 +02001126 try:
1127 response.begin()
1128 assert response.will_close != _UNKNOWN
1129 self.__state = _CS_IDLE
Greg Stein5e0fa402000-06-26 08:28:01 +00001130
Serhiy Storchakab491e052014-12-01 13:07:45 +02001131 if response.will_close:
1132 # this effectively passes the connection to the response
1133 self.close()
1134 else:
1135 # remember this, so we can tell when it is complete
1136 self.__response = response
Greg Stein5e0fa402000-06-26 08:28:01 +00001137
Serhiy Storchakab491e052014-12-01 13:07:45 +02001138 return response
1139 except:
1140 response.close()
1141 raise
Greg Stein5e0fa402000-06-26 08:28:01 +00001142
Thomas Wouters47b49bf2007-08-30 22:15:33 +00001143try:
1144 import ssl
Brett Cannoncd171c82013-07-04 17:43:24 -04001145except ImportError:
Thomas Wouters47b49bf2007-08-30 22:15:33 +00001146 pass
1147else:
1148 class HTTPSConnection(HTTPConnection):
1149 "This class allows communication via SSL."
Jeremy Hylton29d27ac2002-07-09 21:22:36 +00001150
Thomas Wouters47b49bf2007-08-30 22:15:33 +00001151 default_port = HTTPS_PORT
Jeremy Hylton29d27ac2002-07-09 21:22:36 +00001152
Antoine Pitrou803e6d62010-10-13 10:36:15 +00001153 # XXX Should key_file and cert_file be deprecated in favour of context?
1154
Thomas Wouters47b49bf2007-08-30 22:15:33 +00001155 def __init__(self, host, port=None, key_file=None, cert_file=None,
Senthil Kumaran052ddb02013-03-18 14:11:41 -07001156 timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
1157 source_address=None, *, context=None,
1158 check_hostname=None):
1159 super(HTTPSConnection, self).__init__(host, port, timeout,
Gregory P. Smithb4066372010-01-03 03:28:29 +00001160 source_address)
Thomas Wouters47b49bf2007-08-30 22:15:33 +00001161 self.key_file = key_file
1162 self.cert_file = cert_file
Antoine Pitrou803e6d62010-10-13 10:36:15 +00001163 if context is None:
Benjamin Peterson4ffb0752014-11-03 14:29:33 -05001164 context = ssl._create_default_https_context()
Antoine Pitrou803e6d62010-10-13 10:36:15 +00001165 will_verify = context.verify_mode != ssl.CERT_NONE
1166 if check_hostname is None:
Benjamin Petersona090f012014-12-07 13:18:25 -05001167 check_hostname = context.check_hostname
1168 if check_hostname and not will_verify:
Antoine Pitrou803e6d62010-10-13 10:36:15 +00001169 raise ValueError("check_hostname needs a SSL context with "
1170 "either CERT_OPTIONAL or CERT_REQUIRED")
1171 if key_file or cert_file:
Antoine Pitrou80603992010-10-13 10:45:16 +00001172 context.load_cert_chain(cert_file, key_file)
Antoine Pitrou803e6d62010-10-13 10:36:15 +00001173 self._context = context
1174 self._check_hostname = check_hostname
Jeremy Hylton29d27ac2002-07-09 21:22:36 +00001175
Thomas Wouters47b49bf2007-08-30 22:15:33 +00001176 def connect(self):
1177 "Connect to a host on a given (SSL) port."
Jeremy Hylton29d27ac2002-07-09 21:22:36 +00001178
Senthil Kumaran9da047b2014-04-14 13:07:56 -04001179 super().connect()
Senthil Kumaran97f0c6b2009-07-25 04:24:38 +00001180
1181 if self._tunnel_host:
Senthil Kumaran9da047b2014-04-14 13:07:56 -04001182 server_hostname = self._tunnel_host
1183 else:
1184 server_hostname = self.host
Senthil Kumaran97f0c6b2009-07-25 04:24:38 +00001185
Senthil Kumaran9da047b2014-04-14 13:07:56 -04001186 self.sock = self._context.wrap_socket(self.sock,
Benjamin Peterson7243b572014-11-23 17:04:34 -06001187 server_hostname=server_hostname)
Christian Heimesf723c712013-12-05 07:51:17 +01001188 if not self._context.check_hostname and self._check_hostname:
1189 try:
Senthil Kumaran9da047b2014-04-14 13:07:56 -04001190 ssl.match_hostname(self.sock.getpeercert(), server_hostname)
Christian Heimesf723c712013-12-05 07:51:17 +01001191 except Exception:
1192 self.sock.shutdown(socket.SHUT_RDWR)
1193 self.sock.close()
1194 raise
Jeremy Hylton29d27ac2002-07-09 21:22:36 +00001195
Thomas Wouters47b49bf2007-08-30 22:15:33 +00001196 __all__.append("HTTPSConnection")
Greg Stein5e0fa402000-06-26 08:28:01 +00001197
Greg Stein5e0fa402000-06-26 08:28:01 +00001198class HTTPException(Exception):
Jeremy Hylton12f4f352002-07-06 18:55:01 +00001199 # Subclasses that define an __init__ must call Exception.__init__
1200 # or define self.args. Otherwise, str() will fail.
Greg Steindd6eefb2000-07-18 09:09:48 +00001201 pass
Greg Stein5e0fa402000-06-26 08:28:01 +00001202
1203class NotConnected(HTTPException):
Greg Steindd6eefb2000-07-18 09:09:48 +00001204 pass
Greg Stein5e0fa402000-06-26 08:28:01 +00001205
Skip Montanaro9d389972002-03-24 16:53:50 +00001206class InvalidURL(HTTPException):
1207 pass
1208
Greg Stein5e0fa402000-06-26 08:28:01 +00001209class UnknownProtocol(HTTPException):
Greg Steindd6eefb2000-07-18 09:09:48 +00001210 def __init__(self, version):
Jeremy Hylton12f4f352002-07-06 18:55:01 +00001211 self.args = version,
Greg Steindd6eefb2000-07-18 09:09:48 +00001212 self.version = version
Greg Stein5e0fa402000-06-26 08:28:01 +00001213
1214class UnknownTransferEncoding(HTTPException):
Greg Steindd6eefb2000-07-18 09:09:48 +00001215 pass
Greg Stein5e0fa402000-06-26 08:28:01 +00001216
Greg Stein5e0fa402000-06-26 08:28:01 +00001217class UnimplementedFileMode(HTTPException):
Greg Steindd6eefb2000-07-18 09:09:48 +00001218 pass
Greg Stein5e0fa402000-06-26 08:28:01 +00001219
1220class IncompleteRead(HTTPException):
Benjamin Peterson6accb982009-03-02 22:50:25 +00001221 def __init__(self, partial, expected=None):
Jeremy Hylton12f4f352002-07-06 18:55:01 +00001222 self.args = partial,
Greg Steindd6eefb2000-07-18 09:09:48 +00001223 self.partial = partial
Benjamin Peterson6accb982009-03-02 22:50:25 +00001224 self.expected = expected
1225 def __repr__(self):
1226 if self.expected is not None:
1227 e = ', %i more expected' % self.expected
1228 else:
1229 e = ''
Serhiy Storchaka465e60e2014-07-25 23:36:00 +03001230 return '%s(%i bytes read%s)' % (self.__class__.__name__,
1231 len(self.partial), e)
Benjamin Peterson6accb982009-03-02 22:50:25 +00001232 def __str__(self):
1233 return repr(self)
Greg Stein5e0fa402000-06-26 08:28:01 +00001234
1235class ImproperConnectionState(HTTPException):
Greg Steindd6eefb2000-07-18 09:09:48 +00001236 pass
Greg Stein5e0fa402000-06-26 08:28:01 +00001237
1238class CannotSendRequest(ImproperConnectionState):
Greg Steindd6eefb2000-07-18 09:09:48 +00001239 pass
Greg Stein5e0fa402000-06-26 08:28:01 +00001240
1241class CannotSendHeader(ImproperConnectionState):
Greg Steindd6eefb2000-07-18 09:09:48 +00001242 pass
Greg Stein5e0fa402000-06-26 08:28:01 +00001243
1244class ResponseNotReady(ImproperConnectionState):
Greg Steindd6eefb2000-07-18 09:09:48 +00001245 pass
Greg Stein5e0fa402000-06-26 08:28:01 +00001246
1247class BadStatusLine(HTTPException):
Greg Steindd6eefb2000-07-18 09:09:48 +00001248 def __init__(self, line):
Benjamin Peterson11dbfd42010-03-21 22:50:04 +00001249 if not line:
1250 line = repr(line)
Jeremy Hylton12f4f352002-07-06 18:55:01 +00001251 self.args = line,
Greg Steindd6eefb2000-07-18 09:09:48 +00001252 self.line = line
Greg Stein5e0fa402000-06-26 08:28:01 +00001253
Senthil Kumaran5466bf12010-12-18 16:55:23 +00001254class LineTooLong(HTTPException):
1255 def __init__(self, line_type):
1256 HTTPException.__init__(self, "got more than %d bytes when reading %s"
1257 % (_MAXLINE, line_type))
1258
Greg Stein5e0fa402000-06-26 08:28:01 +00001259# for backwards compatibility
1260error = HTTPException