blob: 392715b24dc4f0a0e8674f9c2e727920d98995e3 [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
Greg Stein5e0fa402000-06-26 08:28:01 +0000684
Senthil Kumaran052ddb02013-03-18 14:11:41 -0700685 def __init__(self, host, port=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
686 source_address=None):
Guido van Rossumd8faa362007-04-27 19:54:29 +0000687 self.timeout = timeout
Gregory P. Smithb4066372010-01-03 03:28:29 +0000688 self.source_address = source_address
Greg Steindd6eefb2000-07-18 09:09:48 +0000689 self.sock = None
Jeremy Hylton8531b1b2002-07-16 21:21:11 +0000690 self._buffer = []
Greg Steindd6eefb2000-07-18 09:09:48 +0000691 self.__response = None
692 self.__state = _CS_IDLE
Jeremy Hyltonc1b2cb92003-05-05 16:13:58 +0000693 self._method = None
Senthil Kumaran97f0c6b2009-07-25 04:24:38 +0000694 self._tunnel_host = None
695 self._tunnel_port = None
Georg Brandlc7c199f2011-01-22 22:06:24 +0000696 self._tunnel_headers = {}
Tim Petersc411dba2002-07-16 21:35:23 +0000697
Senthil Kumaran9da047b2014-04-14 13:07:56 -0400698 (self.host, self.port) = self._get_hostport(host, port)
699
700 # This is stored as an instance variable to allow unit
701 # tests to replace it with a suitable mockup
702 self._create_connection = socket.create_connection
Greg Stein5e0fa402000-06-26 08:28:01 +0000703
Senthil Kumaran47fff872009-12-20 07:10:31 +0000704 def set_tunnel(self, host, port=None, headers=None):
Senthil Kumaran9da047b2014-04-14 13:07:56 -0400705 """Set up host and port for HTTP CONNECT tunnelling.
Senthil Kumaran47fff872009-12-20 07:10:31 +0000706
Senthil Kumaran9da047b2014-04-14 13:07:56 -0400707 In a connection that uses HTTP CONNECT tunneling, the host passed to the
708 constructor is used as a proxy server that relays all communication to
709 the endpoint passed to `set_tunnel`. This done by sending an HTTP
710 CONNECT request to the proxy server when the connection is established.
711
712 This method must be called before the HTML connection has been
713 established.
714
715 The headers argument should be a mapping of extra HTTP headers to send
716 with the CONNECT request.
Senthil Kumaran47fff872009-12-20 07:10:31 +0000717 """
Senthil Kumaran9da047b2014-04-14 13:07:56 -0400718
719 if self.sock:
720 raise RuntimeError("Can't set up tunnel for established connection")
721
Serhiy Storchaka4ac7ed92014-12-12 09:29:15 +0200722 self._tunnel_host, self._tunnel_port = self._get_hostport(host, port)
Senthil Kumaran47fff872009-12-20 07:10:31 +0000723 if headers:
724 self._tunnel_headers = headers
725 else:
726 self._tunnel_headers.clear()
Senthil Kumaran97f0c6b2009-07-25 04:24:38 +0000727
Senthil Kumaran9da047b2014-04-14 13:07:56 -0400728 def _get_hostport(self, host, port):
Greg Steindd6eefb2000-07-18 09:09:48 +0000729 if port is None:
Skip Montanaro10e6e0e2004-09-14 16:32:02 +0000730 i = host.rfind(':')
Skip Montanarocae14d22004-09-14 17:55:21 +0000731 j = host.rfind(']') # ipv6 addresses have [...]
732 if i > j:
Skip Montanaro9d389972002-03-24 16:53:50 +0000733 try:
734 port = int(host[i+1:])
735 except ValueError:
Łukasz Langaa5a9a9c2011-10-18 21:17:39 +0200736 if host[i+1:] == "": # http://foo.com:/ == http://foo.com/
737 port = self.default_port
738 else:
739 raise InvalidURL("nonnumeric port: '%s'" % host[i+1:])
Greg Steindd6eefb2000-07-18 09:09:48 +0000740 host = host[:i]
741 else:
742 port = self.default_port
Raymond Hettinger4d037912004-10-14 15:23:38 +0000743 if host and host[0] == '[' and host[-1] == ']':
Brett Cannon0a1af4a2004-09-15 23:26:23 +0000744 host = host[1:-1]
Senthil Kumaran9da047b2014-04-14 13:07:56 -0400745
746 return (host, port)
Greg Stein5e0fa402000-06-26 08:28:01 +0000747
Jeremy Hylton30f86742000-09-18 22:50:38 +0000748 def set_debuglevel(self, level):
749 self.debuglevel = level
750
Senthil Kumaran97f0c6b2009-07-25 04:24:38 +0000751 def _tunnel(self):
Serhiy Storchaka4ac7ed92014-12-12 09:29:15 +0200752 connect_str = "CONNECT %s:%d HTTP/1.0\r\n" % (self._tunnel_host,
753 self._tunnel_port)
Senthil Kumaran97f0c6b2009-07-25 04:24:38 +0000754 connect_bytes = connect_str.encode("ascii")
755 self.send(connect_bytes)
Georg Brandlc7c199f2011-01-22 22:06:24 +0000756 for header, value in self._tunnel_headers.items():
Senthil Kumaran47fff872009-12-20 07:10:31 +0000757 header_str = "%s: %s\r\n" % (header, value)
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000758 header_bytes = header_str.encode("latin-1")
Senthil Kumaran47fff872009-12-20 07:10:31 +0000759 self.send(header_bytes)
Georg Brandlc7c199f2011-01-22 22:06:24 +0000760 self.send(b'\r\n')
Senthil Kumaran47fff872009-12-20 07:10:31 +0000761
Georg Brandlc7c199f2011-01-22 22:06:24 +0000762 response = self.response_class(self.sock, method=self._method)
Senthil Kumaran97f0c6b2009-07-25 04:24:38 +0000763 (version, code, message) = response._read_status()
Senthil Kumaran47fff872009-12-20 07:10:31 +0000764
Serhiy Storchakae4db7692014-12-23 16:28:28 +0200765 if code != http.HTTPStatus.OK:
Senthil Kumaran97f0c6b2009-07-25 04:24:38 +0000766 self.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +0200767 raise OSError("Tunnel connection failed: %d %s" % (code,
768 message.strip()))
Senthil Kumaran97f0c6b2009-07-25 04:24:38 +0000769 while True:
Senthil Kumaran5466bf12010-12-18 16:55:23 +0000770 line = response.fp.readline(_MAXLINE + 1)
771 if len(line) > _MAXLINE:
772 raise LineTooLong("header line")
Senthil Kumaranb12771a2012-04-23 23:50:07 +0800773 if not line:
774 # for sites which EOF without sending a trailer
775 break
Senthil Kumaran7e70a5c2012-04-29 10:39:49 +0800776 if line in (b'\r\n', b'\n', b''):
Senthil Kumaran97f0c6b2009-07-25 04:24:38 +0000777 break
778
Greg Steindd6eefb2000-07-18 09:09:48 +0000779 def connect(self):
780 """Connect to the host and port specified in __init__."""
Benjamin Peterson9d8a3ad2015-01-23 11:02:57 -0500781 self.sock = self._create_connection(
782 (self.host,self.port), self.timeout, self.source_address)
783 self.sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
Senthil Kumaran9da047b2014-04-14 13:07:56 -0400784
Senthil Kumaran97f0c6b2009-07-25 04:24:38 +0000785 if self._tunnel_host:
786 self._tunnel()
Greg Stein5e0fa402000-06-26 08:28:01 +0000787
Greg Steindd6eefb2000-07-18 09:09:48 +0000788 def close(self):
789 """Close the connection to the HTTP server."""
790 if self.sock:
Tim Peters07e99cb2001-01-14 23:47:14 +0000791 self.sock.close() # close it manually... there may be other refs
Greg Steindd6eefb2000-07-18 09:09:48 +0000792 self.sock = None
793 if self.__response:
794 self.__response.close()
795 self.__response = None
796 self.__state = _CS_IDLE
Greg Stein5e0fa402000-06-26 08:28:01 +0000797
Senthil Kumaran5a2da3b2010-10-02 10:33:13 +0000798 def send(self, data):
Senthil Kumaran7bc0d872010-12-19 10:49:52 +0000799 """Send `data' to the server.
800 ``data`` can be a string object, a bytes object, an array object, a
801 file-like object that supports a .read() method, or an iterable object.
802 """
803
Greg Steindd6eefb2000-07-18 09:09:48 +0000804 if self.sock is None:
805 if self.auto_open:
806 self.connect()
807 else:
808 raise NotConnected()
Greg Stein5e0fa402000-06-26 08:28:01 +0000809
Jeremy Hylton30f86742000-09-18 22:50:38 +0000810 if self.debuglevel > 0:
Senthil Kumaran5a2da3b2010-10-02 10:33:13 +0000811 print("send:", repr(data))
Jeremy Hylton636950f2009-03-28 04:34:21 +0000812 blocksize = 8192
Senthil Kumaran5a2da3b2010-10-02 10:33:13 +0000813 if hasattr(data, "read") :
Jeremy Hylton636950f2009-03-28 04:34:21 +0000814 if self.debuglevel > 0:
815 print("sendIng a read()able")
816 encode = False
Antoine Pitrouead1d622009-09-29 18:44:53 +0000817 try:
Senthil Kumaran5a2da3b2010-10-02 10:33:13 +0000818 mode = data.mode
Antoine Pitrouead1d622009-09-29 18:44:53 +0000819 except AttributeError:
820 # io.BytesIO and other file-like objects don't have a `mode`
821 # attribute.
822 pass
823 else:
824 if "b" not in mode:
825 encode = True
826 if self.debuglevel > 0:
827 print("encoding file using iso-8859-1")
Jeremy Hylton636950f2009-03-28 04:34:21 +0000828 while 1:
Senthil Kumaran5a2da3b2010-10-02 10:33:13 +0000829 datablock = data.read(blocksize)
830 if not datablock:
Jeremy Hylton636950f2009-03-28 04:34:21 +0000831 break
832 if encode:
Senthil Kumaran5a2da3b2010-10-02 10:33:13 +0000833 datablock = datablock.encode("iso-8859-1")
834 self.sock.sendall(datablock)
Andrew Svetlov7b2c8bb2013-04-12 22:49:19 +0300835 return
Senthil Kumaran7bc0d872010-12-19 10:49:52 +0000836 try:
Senthil Kumaran5a2da3b2010-10-02 10:33:13 +0000837 self.sock.sendall(data)
Senthil Kumaran7bc0d872010-12-19 10:49:52 +0000838 except TypeError:
839 if isinstance(data, collections.Iterable):
840 for d in data:
841 self.sock.sendall(d)
842 else:
Georg Brandl25e2cd12011-08-03 08:27:00 +0200843 raise TypeError("data should be a bytes-like object "
844 "or an iterable, got %r" % type(data))
Greg Stein5e0fa402000-06-26 08:28:01 +0000845
Jeremy Hylton8531b1b2002-07-16 21:21:11 +0000846 def _output(self, s):
847 """Add a line of output to the current request buffer.
Tim Peters469cdad2002-08-08 20:19:19 +0000848
Jeremy Hyltone3252ec2002-07-16 21:41:43 +0000849 Assumes that the line does *not* end with \\r\\n.
Jeremy Hylton8531b1b2002-07-16 21:21:11 +0000850 """
851 self._buffer.append(s)
852
Benjamin Peterson1742e402008-11-30 22:15:29 +0000853 def _send_output(self, message_body=None):
Jeremy Hylton8531b1b2002-07-16 21:21:11 +0000854 """Send the currently buffered request and clear the buffer.
855
Jeremy Hyltone3252ec2002-07-16 21:41:43 +0000856 Appends an extra \\r\\n to the buffer.
Benjamin Peterson822b21c2009-01-18 00:04:57 +0000857 A message_body may be specified, to be appended to the request.
Jeremy Hylton8531b1b2002-07-16 21:21:11 +0000858 """
Martin v. Löwisdd5a8602007-06-30 09:22:09 +0000859 self._buffer.extend((b"", b""))
860 msg = b"\r\n".join(self._buffer)
Jeremy Hylton8531b1b2002-07-16 21:21:11 +0000861 del self._buffer[:]
Benjamin Peterson9d8a3ad2015-01-23 11:02:57 -0500862
Jeremy Hylton8531b1b2002-07-16 21:21:11 +0000863 self.send(msg)
Benjamin Peterson822b21c2009-01-18 00:04:57 +0000864 if message_body is not None:
Benjamin Peterson822b21c2009-01-18 00:04:57 +0000865 self.send(message_body)
Jeremy Hylton8531b1b2002-07-16 21:21:11 +0000866
Martin v. Löwisaf7dc8d2003-11-19 19:51:55 +0000867 def putrequest(self, method, url, skip_host=0, skip_accept_encoding=0):
Greg Steindd6eefb2000-07-18 09:09:48 +0000868 """Send a request to the server.
Greg Stein5e0fa402000-06-26 08:28:01 +0000869
Greg Steindd6eefb2000-07-18 09:09:48 +0000870 `method' specifies an HTTP request method, e.g. 'GET'.
871 `url' specifies the object being requested, e.g. '/index.html'.
Martin v. Löwisaf7dc8d2003-11-19 19:51:55 +0000872 `skip_host' if True does not add automatically a 'Host:' header
873 `skip_accept_encoding' if True does not add automatically an
874 'Accept-Encoding:' header
Greg Steindd6eefb2000-07-18 09:09:48 +0000875 """
Greg Stein5e0fa402000-06-26 08:28:01 +0000876
Greg Stein616a58d2003-06-24 06:35:19 +0000877 # if a prior response has been completed, then forget about it.
Greg Steindd6eefb2000-07-18 09:09:48 +0000878 if self.__response and self.__response.isclosed():
879 self.__response = None
Greg Stein5e0fa402000-06-26 08:28:01 +0000880
Tim Peters58eb11c2004-01-18 20:29:55 +0000881
Greg Steindd6eefb2000-07-18 09:09:48 +0000882 # in certain cases, we cannot issue another request on this connection.
883 # this occurs when:
884 # 1) we are in the process of sending a request. (_CS_REQ_STARTED)
885 # 2) a response to a previous request has signalled that it is going
886 # to close the connection upon completion.
887 # 3) the headers for the previous response have not been read, thus
888 # we cannot determine whether point (2) is true. (_CS_REQ_SENT)
889 #
890 # if there is no prior response, then we can request at will.
891 #
892 # if point (2) is true, then we will have passed the socket to the
893 # response (effectively meaning, "there is no prior response"), and
894 # will open a new one when a new request is made.
895 #
896 # Note: if a prior response exists, then we *can* start a new request.
897 # We are not allowed to begin fetching the response to this new
898 # request, however, until that prior response is complete.
899 #
900 if self.__state == _CS_IDLE:
901 self.__state = _CS_REQ_STARTED
902 else:
Jeremy Hylton6c5e28c2009-03-31 14:35:53 +0000903 raise CannotSendRequest(self.__state)
Greg Stein5e0fa402000-06-26 08:28:01 +0000904
Jeremy Hyltonc1b2cb92003-05-05 16:13:58 +0000905 # Save the method we use, we need it later in the response phase
906 self._method = method
Greg Steindd6eefb2000-07-18 09:09:48 +0000907 if not url:
908 url = '/'
Martin v. Löwisdd5a8602007-06-30 09:22:09 +0000909 request = '%s %s %s' % (method, url, self._http_vsn_str)
Greg Stein5e0fa402000-06-26 08:28:01 +0000910
Martin v. Löwisdd5a8602007-06-30 09:22:09 +0000911 # Non-ASCII characters should have been eliminated earlier
912 self._output(request.encode('ascii'))
Greg Stein5e0fa402000-06-26 08:28:01 +0000913
Greg Steindd6eefb2000-07-18 09:09:48 +0000914 if self._http_vsn == 11:
915 # Issue some standard headers for better HTTP/1.1 compliance
Greg Stein5e0fa402000-06-26 08:28:01 +0000916
Jeremy Hylton3921ff62002-03-09 06:07:23 +0000917 if not skip_host:
918 # this header is issued *only* for HTTP/1.1
919 # connections. more specifically, this means it is
920 # only issued when the client uses the new
921 # HTTPConnection() class. backwards-compat clients
922 # will be using HTTP/1.0 and those clients may be
923 # issuing this header themselves. we should NOT issue
924 # it twice; some web servers (such as Apache) barf
925 # when they see two Host: headers
Guido van Rossumf6922aa2001-01-14 21:03:01 +0000926
Jeremy Hylton3921ff62002-03-09 06:07:23 +0000927 # If we need a non-standard port,include it in the
928 # header. If the request is going through a proxy,
929 # but the host of the actual URL, not the host of the
930 # proxy.
Jeremy Hylton8acf1e02002-03-08 19:35:51 +0000931
Jeremy Hylton3921ff62002-03-09 06:07:23 +0000932 netloc = ''
933 if url.startswith('http'):
934 nil, netloc, nil, nil, nil = urlsplit(url)
935
936 if netloc:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000937 try:
938 netloc_enc = netloc.encode("ascii")
939 except UnicodeEncodeError:
940 netloc_enc = netloc.encode("idna")
941 self.putheader('Host', netloc_enc)
Jeremy Hylton3921ff62002-03-09 06:07:23 +0000942 else:
Senthil Kumaran9da047b2014-04-14 13:07:56 -0400943 if self._tunnel_host:
944 host = self._tunnel_host
945 port = self._tunnel_port
946 else:
947 host = self.host
948 port = self.port
949
Thomas Wouters477c8d52006-05-27 19:21:47 +0000950 try:
Senthil Kumaran9da047b2014-04-14 13:07:56 -0400951 host_enc = host.encode("ascii")
Thomas Wouters477c8d52006-05-27 19:21:47 +0000952 except UnicodeEncodeError:
Senthil Kumaran9da047b2014-04-14 13:07:56 -0400953 host_enc = host.encode("idna")
Senthil Kumaran74ebd9e2010-11-13 12:27:49 +0000954
955 # As per RFC 273, IPv6 address should be wrapped with []
956 # when used as Host header
957
Senthil Kumaran9da047b2014-04-14 13:07:56 -0400958 if host.find(':') >= 0:
Senthil Kumaran74ebd9e2010-11-13 12:27:49 +0000959 host_enc = b'[' + host_enc + b']'
960
Senthil Kumaran9da047b2014-04-14 13:07:56 -0400961 if port == self.default_port:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000962 self.putheader('Host', host_enc)
963 else:
Guido van Rossum98297ee2007-11-06 21:34:58 +0000964 host_enc = host_enc.decode("ascii")
Senthil Kumaran9da047b2014-04-14 13:07:56 -0400965 self.putheader('Host', "%s:%s" % (host_enc, port))
Greg Stein5e0fa402000-06-26 08:28:01 +0000966
Greg Steindd6eefb2000-07-18 09:09:48 +0000967 # note: we are assuming that clients will not attempt to set these
968 # headers since *this* library must deal with the
969 # consequences. this also means that when the supporting
970 # libraries are updated to recognize other forms, then this
971 # code should be changed (removed or updated).
Greg Stein5e0fa402000-06-26 08:28:01 +0000972
Greg Steindd6eefb2000-07-18 09:09:48 +0000973 # we only want a Content-Encoding of "identity" since we don't
974 # support encodings such as x-gzip or x-deflate.
Martin v. Löwisaf7dc8d2003-11-19 19:51:55 +0000975 if not skip_accept_encoding:
976 self.putheader('Accept-Encoding', 'identity')
Greg Stein5e0fa402000-06-26 08:28:01 +0000977
Greg Steindd6eefb2000-07-18 09:09:48 +0000978 # we can accept "chunked" Transfer-Encodings, but no others
979 # NOTE: no TE header implies *only* "chunked"
980 #self.putheader('TE', 'chunked')
Greg Stein5e0fa402000-06-26 08:28:01 +0000981
Greg Steindd6eefb2000-07-18 09:09:48 +0000982 # if TE is supplied in the header, then it must appear in a
983 # Connection header.
984 #self.putheader('Connection', 'TE')
Greg Stein5e0fa402000-06-26 08:28:01 +0000985
Greg Steindd6eefb2000-07-18 09:09:48 +0000986 else:
987 # For HTTP/1.0, the server will assume "not chunked"
988 pass
Greg Stein5e0fa402000-06-26 08:28:01 +0000989
Benjamin Petersonf608c612008-11-16 18:33:53 +0000990 def putheader(self, header, *values):
Greg Steindd6eefb2000-07-18 09:09:48 +0000991 """Send a request header line to the server.
Greg Stein5e0fa402000-06-26 08:28:01 +0000992
Greg Steindd6eefb2000-07-18 09:09:48 +0000993 For example: h.putheader('Accept', 'text/html')
994 """
995 if self.__state != _CS_REQ_STARTED:
996 raise CannotSendHeader()
Greg Stein5e0fa402000-06-26 08:28:01 +0000997
Guido van Rossum98297ee2007-11-06 21:34:58 +0000998 if hasattr(header, 'encode'):
999 header = header.encode('ascii')
Benjamin Petersonf608c612008-11-16 18:33:53 +00001000 values = list(values)
1001 for i, one_value in enumerate(values):
1002 if hasattr(one_value, 'encode'):
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00001003 values[i] = one_value.encode('latin-1')
Senthil Kumaran58d5dbf2010-10-03 18:22:42 +00001004 elif isinstance(one_value, int):
1005 values[i] = str(one_value).encode('ascii')
Benjamin Petersonf608c612008-11-16 18:33:53 +00001006 value = b'\r\n\t'.join(values)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001007 header = header + b': ' + value
1008 self._output(header)
Greg Stein5e0fa402000-06-26 08:28:01 +00001009
Benjamin Peterson1742e402008-11-30 22:15:29 +00001010 def endheaders(self, message_body=None):
1011 """Indicate that the last header line has been sent to the server.
Greg Stein5e0fa402000-06-26 08:28:01 +00001012
Senthil Kumaranad87fa62011-10-05 23:26:49 +08001013 This method sends the request to the server. The optional message_body
1014 argument can be used to pass a message body associated with the
1015 request. The message body will be sent in the same packet as the
1016 message headers if it is a string, otherwise it is sent as a separate
1017 packet.
Benjamin Peterson1742e402008-11-30 22:15:29 +00001018 """
Greg Steindd6eefb2000-07-18 09:09:48 +00001019 if self.__state == _CS_REQ_STARTED:
1020 self.__state = _CS_REQ_SENT
1021 else:
1022 raise CannotSendHeader()
Benjamin Peterson1742e402008-11-30 22:15:29 +00001023 self._send_output(message_body)
Greg Stein5e0fa402000-06-26 08:28:01 +00001024
Greg Steindd6eefb2000-07-18 09:09:48 +00001025 def request(self, method, url, body=None, headers={}):
1026 """Send a complete request to the server."""
Jeremy Hylton636950f2009-03-28 04:34:21 +00001027 self._send_request(method, url, body, headers)
Greg Stein5e0fa402000-06-26 08:28:01 +00001028
Benjamin Peterson1742e402008-11-30 22:15:29 +00001029 def _set_content_length(self, body):
1030 # Set the content-length based on the body.
1031 thelen = None
1032 try:
1033 thelen = str(len(body))
1034 except TypeError as te:
1035 # If this is a file-like object, try to
1036 # fstat its file descriptor
Benjamin Peterson1742e402008-11-30 22:15:29 +00001037 try:
1038 thelen = str(os.fstat(body.fileno()).st_size)
1039 except (AttributeError, OSError):
1040 # Don't send a length if this failed
1041 if self.debuglevel > 0: print("Cannot stat!!")
1042
1043 if thelen is not None:
1044 self.putheader('Content-Length', thelen)
1045
Greg Steindd6eefb2000-07-18 09:09:48 +00001046 def _send_request(self, method, url, body, headers):
Jeremy Hylton636950f2009-03-28 04:34:21 +00001047 # Honor explicitly requested Host: and Accept-Encoding: headers.
Jeremy Hylton2c178252004-08-07 16:28:14 +00001048 header_names = dict.fromkeys([k.lower() for k in headers])
1049 skips = {}
1050 if 'host' in header_names:
1051 skips['skip_host'] = 1
1052 if 'accept-encoding' in header_names:
1053 skips['skip_accept_encoding'] = 1
Greg Stein5e0fa402000-06-26 08:28:01 +00001054
Jeremy Hylton2c178252004-08-07 16:28:14 +00001055 self.putrequest(method, url, **skips)
1056
Senthil Kumaran5fa4a892012-05-19 16:58:09 +08001057 if body is not None and ('content-length' not in header_names):
Benjamin Peterson1742e402008-11-30 22:15:29 +00001058 self._set_content_length(body)
Guido van Rossumcc2b0162007-02-11 06:12:03 +00001059 for hdr, value in headers.items():
Greg Steindd6eefb2000-07-18 09:09:48 +00001060 self.putheader(hdr, value)
Jeremy Hyltonef9f48e2009-03-26 22:04:05 +00001061 if isinstance(body, str):
Jeremy Hylton236654b2009-03-27 20:24:34 +00001062 # RFC 2616 Section 3.7.1 says that text default has a
1063 # default charset of iso-8859-1.
1064 body = body.encode('iso-8859-1')
Jeremy Hyltonef9f48e2009-03-26 22:04:05 +00001065 self.endheaders(body)
Greg Stein5e0fa402000-06-26 08:28:01 +00001066
Greg Steindd6eefb2000-07-18 09:09:48 +00001067 def getresponse(self):
Jeremy Hylton6c5e28c2009-03-31 14:35:53 +00001068 """Get the response from the server.
1069
1070 If the HTTPConnection is in the correct state, returns an
1071 instance of HTTPResponse or of whatever object is returned by
1072 class the response_class variable.
1073
1074 If a request has not been sent or if a previous response has
1075 not be handled, ResponseNotReady is raised. If the HTTP
1076 response indicates that the connection should be closed, then
1077 it will be closed before the response is returned. When the
1078 connection is closed, the underlying socket is closed.
1079 """
Greg Stein5e0fa402000-06-26 08:28:01 +00001080
Greg Stein616a58d2003-06-24 06:35:19 +00001081 # if a prior response has been completed, then forget about it.
Greg Steindd6eefb2000-07-18 09:09:48 +00001082 if self.__response and self.__response.isclosed():
1083 self.__response = None
Greg Stein5e0fa402000-06-26 08:28:01 +00001084
Greg Steindd6eefb2000-07-18 09:09:48 +00001085 # if a prior response exists, then it must be completed (otherwise, we
1086 # cannot read this response's header to determine the connection-close
1087 # behavior)
1088 #
1089 # note: if a prior response existed, but was connection-close, then the
1090 # socket and response were made independent of this HTTPConnection
1091 # object since a new request requires that we open a whole new
1092 # connection
1093 #
1094 # this means the prior response had one of two states:
1095 # 1) will_close: this connection was reset and the prior socket and
1096 # response operate independently
1097 # 2) persistent: the response was retained and we await its
1098 # isclosed() status to become true.
1099 #
1100 if self.__state != _CS_REQ_SENT or self.__response:
Jeremy Hylton6c5e28c2009-03-31 14:35:53 +00001101 raise ResponseNotReady(self.__state)
Greg Stein5e0fa402000-06-26 08:28:01 +00001102
Jeremy Hylton30f86742000-09-18 22:50:38 +00001103 if self.debuglevel > 0:
Jeremy Hyltond46aa372002-07-06 18:48:07 +00001104 response = self.response_class(self.sock, self.debuglevel,
Jeremy Hyltonc1b2cb92003-05-05 16:13:58 +00001105 method=self._method)
Jeremy Hylton30f86742000-09-18 22:50:38 +00001106 else:
Antoine Pitrou988dbd72010-12-17 17:35:56 +00001107 response = self.response_class(self.sock, method=self._method)
Greg Stein5e0fa402000-06-26 08:28:01 +00001108
Serhiy Storchakab491e052014-12-01 13:07:45 +02001109 try:
1110 response.begin()
1111 assert response.will_close != _UNKNOWN
1112 self.__state = _CS_IDLE
Greg Stein5e0fa402000-06-26 08:28:01 +00001113
Serhiy Storchakab491e052014-12-01 13:07:45 +02001114 if response.will_close:
1115 # this effectively passes the connection to the response
1116 self.close()
1117 else:
1118 # remember this, so we can tell when it is complete
1119 self.__response = response
Greg Stein5e0fa402000-06-26 08:28:01 +00001120
Serhiy Storchakab491e052014-12-01 13:07:45 +02001121 return response
1122 except:
1123 response.close()
1124 raise
Greg Stein5e0fa402000-06-26 08:28:01 +00001125
Thomas Wouters47b49bf2007-08-30 22:15:33 +00001126try:
1127 import ssl
Brett Cannoncd171c82013-07-04 17:43:24 -04001128except ImportError:
Thomas Wouters47b49bf2007-08-30 22:15:33 +00001129 pass
1130else:
1131 class HTTPSConnection(HTTPConnection):
1132 "This class allows communication via SSL."
Jeremy Hylton29d27ac2002-07-09 21:22:36 +00001133
Thomas Wouters47b49bf2007-08-30 22:15:33 +00001134 default_port = HTTPS_PORT
Jeremy Hylton29d27ac2002-07-09 21:22:36 +00001135
Antoine Pitrou803e6d62010-10-13 10:36:15 +00001136 # XXX Should key_file and cert_file be deprecated in favour of context?
1137
Thomas Wouters47b49bf2007-08-30 22:15:33 +00001138 def __init__(self, host, port=None, key_file=None, cert_file=None,
Senthil Kumaran052ddb02013-03-18 14:11:41 -07001139 timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
1140 source_address=None, *, context=None,
1141 check_hostname=None):
1142 super(HTTPSConnection, self).__init__(host, port, timeout,
Gregory P. Smithb4066372010-01-03 03:28:29 +00001143 source_address)
Thomas Wouters47b49bf2007-08-30 22:15:33 +00001144 self.key_file = key_file
1145 self.cert_file = cert_file
Antoine Pitrou803e6d62010-10-13 10:36:15 +00001146 if context is None:
Benjamin Peterson4ffb0752014-11-03 14:29:33 -05001147 context = ssl._create_default_https_context()
Antoine Pitrou803e6d62010-10-13 10:36:15 +00001148 will_verify = context.verify_mode != ssl.CERT_NONE
1149 if check_hostname is None:
Benjamin Petersona090f012014-12-07 13:18:25 -05001150 check_hostname = context.check_hostname
1151 if check_hostname and not will_verify:
Antoine Pitrou803e6d62010-10-13 10:36:15 +00001152 raise ValueError("check_hostname needs a SSL context with "
1153 "either CERT_OPTIONAL or CERT_REQUIRED")
1154 if key_file or cert_file:
Antoine Pitrou80603992010-10-13 10:45:16 +00001155 context.load_cert_chain(cert_file, key_file)
Antoine Pitrou803e6d62010-10-13 10:36:15 +00001156 self._context = context
1157 self._check_hostname = check_hostname
Jeremy Hylton29d27ac2002-07-09 21:22:36 +00001158
Thomas Wouters47b49bf2007-08-30 22:15:33 +00001159 def connect(self):
1160 "Connect to a host on a given (SSL) port."
Jeremy Hylton29d27ac2002-07-09 21:22:36 +00001161
Senthil Kumaran9da047b2014-04-14 13:07:56 -04001162 super().connect()
Senthil Kumaran97f0c6b2009-07-25 04:24:38 +00001163
1164 if self._tunnel_host:
Senthil Kumaran9da047b2014-04-14 13:07:56 -04001165 server_hostname = self._tunnel_host
1166 else:
1167 server_hostname = self.host
Senthil Kumaran97f0c6b2009-07-25 04:24:38 +00001168
Senthil Kumaran9da047b2014-04-14 13:07:56 -04001169 self.sock = self._context.wrap_socket(self.sock,
Benjamin Peterson7243b572014-11-23 17:04:34 -06001170 server_hostname=server_hostname)
Christian Heimesf723c712013-12-05 07:51:17 +01001171 if not self._context.check_hostname and self._check_hostname:
1172 try:
Senthil Kumaran9da047b2014-04-14 13:07:56 -04001173 ssl.match_hostname(self.sock.getpeercert(), server_hostname)
Christian Heimesf723c712013-12-05 07:51:17 +01001174 except Exception:
1175 self.sock.shutdown(socket.SHUT_RDWR)
1176 self.sock.close()
1177 raise
Jeremy Hylton29d27ac2002-07-09 21:22:36 +00001178
Thomas Wouters47b49bf2007-08-30 22:15:33 +00001179 __all__.append("HTTPSConnection")
Greg Stein5e0fa402000-06-26 08:28:01 +00001180
Greg Stein5e0fa402000-06-26 08:28:01 +00001181class HTTPException(Exception):
Jeremy Hylton12f4f352002-07-06 18:55:01 +00001182 # Subclasses that define an __init__ must call Exception.__init__
1183 # or define self.args. Otherwise, str() will fail.
Greg Steindd6eefb2000-07-18 09:09:48 +00001184 pass
Greg Stein5e0fa402000-06-26 08:28:01 +00001185
1186class NotConnected(HTTPException):
Greg Steindd6eefb2000-07-18 09:09:48 +00001187 pass
Greg Stein5e0fa402000-06-26 08:28:01 +00001188
Skip Montanaro9d389972002-03-24 16:53:50 +00001189class InvalidURL(HTTPException):
1190 pass
1191
Greg Stein5e0fa402000-06-26 08:28:01 +00001192class UnknownProtocol(HTTPException):
Greg Steindd6eefb2000-07-18 09:09:48 +00001193 def __init__(self, version):
Jeremy Hylton12f4f352002-07-06 18:55:01 +00001194 self.args = version,
Greg Steindd6eefb2000-07-18 09:09:48 +00001195 self.version = version
Greg Stein5e0fa402000-06-26 08:28:01 +00001196
1197class UnknownTransferEncoding(HTTPException):
Greg Steindd6eefb2000-07-18 09:09:48 +00001198 pass
Greg Stein5e0fa402000-06-26 08:28:01 +00001199
Greg Stein5e0fa402000-06-26 08:28:01 +00001200class UnimplementedFileMode(HTTPException):
Greg Steindd6eefb2000-07-18 09:09:48 +00001201 pass
Greg Stein5e0fa402000-06-26 08:28:01 +00001202
1203class IncompleteRead(HTTPException):
Benjamin Peterson6accb982009-03-02 22:50:25 +00001204 def __init__(self, partial, expected=None):
Jeremy Hylton12f4f352002-07-06 18:55:01 +00001205 self.args = partial,
Greg Steindd6eefb2000-07-18 09:09:48 +00001206 self.partial = partial
Benjamin Peterson6accb982009-03-02 22:50:25 +00001207 self.expected = expected
1208 def __repr__(self):
1209 if self.expected is not None:
1210 e = ', %i more expected' % self.expected
1211 else:
1212 e = ''
Serhiy Storchaka465e60e2014-07-25 23:36:00 +03001213 return '%s(%i bytes read%s)' % (self.__class__.__name__,
1214 len(self.partial), e)
Benjamin Peterson6accb982009-03-02 22:50:25 +00001215 def __str__(self):
1216 return repr(self)
Greg Stein5e0fa402000-06-26 08:28:01 +00001217
1218class ImproperConnectionState(HTTPException):
Greg Steindd6eefb2000-07-18 09:09:48 +00001219 pass
Greg Stein5e0fa402000-06-26 08:28:01 +00001220
1221class CannotSendRequest(ImproperConnectionState):
Greg Steindd6eefb2000-07-18 09:09:48 +00001222 pass
Greg Stein5e0fa402000-06-26 08:28:01 +00001223
1224class CannotSendHeader(ImproperConnectionState):
Greg Steindd6eefb2000-07-18 09:09:48 +00001225 pass
Greg Stein5e0fa402000-06-26 08:28:01 +00001226
1227class ResponseNotReady(ImproperConnectionState):
Greg Steindd6eefb2000-07-18 09:09:48 +00001228 pass
Greg Stein5e0fa402000-06-26 08:28:01 +00001229
1230class BadStatusLine(HTTPException):
Greg Steindd6eefb2000-07-18 09:09:48 +00001231 def __init__(self, line):
Benjamin Peterson11dbfd42010-03-21 22:50:04 +00001232 if not line:
1233 line = repr(line)
Jeremy Hylton12f4f352002-07-06 18:55:01 +00001234 self.args = line,
Greg Steindd6eefb2000-07-18 09:09:48 +00001235 self.line = line
Greg Stein5e0fa402000-06-26 08:28:01 +00001236
Senthil Kumaran5466bf12010-12-18 16:55:23 +00001237class LineTooLong(HTTPException):
1238 def __init__(self, line_type):
1239 HTTPException.__init__(self, "got more than %d bytes when reading %s"
1240 % (_MAXLINE, line_type))
1241
Greg Stein5e0fa402000-06-26 08:28:01 +00001242# for backwards compatibility
1243error = HTTPException