blob: ec1dc8cd99f663b11f6c4e4fb23ecc01c823a380 [file] [log] [blame]
Éric Araujo06efea32012-02-26 01:33:22 +01001r"""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
Andrew M. Kuchlingca2e7902006-07-30 00:27:34 +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
Antoine Pitrou72481782009-09-29 17:48:18 +000069from array import array
Victor Stinner2c6aee92010-07-24 02:46:16 +000070import os
Jeremy Hylton6459c8d2001-10-11 17:47:22 +000071import socket
Brett Cannon1eaf0742008-09-02 01:25:16 +000072from sys import py3kwarning
Jeremy Hylton8acf1e02002-03-08 19:35:51 +000073from urlparse import urlsplit
Bill Janssenc4592642007-08-31 19:02:23 +000074import warnings
Brett Cannon1eaf0742008-09-02 01:25:16 +000075with warnings.catch_warnings():
76 if py3kwarning:
77 warnings.filterwarnings("ignore", ".*mimetools has been removed",
78 DeprecationWarning)
Brett Cannon0a4128e2008-08-16 21:56:03 +000079 import mimetools
Guido van Rossum23acc951994-02-21 16:36:04 +000080
Guido van Rossum09c8b6c1999-12-07 21:37:17 +000081try:
Greg Steindd6eefb2000-07-18 09:09:48 +000082 from cStringIO import StringIO
Greg Stein5e0fa402000-06-26 08:28:01 +000083except ImportError:
Greg Steindd6eefb2000-07-18 09:09:48 +000084 from StringIO import StringIO
Guido van Rossum09c8b6c1999-12-07 21:37:17 +000085
Thomas Woutersa6900e82007-08-30 21:54:39 +000086__all__ = ["HTTP", "HTTPResponse", "HTTPConnection",
Skip Montanaro951a8842001-06-01 16:25:38 +000087 "HTTPException", "NotConnected", "UnknownProtocol",
Jeremy Hylton7c75c992002-06-28 23:38:14 +000088 "UnknownTransferEncoding", "UnimplementedFileMode",
89 "IncompleteRead", "InvalidURL", "ImproperConnectionState",
90 "CannotSendRequest", "CannotSendHeader", "ResponseNotReady",
Georg Brandl6aab16e2006-02-17 19:17:25 +000091 "BadStatusLine", "error", "responses"]
Skip Montanaro2dd42762001-01-23 15:35:05 +000092
Guido van Rossum23acc951994-02-21 16:36:04 +000093HTTP_PORT = 80
Guido van Rossum09c8b6c1999-12-07 21:37:17 +000094HTTPS_PORT = 443
95
Greg Stein5e0fa402000-06-26 08:28:01 +000096_UNKNOWN = 'UNKNOWN'
97
98# connection states
99_CS_IDLE = 'Idle'
100_CS_REQ_STARTED = 'Request-started'
101_CS_REQ_SENT = 'Request-sent'
102
Martin v. Löwis39a31782004-09-18 09:03:49 +0000103# status codes
104# informational
105CONTINUE = 100
106SWITCHING_PROTOCOLS = 101
107PROCESSING = 102
108
109# successful
110OK = 200
111CREATED = 201
112ACCEPTED = 202
113NON_AUTHORITATIVE_INFORMATION = 203
114NO_CONTENT = 204
115RESET_CONTENT = 205
116PARTIAL_CONTENT = 206
117MULTI_STATUS = 207
118IM_USED = 226
119
120# redirection
121MULTIPLE_CHOICES = 300
122MOVED_PERMANENTLY = 301
123FOUND = 302
124SEE_OTHER = 303
125NOT_MODIFIED = 304
126USE_PROXY = 305
127TEMPORARY_REDIRECT = 307
128
129# client error
130BAD_REQUEST = 400
131UNAUTHORIZED = 401
132PAYMENT_REQUIRED = 402
133FORBIDDEN = 403
134NOT_FOUND = 404
135METHOD_NOT_ALLOWED = 405
136NOT_ACCEPTABLE = 406
137PROXY_AUTHENTICATION_REQUIRED = 407
138REQUEST_TIMEOUT = 408
139CONFLICT = 409
140GONE = 410
141LENGTH_REQUIRED = 411
142PRECONDITION_FAILED = 412
143REQUEST_ENTITY_TOO_LARGE = 413
144REQUEST_URI_TOO_LONG = 414
145UNSUPPORTED_MEDIA_TYPE = 415
146REQUESTED_RANGE_NOT_SATISFIABLE = 416
147EXPECTATION_FAILED = 417
148UNPROCESSABLE_ENTITY = 422
149LOCKED = 423
150FAILED_DEPENDENCY = 424
151UPGRADE_REQUIRED = 426
152
153# server error
154INTERNAL_SERVER_ERROR = 500
155NOT_IMPLEMENTED = 501
156BAD_GATEWAY = 502
157SERVICE_UNAVAILABLE = 503
158GATEWAY_TIMEOUT = 504
159HTTP_VERSION_NOT_SUPPORTED = 505
160INSUFFICIENT_STORAGE = 507
161NOT_EXTENDED = 510
162
Georg Brandl6aab16e2006-02-17 19:17:25 +0000163# Mapping status codes to official W3C names
164responses = {
165 100: 'Continue',
166 101: 'Switching Protocols',
167
168 200: 'OK',
169 201: 'Created',
170 202: 'Accepted',
171 203: 'Non-Authoritative Information',
172 204: 'No Content',
173 205: 'Reset Content',
174 206: 'Partial Content',
175
176 300: 'Multiple Choices',
177 301: 'Moved Permanently',
178 302: 'Found',
179 303: 'See Other',
180 304: 'Not Modified',
181 305: 'Use Proxy',
182 306: '(Unused)',
183 307: 'Temporary Redirect',
184
185 400: 'Bad Request',
186 401: 'Unauthorized',
187 402: 'Payment Required',
188 403: 'Forbidden',
189 404: 'Not Found',
190 405: 'Method Not Allowed',
191 406: 'Not Acceptable',
192 407: 'Proxy Authentication Required',
193 408: 'Request Timeout',
194 409: 'Conflict',
195 410: 'Gone',
196 411: 'Length Required',
197 412: 'Precondition Failed',
198 413: 'Request Entity Too Large',
199 414: 'Request-URI Too Long',
200 415: 'Unsupported Media Type',
201 416: 'Requested Range Not Satisfiable',
202 417: 'Expectation Failed',
203
204 500: 'Internal Server Error',
205 501: 'Not Implemented',
206 502: 'Bad Gateway',
207 503: 'Service Unavailable',
208 504: 'Gateway Timeout',
209 505: 'HTTP Version Not Supported',
210}
211
Georg Brandl80ba8e82005-09-29 20:16:07 +0000212# maximal amount of data to read at one time in _safe_read
213MAXAMOUNT = 1048576
214
Antoine Pitroud7b6ac62010-12-18 18:18:21 +0000215# maximal line length when calling readline().
216_MAXLINE = 65536
217
Berker Peksagb7414e02014-08-05 07:15:57 +0300218# maximum amount of headers accepted
219_MAXHEADERS = 100
220
221
Jeremy Hylton6d0a4c72002-07-07 16:51:37 +0000222class HTTPMessage(mimetools.Message):
223
224 def addheader(self, key, value):
225 """Add header for field key handling repeats."""
226 prev = self.dict.get(key)
227 if prev is None:
228 self.dict[key] = value
229 else:
230 combined = ", ".join((prev, value))
231 self.dict[key] = combined
232
233 def addcontinue(self, key, more):
234 """Add more field data from a continuation line."""
235 prev = self.dict[key]
236 self.dict[key] = prev + "\n " + more
237
238 def readheaders(self):
239 """Read header lines.
240
241 Read header lines up to the entirely blank line that terminates them.
242 The (normally blank) line that ends the headers is skipped, but not
243 included in the returned list. If a non-header line ends the headers,
244 (which is an error), an attempt is made to backspace over it; it is
245 never included in the returned list.
246
247 The variable self.status is set to the empty string if all went well,
248 otherwise it is an error message. The variable self.headers is a
249 completely uninterpreted list of lines contained in the header (so
250 printing them will reproduce the header exactly as it appears in the
251 file).
252
253 If multiple header fields with the same name occur, they are combined
254 according to the rules in RFC 2616 sec 4.2:
255
256 Appending each subsequent field-value to the first, each separated
257 by a comma. The order in which header fields with the same field-name
258 are received is significant to the interpretation of the combined
259 field value.
260 """
261 # XXX The implementation overrides the readheaders() method of
262 # rfc822.Message. The base class design isn't amenable to
263 # customized behavior here so the method here is a copy of the
264 # base class code with a few small changes.
265
266 self.dict = {}
267 self.unixfrom = ''
Raymond Hettingerb2e0b922003-02-26 22:45:18 +0000268 self.headers = hlist = []
Jeremy Hylton6d0a4c72002-07-07 16:51:37 +0000269 self.status = ''
270 headerseen = ""
271 firstline = 1
272 startofline = unread = tell = None
273 if hasattr(self.fp, 'unread'):
274 unread = self.fp.unread
275 elif self.seekable:
276 tell = self.fp.tell
Raymond Hettingerb2e0b922003-02-26 22:45:18 +0000277 while True:
Berker Peksagb7414e02014-08-05 07:15:57 +0300278 if len(hlist) > _MAXHEADERS:
279 raise HTTPException("got more than %d headers" % _MAXHEADERS)
Jeremy Hylton6d0a4c72002-07-07 16:51:37 +0000280 if tell:
281 try:
282 startofline = tell()
283 except IOError:
284 startofline = tell = None
285 self.seekable = 0
Antoine Pitroud7b6ac62010-12-18 18:18:21 +0000286 line = self.fp.readline(_MAXLINE + 1)
287 if len(line) > _MAXLINE:
288 raise LineTooLong("header line")
Jeremy Hylton6d0a4c72002-07-07 16:51:37 +0000289 if not line:
290 self.status = 'EOF in headers'
291 break
292 # Skip unix From name time lines
293 if firstline and line.startswith('From '):
294 self.unixfrom = self.unixfrom + line
295 continue
296 firstline = 0
297 if headerseen and line[0] in ' \t':
298 # XXX Not sure if continuation lines are handled properly
299 # for http and/or for repeating headers
300 # It's a continuation line.
Raymond Hettingerb2e0b922003-02-26 22:45:18 +0000301 hlist.append(line)
Jeremy Hylton6d0a4c72002-07-07 16:51:37 +0000302 self.addcontinue(headerseen, line.strip())
303 continue
304 elif self.iscomment(line):
305 # It's a comment. Ignore it.
306 continue
307 elif self.islast(line):
308 # Note! No pushback here! The delimiter line gets eaten.
309 break
310 headerseen = self.isheader(line)
311 if headerseen:
312 # It's a legal header line, save it.
Raymond Hettingerb2e0b922003-02-26 22:45:18 +0000313 hlist.append(line)
Jeremy Hylton6d0a4c72002-07-07 16:51:37 +0000314 self.addheader(headerseen, line[len(headerseen)+1:].strip())
315 continue
316 else:
317 # It's not a header line; throw it back and stop here.
318 if not self.dict:
319 self.status = 'No headers'
320 else:
321 self.status = 'Non-header line where header expected'
322 # Try to undo the read.
323 if unread:
324 unread(line)
325 elif tell:
326 self.fp.seek(startofline)
327 else:
328 self.status = self.status + '; bad seek'
329 break
Greg Stein5e0fa402000-06-26 08:28:01 +0000330
331class HTTPResponse:
Jeremy Hyltond46aa372002-07-06 18:48:07 +0000332
333 # strict: If true, raise BadStatusLine if the status line can't be
334 # parsed as a valid HTTP/1.0 or 1.1 status line. By default it is
Skip Montanaro186bec22002-07-25 16:10:38 +0000335 # false because it prevents clients from talking to HTTP/0.9
Jeremy Hyltond46aa372002-07-06 18:48:07 +0000336 # servers. Note that a response with a sufficiently corrupted
337 # status line will look like an HTTP/0.9 response.
338
339 # See RFC 2616 sec 19.6 and RFC 1945 sec 6 for details.
340
Kristján Valur Jónsson3c43fcb2009-01-11 16:23:37 +0000341 def __init__(self, sock, debuglevel=0, strict=0, method=None, buffering=False):
342 if buffering:
343 # The caller won't be using any sock.recv() calls, so buffering
Gregory P. Smith77db0162009-08-20 09:38:43 +0000344 # is fine and recommended for performance.
Kristján Valur Jónsson3c43fcb2009-01-11 16:23:37 +0000345 self.fp = sock.makefile('rb')
346 else:
347 # The buffer size is specified as zero, because the headers of
348 # the response are read with readline(). If the reads were
349 # buffered the readline() calls could consume some of the
350 # response, which make be read via a recv() on the underlying
351 # socket.
352 self.fp = sock.makefile('rb', 0)
Jeremy Hylton30f86742000-09-18 22:50:38 +0000353 self.debuglevel = debuglevel
Jeremy Hyltond46aa372002-07-06 18:48:07 +0000354 self.strict = strict
Jeremy Hyltonc1b2cb92003-05-05 16:13:58 +0000355 self._method = method
Greg Stein5e0fa402000-06-26 08:28:01 +0000356
Greg Steindd6eefb2000-07-18 09:09:48 +0000357 self.msg = None
Greg Stein5e0fa402000-06-26 08:28:01 +0000358
Greg Steindd6eefb2000-07-18 09:09:48 +0000359 # from the Status-Line of the response
Tim Peters07e99cb2001-01-14 23:47:14 +0000360 self.version = _UNKNOWN # HTTP-Version
361 self.status = _UNKNOWN # Status-Code
362 self.reason = _UNKNOWN # Reason-Phrase
Greg Stein5e0fa402000-06-26 08:28:01 +0000363
Tim Peters07e99cb2001-01-14 23:47:14 +0000364 self.chunked = _UNKNOWN # is "chunked" being used?
365 self.chunk_left = _UNKNOWN # bytes left to read in current chunk
366 self.length = _UNKNOWN # number of bytes left in response
367 self.will_close = _UNKNOWN # conn will close at end of response
Greg Stein5e0fa402000-06-26 08:28:01 +0000368
Jeremy Hyltonbe4fcf12002-06-28 22:38:01 +0000369 def _read_status(self):
Jeremy Hyltond46aa372002-07-06 18:48:07 +0000370 # Initialize with Simple-Response defaults
Christian Heimes671138f2012-09-25 13:29:30 +0200371 line = self.fp.readline(_MAXLINE + 1)
372 if len(line) > _MAXLINE:
373 raise LineTooLong("header line")
Jeremy Hylton30f86742000-09-18 22:50:38 +0000374 if self.debuglevel > 0:
375 print "reply:", repr(line)
Jeremy Hyltonb6769522003-06-29 17:55:05 +0000376 if not line:
377 # Presumably, the server closed the connection before
378 # sending a valid response.
379 raise BadStatusLine(line)
Greg Steindd6eefb2000-07-18 09:09:48 +0000380 try:
Guido van Rossum34735a62000-12-15 15:09:42 +0000381 [version, status, reason] = line.split(None, 2)
Greg Steindd6eefb2000-07-18 09:09:48 +0000382 except ValueError:
383 try:
Guido van Rossum34735a62000-12-15 15:09:42 +0000384 [version, status] = line.split(None, 1)
Greg Steindd6eefb2000-07-18 09:09:48 +0000385 reason = ""
386 except ValueError:
Jeremy Hyltond46aa372002-07-06 18:48:07 +0000387 # empty version will cause next test to fail and status
388 # will be treated as 0.9 response.
389 version = ""
390 if not version.startswith('HTTP/'):
391 if self.strict:
392 self.close()
393 raise BadStatusLine(line)
394 else:
395 # assume it's a Simple-Response from an 0.9 server
396 self.fp = LineAndFileWrapper(line, self.fp)
397 return "HTTP/0.9", 200, ""
Greg Stein5e0fa402000-06-26 08:28:01 +0000398
Jeremy Hylton23d40472001-04-13 14:57:08 +0000399 # The status code is a three-digit number
400 try:
Jeremy Hyltonbe4fcf12002-06-28 22:38:01 +0000401 status = int(status)
Jeremy Hylton23d40472001-04-13 14:57:08 +0000402 if status < 100 or status > 999:
403 raise BadStatusLine(line)
404 except ValueError:
405 raise BadStatusLine(line)
Jeremy Hyltonbe4fcf12002-06-28 22:38:01 +0000406 return version, status, reason
Greg Stein5e0fa402000-06-26 08:28:01 +0000407
Jeremy Hylton39c03802002-07-12 14:04:09 +0000408 def begin(self):
Jeremy Hyltonbe4fcf12002-06-28 22:38:01 +0000409 if self.msg is not None:
410 # we've already started reading the response
411 return
412
413 # read until we get a non-100 response
Raymond Hettingerb2e0b922003-02-26 22:45:18 +0000414 while True:
Jeremy Hyltonbe4fcf12002-06-28 22:38:01 +0000415 version, status, reason = self._read_status()
Martin v. Löwis39a31782004-09-18 09:03:49 +0000416 if status != CONTINUE:
Jeremy Hyltonbe4fcf12002-06-28 22:38:01 +0000417 break
418 # skip the header from the 100 response
Raymond Hettingerb2e0b922003-02-26 22:45:18 +0000419 while True:
Antoine Pitroud7b6ac62010-12-18 18:18:21 +0000420 skip = self.fp.readline(_MAXLINE + 1)
421 if len(skip) > _MAXLINE:
422 raise LineTooLong("header line")
423 skip = skip.strip()
Jeremy Hyltonbe4fcf12002-06-28 22:38:01 +0000424 if not skip:
425 break
426 if self.debuglevel > 0:
427 print "header:", skip
Tim Petersc411dba2002-07-16 21:35:23 +0000428
Jeremy Hyltonbe4fcf12002-06-28 22:38:01 +0000429 self.status = status
430 self.reason = reason.strip()
Greg Steindd6eefb2000-07-18 09:09:48 +0000431 if version == 'HTTP/1.0':
432 self.version = 10
Jeremy Hylton110941a2000-10-12 19:58:36 +0000433 elif version.startswith('HTTP/1.'):
Tim Peters07e99cb2001-01-14 23:47:14 +0000434 self.version = 11 # use HTTP/1.1 code for HTTP/1.x where x>=1
Jeremy Hylton110941a2000-10-12 19:58:36 +0000435 elif version == 'HTTP/0.9':
436 self.version = 9
Greg Steindd6eefb2000-07-18 09:09:48 +0000437 else:
438 raise UnknownProtocol(version)
Greg Stein5e0fa402000-06-26 08:28:01 +0000439
Jeremy Hylton110941a2000-10-12 19:58:36 +0000440 if self.version == 9:
Georg Brandl0aade9a2005-06-26 22:06:54 +0000441 self.length = None
Jeremy Hyltonbe4fcf12002-06-28 22:38:01 +0000442 self.chunked = 0
Jeremy Hyltond46aa372002-07-06 18:48:07 +0000443 self.will_close = 1
Jeremy Hylton6d0a4c72002-07-07 16:51:37 +0000444 self.msg = HTTPMessage(StringIO())
Jeremy Hylton110941a2000-10-12 19:58:36 +0000445 return
446
Jeremy Hylton6d0a4c72002-07-07 16:51:37 +0000447 self.msg = HTTPMessage(self.fp, 0)
Jeremy Hylton30f86742000-09-18 22:50:38 +0000448 if self.debuglevel > 0:
449 for hdr in self.msg.headers:
450 print "header:", hdr,
Greg Stein5e0fa402000-06-26 08:28:01 +0000451
Greg Steindd6eefb2000-07-18 09:09:48 +0000452 # don't let the msg keep an fp
453 self.msg.fp = None
Greg Stein5e0fa402000-06-26 08:28:01 +0000454
Greg Steindd6eefb2000-07-18 09:09:48 +0000455 # are we using the chunked-style of transfer encoding?
456 tr_enc = self.msg.getheader('transfer-encoding')
Jeremy Hyltond229b3a2002-09-03 19:24:24 +0000457 if tr_enc and tr_enc.lower() == "chunked":
Greg Steindd6eefb2000-07-18 09:09:48 +0000458 self.chunked = 1
459 self.chunk_left = None
460 else:
461 self.chunked = 0
Greg Stein5e0fa402000-06-26 08:28:01 +0000462
Greg Steindd6eefb2000-07-18 09:09:48 +0000463 # will the connection close at the end of the response?
Jeremy Hylton22b3a492002-11-13 17:27:43 +0000464 self.will_close = self._check_close()
Greg Stein5e0fa402000-06-26 08:28:01 +0000465
Greg Steindd6eefb2000-07-18 09:09:48 +0000466 # do we have a Content-Length?
467 # NOTE: RFC 2616, S4.4, #3 says we ignore this if tr_enc is "chunked"
468 length = self.msg.getheader('content-length')
469 if length and not self.chunked:
Jeremy Hylton30a81812000-09-14 20:34:27 +0000470 try:
471 self.length = int(length)
472 except ValueError:
473 self.length = None
Georg Brandl8c460d52008-02-24 00:14:24 +0000474 else:
475 if self.length < 0: # ignore nonsensical negative lengths
476 self.length = None
Greg Steindd6eefb2000-07-18 09:09:48 +0000477 else:
478 self.length = None
Greg Stein5e0fa402000-06-26 08:28:01 +0000479
Greg Steindd6eefb2000-07-18 09:09:48 +0000480 # does the body have a fixed length? (of zero)
Martin v. Löwis39a31782004-09-18 09:03:49 +0000481 if (status == NO_CONTENT or status == NOT_MODIFIED or
Jeremy Hyltonc1b2cb92003-05-05 16:13:58 +0000482 100 <= status < 200 or # 1xx codes
483 self._method == 'HEAD'):
Greg Steindd6eefb2000-07-18 09:09:48 +0000484 self.length = 0
Greg Stein5e0fa402000-06-26 08:28:01 +0000485
Greg Steindd6eefb2000-07-18 09:09:48 +0000486 # if the connection remains open, and we aren't using chunked, and
487 # a content-length was not provided, then assume that the connection
488 # WILL close.
489 if not self.will_close and \
490 not self.chunked and \
491 self.length is None:
492 self.will_close = 1
Greg Stein5e0fa402000-06-26 08:28:01 +0000493
Jeremy Hylton22b3a492002-11-13 17:27:43 +0000494 def _check_close(self):
Jeremy Hylton2c178252004-08-07 16:28:14 +0000495 conn = self.msg.getheader('connection')
Jeremy Hylton22b3a492002-11-13 17:27:43 +0000496 if self.version == 11:
497 # An HTTP/1.1 proxy is assumed to stay open unless
498 # explicitly closed.
499 conn = self.msg.getheader('connection')
Raymond Hettingerbac788a2004-05-04 09:21:43 +0000500 if conn and "close" in conn.lower():
Jeremy Hylton22b3a492002-11-13 17:27:43 +0000501 return True
502 return False
503
Jeremy Hylton2c178252004-08-07 16:28:14 +0000504 # Some HTTP/1.0 implementations have support for persistent
505 # connections, using rules different than HTTP/1.1.
Jeremy Hylton22b3a492002-11-13 17:27:43 +0000506
Georg Brandl26458c12007-12-08 10:56:39 +0000507 # For older HTTP, Keep-Alive indicates persistent connection.
Jeremy Hylton22b3a492002-11-13 17:27:43 +0000508 if self.msg.getheader('keep-alive'):
509 return False
Tim Peters77c06fb2002-11-24 02:35:35 +0000510
Jeremy Hylton2c178252004-08-07 16:28:14 +0000511 # At least Akamai returns a "Connection: Keep-Alive" header,
512 # which was supposed to be sent by the client.
513 if conn and "keep-alive" in conn.lower():
514 return False
515
Jeremy Hylton22b3a492002-11-13 17:27:43 +0000516 # Proxy-Connection is a netscape hack.
517 pconn = self.msg.getheader('proxy-connection')
Raymond Hettingerbac788a2004-05-04 09:21:43 +0000518 if pconn and "keep-alive" in pconn.lower():
Jeremy Hylton22b3a492002-11-13 17:27:43 +0000519 return False
520
521 # otherwise, assume it will close
522 return True
523
Greg Steindd6eefb2000-07-18 09:09:48 +0000524 def close(self):
525 if self.fp:
526 self.fp.close()
527 self.fp = None
Greg Stein5e0fa402000-06-26 08:28:01 +0000528
Greg Steindd6eefb2000-07-18 09:09:48 +0000529 def isclosed(self):
530 # NOTE: it is possible that we will not ever call self.close(). This
531 # case occurs when will_close is TRUE, length is None, and we
532 # read up to the last byte, but NOT past it.
533 #
534 # IMPLIES: if will_close is FALSE, then self.close() will ALWAYS be
535 # called, meaning self.isclosed() is meaningful.
536 return self.fp is None
537
Jeremy Hylton2c178252004-08-07 16:28:14 +0000538 # XXX It would be nice to have readline and __iter__ for this, too.
539
Greg Steindd6eefb2000-07-18 09:09:48 +0000540 def read(self, amt=None):
541 if self.fp is None:
542 return ''
543
Senthil Kumaraned9204342010-04-28 17:20:43 +0000544 if self._method == 'HEAD':
Senthil Kumarandfaced52010-06-04 16:32:14 +0000545 self.close()
Senthil Kumaraned9204342010-04-28 17:20:43 +0000546 return ''
547
Greg Steindd6eefb2000-07-18 09:09:48 +0000548 if self.chunked:
Jeremy Hyltond4c472c2002-09-03 20:49:06 +0000549 return self._read_chunked(amt)
Tim Peters230a60c2002-11-09 05:08:07 +0000550
Jeremy Hyltond4c472c2002-09-03 20:49:06 +0000551 if amt is None:
Greg Steindd6eefb2000-07-18 09:09:48 +0000552 # unbounded read
Jeremy Hyltondef9d2a2004-11-07 16:13:49 +0000553 if self.length is None:
Greg Steindd6eefb2000-07-18 09:09:48 +0000554 s = self.fp.read()
555 else:
Antoine Pitroud66c0ee2013-02-02 22:49:34 +0100556 try:
557 s = self._safe_read(self.length)
558 except IncompleteRead:
559 self.close()
560 raise
Jeremy Hyltondef9d2a2004-11-07 16:13:49 +0000561 self.length = 0
Tim Peters07e99cb2001-01-14 23:47:14 +0000562 self.close() # we read everything
Greg Steindd6eefb2000-07-18 09:09:48 +0000563 return s
564
565 if self.length is not None:
566 if amt > self.length:
567 # clip the read to the "end of response"
568 amt = self.length
Greg Steindd6eefb2000-07-18 09:09:48 +0000569
570 # we do not use _safe_read() here because this may be a .will_close
571 # connection, and the user is reading more bytes than will be provided
572 # (for example, reading in 1k chunks)
573 s = self.fp.read(amt)
Serhiy Storchakac97f5ed2013-12-17 21:49:48 +0200574 if not s and amt:
Antoine Pitroud66c0ee2013-02-02 22:49:34 +0100575 # Ideally, we would raise IncompleteRead if the content-length
576 # wasn't satisfied, but it might break compatibility.
577 self.close()
Jeremy Hyltondef9d2a2004-11-07 16:13:49 +0000578 if self.length is not None:
579 self.length -= len(s)
Facundo Batista70665902007-10-18 03:16:03 +0000580 if not self.length:
581 self.close()
Antoine Pitrou4113d2b2012-12-15 19:11:54 +0100582
Greg Steindd6eefb2000-07-18 09:09:48 +0000583 return s
584
Jeremy Hyltond4c472c2002-09-03 20:49:06 +0000585 def _read_chunked(self, amt):
586 assert self.chunked != _UNKNOWN
587 chunk_left = self.chunk_left
Chris Withers68c6e922009-09-04 16:12:32 +0000588 value = []
Raymond Hettingerb2e0b922003-02-26 22:45:18 +0000589 while True:
Jeremy Hyltond4c472c2002-09-03 20:49:06 +0000590 if chunk_left is None:
Antoine Pitroud7b6ac62010-12-18 18:18:21 +0000591 line = self.fp.readline(_MAXLINE + 1)
592 if len(line) > _MAXLINE:
593 raise LineTooLong("chunk size")
Jeremy Hyltond4c472c2002-09-03 20:49:06 +0000594 i = line.find(';')
595 if i >= 0:
596 line = line[:i] # strip chunk-extensions
Georg Brandl23635032008-02-24 00:03:22 +0000597 try:
598 chunk_left = int(line, 16)
599 except ValueError:
600 # close the connection as protocol synchronisation is
601 # probably lost
602 self.close()
Chris Withers68c6e922009-09-04 16:12:32 +0000603 raise IncompleteRead(''.join(value))
Jeremy Hyltond4c472c2002-09-03 20:49:06 +0000604 if chunk_left == 0:
605 break
606 if amt is None:
Chris Withers68c6e922009-09-04 16:12:32 +0000607 value.append(self._safe_read(chunk_left))
Jeremy Hyltond4c472c2002-09-03 20:49:06 +0000608 elif amt < chunk_left:
Chris Withers68c6e922009-09-04 16:12:32 +0000609 value.append(self._safe_read(amt))
Jeremy Hyltond4c472c2002-09-03 20:49:06 +0000610 self.chunk_left = chunk_left - amt
Chris Withers68c6e922009-09-04 16:12:32 +0000611 return ''.join(value)
Jeremy Hyltond4c472c2002-09-03 20:49:06 +0000612 elif amt == chunk_left:
Chris Withers68c6e922009-09-04 16:12:32 +0000613 value.append(self._safe_read(amt))
Jeremy Hyltond4c472c2002-09-03 20:49:06 +0000614 self._safe_read(2) # toss the CRLF at the end of the chunk
615 self.chunk_left = None
Chris Withers68c6e922009-09-04 16:12:32 +0000616 return ''.join(value)
Jeremy Hyltond4c472c2002-09-03 20:49:06 +0000617 else:
Chris Withers68c6e922009-09-04 16:12:32 +0000618 value.append(self._safe_read(chunk_left))
Jeremy Hyltond4c472c2002-09-03 20:49:06 +0000619 amt -= chunk_left
620
621 # we read the whole chunk, get another
622 self._safe_read(2) # toss the CRLF at the end of the chunk
623 chunk_left = None
624
625 # read and discard trailer up to the CRLF terminator
626 ### note: we shouldn't have any trailers!
Raymond Hettingerb2e0b922003-02-26 22:45:18 +0000627 while True:
Antoine Pitroud7b6ac62010-12-18 18:18:21 +0000628 line = self.fp.readline(_MAXLINE + 1)
629 if len(line) > _MAXLINE:
630 raise LineTooLong("trailer line")
Martin v. Löwisdad88dc2008-02-12 18:47:34 +0000631 if not line:
632 # a vanishingly small number of sites EOF without
633 # sending the trailer
634 break
Jeremy Hyltond4c472c2002-09-03 20:49:06 +0000635 if line == '\r\n':
636 break
637
638 # we read everything; close the "file"
Jeremy Hyltond4c472c2002-09-03 20:49:06 +0000639 self.close()
640
Chris Withers68c6e922009-09-04 16:12:32 +0000641 return ''.join(value)
Tim Peters230a60c2002-11-09 05:08:07 +0000642
Greg Steindd6eefb2000-07-18 09:09:48 +0000643 def _safe_read(self, amt):
644 """Read the number of bytes requested, compensating for partial reads.
645
646 Normally, we have a blocking socket, but a read() can be interrupted
647 by a signal (resulting in a partial read).
648
649 Note that we cannot distinguish between EOF and an interrupt when zero
650 bytes have been read. IncompleteRead() will be raised in this
651 situation.
652
653 This function should be used when <amt> bytes "should" be present for
654 reading. If the bytes are truly not available (due to EOF), then the
655 IncompleteRead exception can be used to detect the problem.
656 """
Gregory P. Smith8cabfa32009-08-15 22:39:03 +0000657 # NOTE(gps): As of svn r74426 socket._fileobject.read(x) will never
658 # return less than x bytes unless EOF is encountered. It now handles
659 # signal interruptions (socket.error EINTR) internally. This code
660 # never caught that exception anyways. It seems largely pointless.
661 # self.fp.read(amt) will work fine.
Georg Brandl80ba8e82005-09-29 20:16:07 +0000662 s = []
Greg Steindd6eefb2000-07-18 09:09:48 +0000663 while amt > 0:
Georg Brandl80ba8e82005-09-29 20:16:07 +0000664 chunk = self.fp.read(min(amt, MAXAMOUNT))
Greg Steindd6eefb2000-07-18 09:09:48 +0000665 if not chunk:
Benjamin Peterson7d49bba2009-03-02 22:41:42 +0000666 raise IncompleteRead(''.join(s), amt)
Georg Brandl80ba8e82005-09-29 20:16:07 +0000667 s.append(chunk)
Raymond Hettingerb2e0b922003-02-26 22:45:18 +0000668 amt -= len(chunk)
Georg Brandl80ba8e82005-09-29 20:16:07 +0000669 return ''.join(s)
Greg Steindd6eefb2000-07-18 09:09:48 +0000670
Senthil Kumarand389cb52010-09-21 01:38:15 +0000671 def fileno(self):
672 return self.fp.fileno()
673
Greg Steindd6eefb2000-07-18 09:09:48 +0000674 def getheader(self, name, default=None):
675 if self.msg is None:
676 raise ResponseNotReady()
677 return self.msg.getheader(name, default)
Greg Stein5e0fa402000-06-26 08:28:01 +0000678
Martin v. Löwisdeacce22004-08-18 12:46:26 +0000679 def getheaders(self):
680 """Return list of (header, value) tuples."""
681 if self.msg is None:
682 raise ResponseNotReady()
683 return self.msg.items()
684
Greg Stein5e0fa402000-06-26 08:28:01 +0000685
686class HTTPConnection:
687
Greg Steindd6eefb2000-07-18 09:09:48 +0000688 _http_vsn = 11
689 _http_vsn_str = 'HTTP/1.1'
Greg Stein5e0fa402000-06-26 08:28:01 +0000690
Greg Steindd6eefb2000-07-18 09:09:48 +0000691 response_class = HTTPResponse
692 default_port = HTTP_PORT
693 auto_open = 1
Jeremy Hylton30f86742000-09-18 22:50:38 +0000694 debuglevel = 0
Jeremy Hyltond46aa372002-07-06 18:48:07 +0000695 strict = 0
Greg Stein5e0fa402000-06-26 08:28:01 +0000696
Facundo Batista4f1b1ed2008-05-29 16:39:26 +0000697 def __init__(self, host, port=None, strict=None,
Gregory P. Smith9d325212010-01-03 02:06:07 +0000698 timeout=socket._GLOBAL_DEFAULT_TIMEOUT, source_address=None):
Facundo Batista07c78be2007-03-23 18:54:07 +0000699 self.timeout = timeout
Gregory P. Smith9d325212010-01-03 02:06:07 +0000700 self.source_address = source_address
Greg Steindd6eefb2000-07-18 09:09:48 +0000701 self.sock = None
Jeremy Hylton8531b1b2002-07-16 21:21:11 +0000702 self._buffer = []
Greg Steindd6eefb2000-07-18 09:09:48 +0000703 self.__response = None
704 self.__state = _CS_IDLE
Jeremy Hyltonc1b2cb92003-05-05 16:13:58 +0000705 self._method = None
Senthil Kumarane266f252009-05-24 09:14:50 +0000706 self._tunnel_host = None
707 self._tunnel_port = None
Senthil Kumaran7713acf2009-12-20 06:05:13 +0000708 self._tunnel_headers = {}
Jeremy Hyltond46aa372002-07-06 18:48:07 +0000709 if strict is not None:
710 self.strict = strict
Greg Stein5e0fa402000-06-26 08:28:01 +0000711
Senthil Kumaran36f28f72014-05-16 18:51:46 -0700712 (self.host, self.port) = self._get_hostport(host, port)
713
714 # This is stored as an instance variable to allow unittests
715 # to replace with a suitable mock
716 self._create_connection = socket.create_connection
717
Senthil Kumaran7713acf2009-12-20 06:05:13 +0000718 def set_tunnel(self, host, port=None, headers=None):
Senthil Kumaran36f28f72014-05-16 18:51:46 -0700719 """ Set up host and port for HTTP CONNECT tunnelling.
720
721 In a connection that uses HTTP Connect tunneling, the host passed to the
722 constructor is used as proxy server that relays all communication to the
723 endpoint passed to set_tunnel. This is done by sending a HTTP CONNECT
724 request to the proxy server when the connection is established.
725
726 This method must be called before the HTML connection has been
727 established.
Senthil Kumaran7713acf2009-12-20 06:05:13 +0000728
729 The headers argument should be a mapping of extra HTTP headers
730 to send with the CONNECT request.
731 """
Senthil Kumaran36f28f72014-05-16 18:51:46 -0700732 # Verify if this is required.
733 if self.sock:
734 raise RuntimeError("Can't setup tunnel for established connection.")
735
Senthil Kumarane266f252009-05-24 09:14:50 +0000736 self._tunnel_host = host
737 self._tunnel_port = port
Senthil Kumaran7713acf2009-12-20 06:05:13 +0000738 if headers:
739 self._tunnel_headers = headers
740 else:
741 self._tunnel_headers.clear()
Senthil Kumarane266f252009-05-24 09:14:50 +0000742
Senthil Kumaran36f28f72014-05-16 18:51:46 -0700743 def _get_hostport(self, host, port):
Greg Steindd6eefb2000-07-18 09:09:48 +0000744 if port is None:
Skip Montanaro10e6e0e2004-09-14 16:32:02 +0000745 i = host.rfind(':')
Skip Montanarocae14d22004-09-14 17:55:21 +0000746 j = host.rfind(']') # ipv6 addresses have [...]
747 if i > j:
Skip Montanaro9d389972002-03-24 16:53:50 +0000748 try:
749 port = int(host[i+1:])
750 except ValueError:
Łukasz Langa7a153902011-10-18 17:16:00 +0200751 if host[i+1:] == "": # http://foo.com:/ == http://foo.com/
752 port = self.default_port
753 else:
754 raise InvalidURL("nonnumeric port: '%s'" % host[i+1:])
Greg Steindd6eefb2000-07-18 09:09:48 +0000755 host = host[:i]
756 else:
757 port = self.default_port
Raymond Hettinger4d037912004-10-14 15:23:38 +0000758 if host and host[0] == '[' and host[-1] == ']':
Brett Cannon0a1af4a2004-09-15 23:26:23 +0000759 host = host[1:-1]
Senthil Kumaran36f28f72014-05-16 18:51:46 -0700760 return (host, port)
Greg Stein5e0fa402000-06-26 08:28:01 +0000761
Jeremy Hylton30f86742000-09-18 22:50:38 +0000762 def set_debuglevel(self, level):
763 self.debuglevel = level
764
Senthil Kumarane266f252009-05-24 09:14:50 +0000765 def _tunnel(self):
Senthil Kumaran36f28f72014-05-16 18:51:46 -0700766 (host, port) = self._get_hostport(self._tunnel_host, self._tunnel_port)
767 self.send("CONNECT %s:%d HTTP/1.0\r\n" % (host, port))
Senthil Kumaran7713acf2009-12-20 06:05:13 +0000768 for header, value in self._tunnel_headers.iteritems():
769 self.send("%s: %s\r\n" % (header, value))
770 self.send("\r\n")
Senthil Kumarane266f252009-05-24 09:14:50 +0000771 response = self.response_class(self.sock, strict = self.strict,
772 method = self._method)
773 (version, code, message) = response._read_status()
774
775 if code != 200:
776 self.close()
Antoine Pitrou92331d52009-10-14 19:04:48 +0000777 raise socket.error("Tunnel connection failed: %d %s" % (code,
778 message.strip()))
Senthil Kumarane266f252009-05-24 09:14:50 +0000779 while True:
Antoine Pitroud7b6ac62010-12-18 18:18:21 +0000780 line = response.fp.readline(_MAXLINE + 1)
781 if len(line) > _MAXLINE:
782 raise LineTooLong("header line")
Senthil Kumaran02671852012-04-23 23:46:46 +0800783 if not line:
784 # for sites which EOF without sending trailer
785 break
786 if line == '\r\n':
787 break
Senthil Kumarane266f252009-05-24 09:14:50 +0000788
789
Greg Steindd6eefb2000-07-18 09:09:48 +0000790 def connect(self):
791 """Connect to the host and port specified in __init__."""
Senthil Kumaran36f28f72014-05-16 18:51:46 -0700792 self.sock = self._create_connection((self.host,self.port),
793 self.timeout, self.source_address)
Greg Stein5e0fa402000-06-26 08:28:01 +0000794
Senthil Kumarane266f252009-05-24 09:14:50 +0000795 if self._tunnel_host:
796 self._tunnel()
797
Greg Steindd6eefb2000-07-18 09:09:48 +0000798 def close(self):
799 """Close the connection to the HTTP server."""
800 if self.sock:
Tim Peters07e99cb2001-01-14 23:47:14 +0000801 self.sock.close() # close it manually... there may be other refs
Greg Steindd6eefb2000-07-18 09:09:48 +0000802 self.sock = None
803 if self.__response:
804 self.__response.close()
805 self.__response = None
806 self.__state = _CS_IDLE
Greg Stein5e0fa402000-06-26 08:28:01 +0000807
Senthil Kumaran452b0ce2010-10-02 10:43:45 +0000808 def send(self, data):
809 """Send `data' to the server."""
Greg Steindd6eefb2000-07-18 09:09:48 +0000810 if self.sock is None:
811 if self.auto_open:
812 self.connect()
813 else:
814 raise NotConnected()
Greg Stein5e0fa402000-06-26 08:28:01 +0000815
Jeremy Hylton30f86742000-09-18 22:50:38 +0000816 if self.debuglevel > 0:
Senthil Kumaran452b0ce2010-10-02 10:43:45 +0000817 print "send:", repr(data)
Victor Stinner2c6aee92010-07-24 02:46:16 +0000818 blocksize = 8192
Senthil Kumaran452b0ce2010-10-02 10:43:45 +0000819 if hasattr(data,'read') and not isinstance(data, array):
Victor Stinner2c6aee92010-07-24 02:46:16 +0000820 if self.debuglevel > 0: print "sendIng a read()able"
Senthil Kumaran452b0ce2010-10-02 10:43:45 +0000821 datablock = data.read(blocksize)
822 while datablock:
823 self.sock.sendall(datablock)
824 datablock = data.read(blocksize)
Victor Stinner2c6aee92010-07-24 02:46:16 +0000825 else:
Senthil Kumaran452b0ce2010-10-02 10:43:45 +0000826 self.sock.sendall(data)
Greg Stein5e0fa402000-06-26 08:28:01 +0000827
Jeremy Hylton8531b1b2002-07-16 21:21:11 +0000828 def _output(self, s):
829 """Add a line of output to the current request buffer.
Tim Peters469cdad2002-08-08 20:19:19 +0000830
Jeremy Hyltone3252ec2002-07-16 21:41:43 +0000831 Assumes that the line does *not* end with \\r\\n.
Jeremy Hylton8531b1b2002-07-16 21:21:11 +0000832 """
833 self._buffer.append(s)
834
Jeremy Hylton0381f482008-11-29 01:09:35 +0000835 def _send_output(self, message_body=None):
Jeremy Hylton8531b1b2002-07-16 21:21:11 +0000836 """Send the currently buffered request and clear the buffer.
837
Jeremy Hyltone3252ec2002-07-16 21:41:43 +0000838 Appends an extra \\r\\n to the buffer.
Kristján Valur Jónsson7e876f52009-01-09 20:23:16 +0000839 A message_body may be specified, to be appended to the request.
Jeremy Hylton8531b1b2002-07-16 21:21:11 +0000840 """
841 self._buffer.extend(("", ""))
842 msg = "\r\n".join(self._buffer)
843 del self._buffer[:]
Jeremy Hylton0381f482008-11-29 01:09:35 +0000844 # If msg and message_body are sent in a single send() call,
845 # it will avoid performance problems caused by the interaction
Ezio Melotti24b07bc2011-03-15 18:55:01 +0200846 # between delayed ack and the Nagle algorithm.
Kristján Valur Jónsson7e876f52009-01-09 20:23:16 +0000847 if isinstance(message_body, str):
Jeremy Hylton0381f482008-11-29 01:09:35 +0000848 msg += message_body
Kristján Valur Jónsson7e876f52009-01-09 20:23:16 +0000849 message_body = None
Jeremy Hylton8531b1b2002-07-16 21:21:11 +0000850 self.send(msg)
Kristján Valur Jónsson7e876f52009-01-09 20:23:16 +0000851 if message_body is not None:
852 #message_body was not a string (i.e. it is a file) and
853 #we must run the risk of Nagle
854 self.send(message_body)
Jeremy Hylton8531b1b2002-07-16 21:21:11 +0000855
Martin v. Löwisaf7dc8d2003-11-19 19:51:55 +0000856 def putrequest(self, method, url, skip_host=0, skip_accept_encoding=0):
Greg Steindd6eefb2000-07-18 09:09:48 +0000857 """Send a request to the server.
Greg Stein5e0fa402000-06-26 08:28:01 +0000858
Greg Steindd6eefb2000-07-18 09:09:48 +0000859 `method' specifies an HTTP request method, e.g. 'GET'.
860 `url' specifies the object being requested, e.g. '/index.html'.
Martin v. Löwisaf7dc8d2003-11-19 19:51:55 +0000861 `skip_host' if True does not add automatically a 'Host:' header
862 `skip_accept_encoding' if True does not add automatically an
863 'Accept-Encoding:' header
Greg Steindd6eefb2000-07-18 09:09:48 +0000864 """
Greg Stein5e0fa402000-06-26 08:28:01 +0000865
Greg Stein616a58d2003-06-24 06:35:19 +0000866 # if a prior response has been completed, then forget about it.
Greg Steindd6eefb2000-07-18 09:09:48 +0000867 if self.__response and self.__response.isclosed():
868 self.__response = None
Greg Stein5e0fa402000-06-26 08:28:01 +0000869
Tim Peters58eb11c2004-01-18 20:29:55 +0000870
Greg Steindd6eefb2000-07-18 09:09:48 +0000871 # in certain cases, we cannot issue another request on this connection.
872 # this occurs when:
873 # 1) we are in the process of sending a request. (_CS_REQ_STARTED)
874 # 2) a response to a previous request has signalled that it is going
875 # to close the connection upon completion.
876 # 3) the headers for the previous response have not been read, thus
877 # we cannot determine whether point (2) is true. (_CS_REQ_SENT)
878 #
879 # if there is no prior response, then we can request at will.
880 #
881 # if point (2) is true, then we will have passed the socket to the
882 # response (effectively meaning, "there is no prior response"), and
883 # will open a new one when a new request is made.
884 #
885 # Note: if a prior response exists, then we *can* start a new request.
886 # We are not allowed to begin fetching the response to this new
887 # request, however, until that prior response is complete.
888 #
889 if self.__state == _CS_IDLE:
890 self.__state = _CS_REQ_STARTED
891 else:
892 raise CannotSendRequest()
Greg Stein5e0fa402000-06-26 08:28:01 +0000893
Jeremy Hyltonc1b2cb92003-05-05 16:13:58 +0000894 # Save the method we use, we need it later in the response phase
895 self._method = method
Greg Steindd6eefb2000-07-18 09:09:48 +0000896 if not url:
897 url = '/'
Senthil Kumaran452b0ce2010-10-02 10:43:45 +0000898 hdr = '%s %s %s' % (method, url, self._http_vsn_str)
Greg Stein5e0fa402000-06-26 08:28:01 +0000899
Senthil Kumaran452b0ce2010-10-02 10:43:45 +0000900 self._output(hdr)
Greg Stein5e0fa402000-06-26 08:28:01 +0000901
Greg Steindd6eefb2000-07-18 09:09:48 +0000902 if self._http_vsn == 11:
903 # Issue some standard headers for better HTTP/1.1 compliance
Greg Stein5e0fa402000-06-26 08:28:01 +0000904
Jeremy Hylton3921ff62002-03-09 06:07:23 +0000905 if not skip_host:
906 # this header is issued *only* for HTTP/1.1
907 # connections. more specifically, this means it is
908 # only issued when the client uses the new
909 # HTTPConnection() class. backwards-compat clients
910 # will be using HTTP/1.0 and those clients may be
911 # issuing this header themselves. we should NOT issue
912 # it twice; some web servers (such as Apache) barf
913 # when they see two Host: headers
Guido van Rossumf6922aa2001-01-14 21:03:01 +0000914
Jeremy Hylton3921ff62002-03-09 06:07:23 +0000915 # If we need a non-standard port,include it in the
916 # header. If the request is going through a proxy,
917 # but the host of the actual URL, not the host of the
918 # proxy.
Jeremy Hylton8acf1e02002-03-08 19:35:51 +0000919
Jeremy Hylton3921ff62002-03-09 06:07:23 +0000920 netloc = ''
921 if url.startswith('http'):
922 nil, netloc, nil, nil, nil = urlsplit(url)
923
924 if netloc:
Georg Brandla2ac2ef2006-05-03 18:03:22 +0000925 try:
926 netloc_enc = netloc.encode("ascii")
927 except UnicodeEncodeError:
928 netloc_enc = netloc.encode("idna")
929 self.putheader('Host', netloc_enc)
Jeremy Hylton3921ff62002-03-09 06:07:23 +0000930 else:
Senthil Kumaran36f28f72014-05-16 18:51:46 -0700931 if self._tunnel_host:
932 host = self._tunnel_host
933 port = self._tunnel_port
934 else:
935 host = self.host
936 port = self.port
937
Georg Brandla2ac2ef2006-05-03 18:03:22 +0000938 try:
Senthil Kumaran36f28f72014-05-16 18:51:46 -0700939 host_enc = host.encode("ascii")
Georg Brandla2ac2ef2006-05-03 18:03:22 +0000940 except UnicodeEncodeError:
Senthil Kumaran36f28f72014-05-16 18:51:46 -0700941 host_enc = host.encode("idna")
Senthil Kumaran501bfd82010-11-14 03:31:52 +0000942 # Wrap the IPv6 Host Header with [] (RFC 2732)
943 if host_enc.find(':') >= 0:
944 host_enc = "[" + host_enc + "]"
Senthil Kumaran36f28f72014-05-16 18:51:46 -0700945 if port == self.default_port:
Georg Brandla2ac2ef2006-05-03 18:03:22 +0000946 self.putheader('Host', host_enc)
947 else:
Senthil Kumaran36f28f72014-05-16 18:51:46 -0700948 self.putheader('Host', "%s:%s" % (host_enc, port))
Greg Stein5e0fa402000-06-26 08:28:01 +0000949
Greg Steindd6eefb2000-07-18 09:09:48 +0000950 # note: we are assuming that clients will not attempt to set these
951 # headers since *this* library must deal with the
952 # consequences. this also means that when the supporting
953 # libraries are updated to recognize other forms, then this
954 # code should be changed (removed or updated).
Greg Stein5e0fa402000-06-26 08:28:01 +0000955
Greg Steindd6eefb2000-07-18 09:09:48 +0000956 # we only want a Content-Encoding of "identity" since we don't
957 # support encodings such as x-gzip or x-deflate.
Martin v. Löwisaf7dc8d2003-11-19 19:51:55 +0000958 if not skip_accept_encoding:
959 self.putheader('Accept-Encoding', 'identity')
Greg Stein5e0fa402000-06-26 08:28:01 +0000960
Greg Steindd6eefb2000-07-18 09:09:48 +0000961 # we can accept "chunked" Transfer-Encodings, but no others
962 # NOTE: no TE header implies *only* "chunked"
963 #self.putheader('TE', 'chunked')
Greg Stein5e0fa402000-06-26 08:28:01 +0000964
Greg Steindd6eefb2000-07-18 09:09:48 +0000965 # if TE is supplied in the header, then it must appear in a
966 # Connection header.
967 #self.putheader('Connection', 'TE')
Greg Stein5e0fa402000-06-26 08:28:01 +0000968
Greg Steindd6eefb2000-07-18 09:09:48 +0000969 else:
970 # For HTTP/1.0, the server will assume "not chunked"
971 pass
Greg Stein5e0fa402000-06-26 08:28:01 +0000972
Brett Cannone3d0bf72008-11-15 22:40:44 +0000973 def putheader(self, header, *values):
Greg Steindd6eefb2000-07-18 09:09:48 +0000974 """Send a request header line to the server.
Greg Stein5e0fa402000-06-26 08:28:01 +0000975
Greg Steindd6eefb2000-07-18 09:09:48 +0000976 For example: h.putheader('Accept', 'text/html')
977 """
978 if self.__state != _CS_REQ_STARTED:
979 raise CannotSendHeader()
Greg Stein5e0fa402000-06-26 08:28:01 +0000980
Senthil Kumaranaa5f49e2010-10-03 18:26:07 +0000981 hdr = '%s: %s' % (header, '\r\n\t'.join([str(v) for v in values]))
Senthil Kumaran452b0ce2010-10-02 10:43:45 +0000982 self._output(hdr)
Greg Stein5e0fa402000-06-26 08:28:01 +0000983
Jeremy Hylton0381f482008-11-29 01:09:35 +0000984 def endheaders(self, message_body=None):
985 """Indicate that the last header line has been sent to the server.
Greg Stein5e0fa402000-06-26 08:28:01 +0000986
Jeremy Hylton0381f482008-11-29 01:09:35 +0000987 This method sends the request to the server. The optional
Senthil Kumaran41d663f2011-10-05 23:52:49 +0800988 message_body argument can be used to pass a message body
Jeremy Hylton0381f482008-11-29 01:09:35 +0000989 associated with the request. The message body will be sent in
Senthil Kumaran41d663f2011-10-05 23:52:49 +0800990 the same packet as the message headers if it is string, otherwise it is
991 sent as a separate packet.
Jeremy Hylton0381f482008-11-29 01:09:35 +0000992 """
Greg Steindd6eefb2000-07-18 09:09:48 +0000993 if self.__state == _CS_REQ_STARTED:
994 self.__state = _CS_REQ_SENT
995 else:
996 raise CannotSendHeader()
Jeremy Hylton0381f482008-11-29 01:09:35 +0000997 self._send_output(message_body)
Greg Stein5e0fa402000-06-26 08:28:01 +0000998
Greg Steindd6eefb2000-07-18 09:09:48 +0000999 def request(self, method, url, body=None, headers={}):
1000 """Send a complete request to the server."""
Victor Stinner2c6aee92010-07-24 02:46:16 +00001001 self._send_request(method, url, body, headers)
Greg Stein5e0fa402000-06-26 08:28:01 +00001002
Jeremy Hylton0381f482008-11-29 01:09:35 +00001003 def _set_content_length(self, body):
1004 # Set the content-length based on the body.
1005 thelen = None
1006 try:
1007 thelen = str(len(body))
1008 except TypeError, te:
1009 # If this is a file-like object, try to
1010 # fstat its file descriptor
Jeremy Hylton0381f482008-11-29 01:09:35 +00001011 try:
1012 thelen = str(os.fstat(body.fileno()).st_size)
1013 except (AttributeError, OSError):
1014 # Don't send a length if this failed
1015 if self.debuglevel > 0: print "Cannot stat!!"
1016
1017 if thelen is not None:
1018 self.putheader('Content-Length', thelen)
1019
Greg Steindd6eefb2000-07-18 09:09:48 +00001020 def _send_request(self, method, url, body, headers):
Victor Stinner2c6aee92010-07-24 02:46:16 +00001021 # Honor explicitly requested Host: and Accept-Encoding: headers.
Jeremy Hylton2c178252004-08-07 16:28:14 +00001022 header_names = dict.fromkeys([k.lower() for k in headers])
1023 skips = {}
1024 if 'host' in header_names:
1025 skips['skip_host'] = 1
1026 if 'accept-encoding' in header_names:
1027 skips['skip_accept_encoding'] = 1
Greg Stein5e0fa402000-06-26 08:28:01 +00001028
Jeremy Hylton2c178252004-08-07 16:28:14 +00001029 self.putrequest(method, url, **skips)
1030
Senthil Kumaran618802d2012-05-19 16:52:21 +08001031 if body is not None and 'content-length' not in header_names:
Jeremy Hylton0381f482008-11-29 01:09:35 +00001032 self._set_content_length(body)
Raymond Hettingerb2e0b922003-02-26 22:45:18 +00001033 for hdr, value in headers.iteritems():
Greg Steindd6eefb2000-07-18 09:09:48 +00001034 self.putheader(hdr, value)
Kristján Valur Jónsson7e876f52009-01-09 20:23:16 +00001035 self.endheaders(body)
Greg Stein5e0fa402000-06-26 08:28:01 +00001036
Kristján Valur Jónsson3c43fcb2009-01-11 16:23:37 +00001037 def getresponse(self, buffering=False):
Greg Steindd6eefb2000-07-18 09:09:48 +00001038 "Get the response from the server."
Greg Stein5e0fa402000-06-26 08:28:01 +00001039
Greg Stein616a58d2003-06-24 06:35:19 +00001040 # if a prior response has been completed, then forget about it.
Greg Steindd6eefb2000-07-18 09:09:48 +00001041 if self.__response and self.__response.isclosed():
1042 self.__response = None
Greg Stein5e0fa402000-06-26 08:28:01 +00001043
Greg Steindd6eefb2000-07-18 09:09:48 +00001044 #
1045 # if a prior response exists, then it must be completed (otherwise, we
1046 # cannot read this response's header to determine the connection-close
1047 # behavior)
1048 #
1049 # note: if a prior response existed, but was connection-close, then the
1050 # socket and response were made independent of this HTTPConnection
1051 # object since a new request requires that we open a whole new
1052 # connection
1053 #
1054 # this means the prior response had one of two states:
1055 # 1) will_close: this connection was reset and the prior socket and
1056 # response operate independently
1057 # 2) persistent: the response was retained and we await its
1058 # isclosed() status to become true.
1059 #
1060 if self.__state != _CS_REQ_SENT or self.__response:
1061 raise ResponseNotReady()
Greg Stein5e0fa402000-06-26 08:28:01 +00001062
Kristján Valur Jónsson3c43fcb2009-01-11 16:23:37 +00001063 args = (self.sock,)
1064 kwds = {"strict":self.strict, "method":self._method}
Jeremy Hylton30f86742000-09-18 22:50:38 +00001065 if self.debuglevel > 0:
Kristján Valur Jónsson3c43fcb2009-01-11 16:23:37 +00001066 args += (self.debuglevel,)
1067 if buffering:
1068 #only add this keyword if non-default, for compatibility with
1069 #other response_classes.
1070 kwds["buffering"] = True;
1071 response = self.response_class(*args, **kwds)
Greg Stein5e0fa402000-06-26 08:28:01 +00001072
Jeremy Hylton39c03802002-07-12 14:04:09 +00001073 response.begin()
Jeremy Hyltonbe4fcf12002-06-28 22:38:01 +00001074 assert response.will_close != _UNKNOWN
Greg Steindd6eefb2000-07-18 09:09:48 +00001075 self.__state = _CS_IDLE
Greg Stein5e0fa402000-06-26 08:28:01 +00001076
Greg Steindd6eefb2000-07-18 09:09:48 +00001077 if response.will_close:
Martin v. Löwis0af33882007-03-23 13:27:15 +00001078 # this effectively passes the connection to the response
1079 self.close()
Greg Steindd6eefb2000-07-18 09:09:48 +00001080 else:
1081 # remember this, so we can tell when it is complete
1082 self.__response = response
Greg Stein5e0fa402000-06-26 08:28:01 +00001083
Greg Steindd6eefb2000-07-18 09:09:48 +00001084 return response
Greg Stein5e0fa402000-06-26 08:28:01 +00001085
Greg Stein5e0fa402000-06-26 08:28:01 +00001086
Jeremy Hylton29b8d5a2000-08-01 17:33:32 +00001087class HTTP:
Greg Steindd6eefb2000-07-18 09:09:48 +00001088 "Compatibility class with httplib.py from 1.5."
Greg Stein5e0fa402000-06-26 08:28:01 +00001089
Greg Steindd6eefb2000-07-18 09:09:48 +00001090 _http_vsn = 10
1091 _http_vsn_str = 'HTTP/1.0'
Greg Stein5e0fa402000-06-26 08:28:01 +00001092
Greg Steindd6eefb2000-07-18 09:09:48 +00001093 debuglevel = 0
Greg Stein5e0fa402000-06-26 08:28:01 +00001094
Jeremy Hylton29b8d5a2000-08-01 17:33:32 +00001095 _connection_class = HTTPConnection
1096
Jeremy Hyltond46aa372002-07-06 18:48:07 +00001097 def __init__(self, host='', port=None, strict=None):
Greg Steindd6eefb2000-07-18 09:09:48 +00001098 "Provide a default host, since the superclass requires one."
Greg Stein5e0fa402000-06-26 08:28:01 +00001099
Greg Steindd6eefb2000-07-18 09:09:48 +00001100 # some joker passed 0 explicitly, meaning default port
1101 if port == 0:
1102 port = None
Greg Stein5e0fa402000-06-26 08:28:01 +00001103
Andrew Svetlov4bb142b2012-12-18 21:27:37 +02001104 # Note that we may pass an empty string as the host; this will raise
Greg Steindd6eefb2000-07-18 09:09:48 +00001105 # an error when we attempt to connect. Presumably, the client code
1106 # will call connect before then, with a proper host.
Jeremy Hyltond46aa372002-07-06 18:48:07 +00001107 self._setup(self._connection_class(host, port, strict))
Greg Stein5e0fa402000-06-26 08:28:01 +00001108
Greg Stein81937a42001-08-18 09:20:23 +00001109 def _setup(self, conn):
1110 self._conn = conn
1111
1112 # set up delegation to flesh out interface
1113 self.send = conn.send
1114 self.putrequest = conn.putrequest
Brett Cannone3d0bf72008-11-15 22:40:44 +00001115 self.putheader = conn.putheader
Greg Stein81937a42001-08-18 09:20:23 +00001116 self.endheaders = conn.endheaders
1117 self.set_debuglevel = conn.set_debuglevel
1118
1119 conn._http_vsn = self._http_vsn
1120 conn._http_vsn_str = self._http_vsn_str
Greg Stein5e0fa402000-06-26 08:28:01 +00001121
Greg Steindd6eefb2000-07-18 09:09:48 +00001122 self.file = None
Greg Stein5e0fa402000-06-26 08:28:01 +00001123
Greg Steindd6eefb2000-07-18 09:09:48 +00001124 def connect(self, host=None, port=None):
1125 "Accept arguments to set the host/port, since the superclass doesn't."
Greg Stein5e0fa402000-06-26 08:28:01 +00001126
Greg Steindd6eefb2000-07-18 09:09:48 +00001127 if host is not None:
Jeremy Hylton29b8d5a2000-08-01 17:33:32 +00001128 self._conn._set_hostport(host, port)
1129 self._conn.connect()
Greg Stein5e0fa402000-06-26 08:28:01 +00001130
Greg Steindd6eefb2000-07-18 09:09:48 +00001131 def getfile(self):
1132 "Provide a getfile, since the superclass' does not use this concept."
1133 return self.file
Greg Stein5e0fa402000-06-26 08:28:01 +00001134
Kristján Valur Jónsson3c43fcb2009-01-11 16:23:37 +00001135 def getreply(self, buffering=False):
Greg Steindd6eefb2000-07-18 09:09:48 +00001136 """Compat definition since superclass does not define it.
Greg Stein5e0fa402000-06-26 08:28:01 +00001137
Greg Steindd6eefb2000-07-18 09:09:48 +00001138 Returns a tuple consisting of:
1139 - server status code (e.g. '200' if all goes well)
1140 - server "reason" corresponding to status code
1141 - any RFC822 headers in the response from the server
1142 """
1143 try:
Kristján Valur Jónsson3c43fcb2009-01-11 16:23:37 +00001144 if not buffering:
1145 response = self._conn.getresponse()
1146 else:
1147 #only add this keyword if non-default for compatibility
1148 #with other connection classes
1149 response = self._conn.getresponse(buffering)
Greg Steindd6eefb2000-07-18 09:09:48 +00001150 except BadStatusLine, e:
1151 ### hmm. if getresponse() ever closes the socket on a bad request,
1152 ### then we are going to have problems with self.sock
Greg Stein5e0fa402000-06-26 08:28:01 +00001153
Greg Steindd6eefb2000-07-18 09:09:48 +00001154 ### should we keep this behavior? do people use it?
1155 # keep the socket open (as a file), and return it
Jeremy Hylton29b8d5a2000-08-01 17:33:32 +00001156 self.file = self._conn.sock.makefile('rb', 0)
Greg Stein5e0fa402000-06-26 08:28:01 +00001157
Greg Steindd6eefb2000-07-18 09:09:48 +00001158 # close our socket -- we want to restart after any protocol error
1159 self.close()
Greg Stein5e0fa402000-06-26 08:28:01 +00001160
Greg Steindd6eefb2000-07-18 09:09:48 +00001161 self.headers = None
1162 return -1, e.line, None
Greg Stein5e0fa402000-06-26 08:28:01 +00001163
Greg Steindd6eefb2000-07-18 09:09:48 +00001164 self.headers = response.msg
1165 self.file = response.fp
1166 return response.status, response.reason, response.msg
Greg Stein5e0fa402000-06-26 08:28:01 +00001167
Greg Steindd6eefb2000-07-18 09:09:48 +00001168 def close(self):
Jeremy Hylton29b8d5a2000-08-01 17:33:32 +00001169 self._conn.close()
Greg Stein5e0fa402000-06-26 08:28:01 +00001170
Greg Steindd6eefb2000-07-18 09:09:48 +00001171 # note that self.file == response.fp, which gets closed by the
1172 # superclass. just clear the object ref here.
1173 ### hmm. messy. if status==-1, then self.file is owned by us.
1174 ### well... we aren't explicitly closing, but losing this ref will
1175 ### do it
1176 self.file = None
Greg Stein5e0fa402000-06-26 08:28:01 +00001177
Bill Janssen426ea0a2007-08-29 22:35:05 +00001178try:
1179 import ssl
1180except ImportError:
1181 pass
1182else:
1183 class HTTPSConnection(HTTPConnection):
1184 "This class allows communication via SSL."
1185
1186 default_port = HTTPS_PORT
1187
1188 def __init__(self, host, port=None, key_file=None, cert_file=None,
Gregory P. Smith9d325212010-01-03 02:06:07 +00001189 strict=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
Benjamin Peterson227f6e02014-12-07 13:41:26 -05001190 source_address=None, context=None):
Gregory P. Smith9d325212010-01-03 02:06:07 +00001191 HTTPConnection.__init__(self, host, port, strict, timeout,
1192 source_address)
Bill Janssen426ea0a2007-08-29 22:35:05 +00001193 self.key_file = key_file
1194 self.cert_file = cert_file
Benjamin Petersonfcfb18e2014-11-23 11:42:45 -06001195 if context is None:
Benjamin Petersone3e7d402014-11-23 21:02:02 -06001196 context = ssl._create_default_https_context()
Benjamin Petersonfcfb18e2014-11-23 11:42:45 -06001197 if key_file or cert_file:
1198 context.load_cert_chain(cert_file, key_file)
1199 self._context = context
Bill Janssen426ea0a2007-08-29 22:35:05 +00001200
1201 def connect(self):
1202 "Connect to a host on a given (SSL) port."
1203
Benjamin Petersonfcfb18e2014-11-23 11:42:45 -06001204 HTTPConnection.connect(self)
1205
Senthil Kumarane266f252009-05-24 09:14:50 +00001206 if self._tunnel_host:
Benjamin Petersonfcfb18e2014-11-23 11:42:45 -06001207 server_hostname = self._tunnel_host
1208 else:
1209 server_hostname = self.host
Benjamin Petersonfcfb18e2014-11-23 11:42:45 -06001210
1211 self.sock = self._context.wrap_socket(self.sock,
Benjamin Peterson31aa69e2014-11-23 20:13:31 -06001212 server_hostname=server_hostname)
Bill Janssen426ea0a2007-08-29 22:35:05 +00001213
Thomas Woutersa6900e82007-08-30 21:54:39 +00001214 __all__.append("HTTPSConnection")
Bill Janssen426ea0a2007-08-29 22:35:05 +00001215
Jeremy Hylton29b8d5a2000-08-01 17:33:32 +00001216 class HTTPS(HTTP):
1217 """Compatibility with 1.5 httplib interface
1218
1219 Python 1.5.2 did not have an HTTPS class, but it defined an
1220 interface for sending http requests that is also useful for
Tim Peters5ceadc82001-01-13 19:16:21 +00001221 https.
Jeremy Hylton29b8d5a2000-08-01 17:33:32 +00001222 """
1223
Martin v. Löwisd7bf9742000-09-21 22:09:47 +00001224 _connection_class = HTTPSConnection
Tim Peters5ceadc82001-01-13 19:16:21 +00001225
Jeremy Hyltond46aa372002-07-06 18:48:07 +00001226 def __init__(self, host='', port=None, key_file=None, cert_file=None,
Benjamin Petersonb2064732014-11-23 20:55:24 -06001227 strict=None, context=None):
Greg Stein81937a42001-08-18 09:20:23 +00001228 # provide a default host, pass the X509 cert info
1229
1230 # urf. compensate for bad input.
1231 if port == 0:
1232 port = None
Jeremy Hyltond46aa372002-07-06 18:48:07 +00001233 self._setup(self._connection_class(host, port, key_file,
Benjamin Petersonb2064732014-11-23 20:55:24 -06001234 cert_file, strict,
1235 context=context))
Greg Stein81937a42001-08-18 09:20:23 +00001236
1237 # we never actually use these for anything, but we keep them
1238 # here for compatibility with post-1.5.2 CVS.
Jeremy Hyltond46aa372002-07-06 18:48:07 +00001239 self.key_file = key_file
1240 self.cert_file = cert_file
Greg Stein81937a42001-08-18 09:20:23 +00001241
Greg Stein5e0fa402000-06-26 08:28:01 +00001242
Bill Janssen426ea0a2007-08-29 22:35:05 +00001243 def FakeSocket (sock, sslobj):
Bill Janssenc4592642007-08-31 19:02:23 +00001244 warnings.warn("FakeSocket is deprecated, and won't be in 3.x. " +
Bill Janssen98d19da2007-09-10 21:51:02 +00001245 "Use the result of ssl.wrap_socket() directly instead.",
Bill Janssenc4592642007-08-31 19:02:23 +00001246 DeprecationWarning, stacklevel=2)
Bill Janssen426ea0a2007-08-29 22:35:05 +00001247 return sslobj
1248
1249
Greg Stein5e0fa402000-06-26 08:28:01 +00001250class HTTPException(Exception):
Jeremy Hylton12f4f352002-07-06 18:55:01 +00001251 # Subclasses that define an __init__ must call Exception.__init__
1252 # or define self.args. Otherwise, str() will fail.
Greg Steindd6eefb2000-07-18 09:09:48 +00001253 pass
Greg Stein5e0fa402000-06-26 08:28:01 +00001254
1255class NotConnected(HTTPException):
Greg Steindd6eefb2000-07-18 09:09:48 +00001256 pass
Greg Stein5e0fa402000-06-26 08:28:01 +00001257
Skip Montanaro9d389972002-03-24 16:53:50 +00001258class InvalidURL(HTTPException):
1259 pass
1260
Greg Stein5e0fa402000-06-26 08:28:01 +00001261class UnknownProtocol(HTTPException):
Greg Steindd6eefb2000-07-18 09:09:48 +00001262 def __init__(self, version):
Jeremy Hylton12f4f352002-07-06 18:55:01 +00001263 self.args = version,
Greg Steindd6eefb2000-07-18 09:09:48 +00001264 self.version = version
Greg Stein5e0fa402000-06-26 08:28:01 +00001265
1266class UnknownTransferEncoding(HTTPException):
Greg Steindd6eefb2000-07-18 09:09:48 +00001267 pass
Greg Stein5e0fa402000-06-26 08:28:01 +00001268
Greg Stein5e0fa402000-06-26 08:28:01 +00001269class UnimplementedFileMode(HTTPException):
Greg Steindd6eefb2000-07-18 09:09:48 +00001270 pass
Greg Stein5e0fa402000-06-26 08:28:01 +00001271
1272class IncompleteRead(HTTPException):
Benjamin Peterson7d49bba2009-03-02 22:41:42 +00001273 def __init__(self, partial, expected=None):
Jeremy Hylton12f4f352002-07-06 18:55:01 +00001274 self.args = partial,
Greg Steindd6eefb2000-07-18 09:09:48 +00001275 self.partial = partial
Benjamin Peterson7d49bba2009-03-02 22:41:42 +00001276 self.expected = expected
1277 def __repr__(self):
1278 if self.expected is not None:
1279 e = ', %i more expected' % self.expected
1280 else:
1281 e = ''
1282 return 'IncompleteRead(%i bytes read%s)' % (len(self.partial), e)
1283 def __str__(self):
1284 return repr(self)
Greg Stein5e0fa402000-06-26 08:28:01 +00001285
1286class ImproperConnectionState(HTTPException):
Greg Steindd6eefb2000-07-18 09:09:48 +00001287 pass
Greg Stein5e0fa402000-06-26 08:28:01 +00001288
1289class CannotSendRequest(ImproperConnectionState):
Greg Steindd6eefb2000-07-18 09:09:48 +00001290 pass
Greg Stein5e0fa402000-06-26 08:28:01 +00001291
1292class CannotSendHeader(ImproperConnectionState):
Greg Steindd6eefb2000-07-18 09:09:48 +00001293 pass
Greg Stein5e0fa402000-06-26 08:28:01 +00001294
1295class ResponseNotReady(ImproperConnectionState):
Greg Steindd6eefb2000-07-18 09:09:48 +00001296 pass
Greg Stein5e0fa402000-06-26 08:28:01 +00001297
1298class BadStatusLine(HTTPException):
Greg Steindd6eefb2000-07-18 09:09:48 +00001299 def __init__(self, line):
Dirkjan Ochtmanebc73dc2010-02-24 04:49:00 +00001300 if not line:
1301 line = repr(line)
Jeremy Hylton12f4f352002-07-06 18:55:01 +00001302 self.args = line,
Greg Steindd6eefb2000-07-18 09:09:48 +00001303 self.line = line
Greg Stein5e0fa402000-06-26 08:28:01 +00001304
Antoine Pitroud7b6ac62010-12-18 18:18:21 +00001305class LineTooLong(HTTPException):
1306 def __init__(self, line_type):
1307 HTTPException.__init__(self, "got more than %d bytes when reading %s"
1308 % (_MAXLINE, line_type))
1309
Greg Stein5e0fa402000-06-26 08:28:01 +00001310# for backwards compatibility
1311error = HTTPException
1312
Jeremy Hyltond46aa372002-07-06 18:48:07 +00001313class LineAndFileWrapper:
1314 """A limited file-like object for HTTP/0.9 responses."""
1315
1316 # The status-line parsing code calls readline(), which normally
1317 # get the HTTP status line. For a 0.9 response, however, this is
1318 # actually the first line of the body! Clients need to get a
1319 # readable file object that contains that line.
1320
1321 def __init__(self, line, file):
1322 self._line = line
1323 self._file = file
1324 self._line_consumed = 0
1325 self._line_offset = 0
1326 self._line_left = len(line)
1327
1328 def __getattr__(self, attr):
1329 return getattr(self._file, attr)
1330
1331 def _done(self):
1332 # called when the last byte is read from the line. After the
1333 # call, all read methods are delegated to the underlying file
Skip Montanaro74b9a7a2003-02-25 17:48:15 +00001334 # object.
Jeremy Hyltond46aa372002-07-06 18:48:07 +00001335 self._line_consumed = 1
1336 self.read = self._file.read
1337 self.readline = self._file.readline
1338 self.readlines = self._file.readlines
1339
1340 def read(self, amt=None):
Hye-Shik Chang39aef792004-06-05 13:30:56 +00001341 if self._line_consumed:
1342 return self._file.read(amt)
1343 assert self._line_left
Jeremy Hyltond46aa372002-07-06 18:48:07 +00001344 if amt is None or amt > self._line_left:
1345 s = self._line[self._line_offset:]
1346 self._done()
1347 if amt is None:
1348 return s + self._file.read()
1349 else:
Tim Petersc411dba2002-07-16 21:35:23 +00001350 return s + self._file.read(amt - len(s))
Jeremy Hyltond46aa372002-07-06 18:48:07 +00001351 else:
1352 assert amt <= self._line_left
1353 i = self._line_offset
1354 j = i + amt
1355 s = self._line[i:j]
1356 self._line_offset = j
1357 self._line_left -= amt
1358 if self._line_left == 0:
1359 self._done()
1360 return s
Tim Petersc411dba2002-07-16 21:35:23 +00001361
Jeremy Hyltond46aa372002-07-06 18:48:07 +00001362 def readline(self):
Hye-Shik Chang39aef792004-06-05 13:30:56 +00001363 if self._line_consumed:
1364 return self._file.readline()
1365 assert self._line_left
Jeremy Hyltond46aa372002-07-06 18:48:07 +00001366 s = self._line[self._line_offset:]
1367 self._done()
1368 return s
1369
1370 def readlines(self, size=None):
Hye-Shik Chang39aef792004-06-05 13:30:56 +00001371 if self._line_consumed:
1372 return self._file.readlines(size)
1373 assert self._line_left
Jeremy Hyltond46aa372002-07-06 18:48:07 +00001374 L = [self._line[self._line_offset:]]
1375 self._done()
1376 if size is None:
1377 return L + self._file.readlines()
1378 else:
1379 return L + self._file.readlines(size)