1from __future__
import absolute_import
8from contextlib
import contextmanager
9from socket
import error
as SocketError
10from socket
import timeout
as SocketTimeout
15from ._collections
import HTTPHeaderDict
16from .connection
import BaseSSLError, HTTPException
17from .exceptions
import (
18 BodyNotHttplibCompatible,
29from .packages
import six
90 previous_state = self.
_state
97 data = self.
_obj.unused_data
104if brotli
is not None:
126 If one or more encodings have been applied to a representation, the
127 sender that applied the encodings MUST generate a Content-Encoding
128 header field that lists the content codings in the order in which
151 if brotli
is not None and mode ==
"br":
159 HTTP Response container.
161 Backwards-compatible with :class:`http.client.HTTPResponse` but the response ``body`` is
162 loaded and decoded on-demand when the ``data`` property is accessed. This
163 class is also compatible with the Python standard library's :mod:`io`
164 module, and can hence be treated as a readable object in the context of that
167 Extra parameters for behaviour not present in :class:`http.client.HTTPResponse`:
169 :param preload_content:
170 If True, the response's body will be preloaded during construction.
172 :param decode_content:
173 If True, will attempt to decode the body based on the
174 'content-encoding' header.
176 :param original_response:
177 When this HTTPResponse wrapper is generated from an :class:`http.client.HTTPResponse`
178 object, it's convenient to include the original for debug purposes. It's
182 The retries contains the last :class:`~urllib3.util.retry.Retry` that
183 was used during the request.
185 :param enforce_content_length:
186 Enforce content length checking. Body returned by server must match
187 value of Content-Length header, if present. Otherwise, raise error.
190 CONTENT_DECODERS = [
"gzip",
"deflate"]
191 if brotli
is not None:
192 CONTENT_DECODERS += [
"br"]
193 REDIRECT_STATUSES = [301, 302, 303, 307, 308]
203 preload_content=True,
205 original_response=None,
210 enforce_content_length=False,
249 tr_enc = self.
headers.get(
"transfer-encoding",
"").
lower()
252 if "chunked" in encodings:
259 if preload_content
and not self.
_body:
260 self.
_body = self.
read(decode_content=decode_content)
264 Should we redirect and where to?
266 :returns: Truthy redirect location string if we got a redirect status
267 code and valid location. ``None`` if redirect status and no
268 location. ``False`` if not a redirect status code.
271 return self.
headers.get(
"location")
284 Read and discard any remaining HTTP response data in the response connection.
286 Unread data in the HTTPResponse connection blocks the connection from being released back to the pool.
290 except (HTTPError, SocketError, BaseSSLError, HTTPException):
300 return self.
read(cache_content=
True)
303 def connection(self):
307 return is_fp_closed(self.
_fp)
311 Obtain the number of bytes pulled over the wire so far. May differ from
312 the amount of content returned by :meth:``urllib3.response.HTTPResponse.read``
313 if bytes are encoded on the wire (e.g, compressed).
319 Set initial length value for Response content if available.
321 length = self.
headers.get(
"content-length")
323 if length
is not None:
329 "Received response with both Content-Length and "
330 "Transfer-Encoding set. This is expressly forbidden "
331 "by RFC 7230 sec 3.3.2. Ignoring Content-Length and "
332 "attempting to process response as Transfer-Encoding: "
346 "Content-Length contained multiple "
347 "unmatching values (%s)" % length
364 if status
in (204, 304)
or 100 <= status < 200
or request_method ==
"HEAD":
371 Set-up the _decoder attribute if necessary.
375 content_encoding = self.
headers.get(
"content-encoding",
"").
lower()
379 elif "," in content_encoding:
389 if brotli
is not None:
392 def _decode(self, data, decode_content, flush_decoder):
394 Decode the data passed in and potentially flush the decoder.
396 if not decode_content:
401 data = self.
_decoder.decompress(data)
403 content_encoding = self.
headers.get(
"content-encoding",
"").
lower()
405 "Received response with content-encoding: %s, but "
406 "failed to decode it." % content_encoding,
416 Flushes the decoder. Should only be called if the decoder is actually
428 Catch low-level python exceptions, instead re-raising urllib3
429 variants, so that low-level exceptions are not leaked in the
432 On exit, release the connection back to the pool.
440 except SocketTimeout:
445 except BaseSSLError
as e:
447 if "read operation timed out" not in str(e):
453 except (HTTPException, SocketError)
as e:
483 Read a response with the thought that reading the number of bytes
484 larger than can fit in a 32-bit int at a time via SSL in some
485 known cases leads to an overflow error that has to be prevented
486 if `amt` or `self.length_remaining` indicate that a problem may
490 * 3.8 <= CPython < 3.9.7 because of a bug
491 https://github.com/urllib3/urllib3/issues/2513#issuecomment-1152559900.
492 * urllib3 injected with pyOpenSSL-backed SSL-support.
493 * CPython < 3.10 only when `amt` does not fit 32-bit int.
496 c_int_max = 2 ** 31 - 1
499 (amt
and amt > c_int_max)
512 max_chunk_amt = 2 ** 28
513 while amt
is None or amt != 0:
515 chunk_amt = min(amt, max_chunk_amt)
518 chunk_amt = max_chunk_amt
519 data = self.
_fp.
read(chunk_amt)
529 def read(self, amt=None, decode_content=None, cache_content=False):
531 Similar to :meth:`http.client.HTTPResponse.read`, but with two additional
532 parameters: ``decode_content`` and ``cache_content``.
535 How much of the content to read. If specified, caching is skipped
536 because it doesn't make sense to cache partial content as the full
539 :param decode_content:
540 If True, will attempt to decode the body based on the
541 'content-encoding' header.
543 :param cache_content:
544 If True, will save the returned data such that the same result is
545 returned despite of the state of the underlying file object. This
546 is useful if you want the ``.data`` property to continue working
547 after having ``.read()`` the file object. (Overridden if ``amt`` is
551 if decode_content
is None:
557 flush_decoder =
False
558 fp_closed =
getattr(self.
_fp,
"closed",
False)
561 data = self.
_fp_read(amt)
if not fp_closed
else b
""
565 cache_content =
False
567 amt != 0
and not data
594 data = self.
_decode(data, decode_content, flush_decoder)
601 def stream(self, amt=2 ** 16, decode_content=None):
603 A generator wrapper for the read() method. A call will block until
604 ``amt`` bytes have been read from the connection or until the
605 connection is closed.
608 How much of the content to read. The generator will return up to
609 much data per iteration, but may return less. This is particularly
610 likely when using compressed data. However, the empty string will
613 :param decode_content:
614 If True, will attempt to decode the body based on the
615 'content-encoding' header.
618 for line
in self.
read_chunked(amt, decode_content=decode_content):
621 while not is_fp_closed(self.
_fp):
622 data = self.
read(amt=amt, decode_content=decode_content)
630 Given an :class:`http.client.HTTPResponse` instance ``r``, return a
631 corresponding :class:`urllib3.response.HTTPResponse` object.
633 Remaining parameters are passed to the HTTPResponse constructor, along
634 with ``original_response=r``.
646 strict =
getattr(r,
"strict", 0)
662 "HTTPResponse.getheaders() is deprecated and will be removed "
663 "in urllib3 v2.1.0. Instead access HTTPResponse.headers directly.",
664 category=DeprecationWarning,
671 "HTTPResponse.getheader() is deprecated and will be removed "
672 "in urllib3 v2.1.0. Instead use HTTPResponse.headers.get(name, default).",
673 category=DeprecationWarning,
676 return self.
headers.get(name, default)
697 elif self.
_fp is None:
702 return self.
_fp.closed
708 raise IOError(
"HTTPResponse has no file to get a fileno from")
713 "The file-like object this HTTPResponse is wrapped "
714 "around has no file descriptor"
735 b[:
len(temp)] = temp
740 Checks if the underlying file-like object looks like a
741 :class:`http.client.HTTPResponse` object. We do this by testing for
742 the fp attribute. If it is present we assume it returns raw chunks as
743 processed by read_chunked().
762 returned_chunk =
None
765 returned_chunk = chunk
766 self.
_fp._safe_read(2)
769 value = self.
_fp._safe_read(amt)
771 returned_chunk = value
773 value = self.
_fp._safe_read(amt)
774 self.
_fp._safe_read(2)
776 returned_chunk = value
779 self.
_fp._safe_read(2)
781 return returned_chunk
785 Similar to :meth:`HTTPResponse.read`, but with an additional
786 parameter: ``decode_content``.
789 How much of the content to read. If specified, caching is skipped
790 because it doesn't make sense to cache partial content as the full
793 :param decode_content:
794 If True, will attempt to decode the body based on the
795 'content-encoding' header.
801 "Response is not chunked. "
802 "Header 'transfer-encoding: chunked' is missing."
806 "Body should be http.client.HTTPResponse like. "
807 "It should have have an fp attribute which returns raw chunks."
818 if self.
_fp.fp
is None:
827 chunk, decode_content=decode_content, flush_decoder=
False
855 Returns the URL that was the source of this response.
856 If the request that generated this response redirected, this method
857 will return the final redirect location.
860 return self.
retries.history[-1].redirect_location
866 for chunk
in self.
stream(decode_content=
True):
869 yield b
"".join(buffer) + chunk[0] + b
"\n"
870 for x
in chunk[1:-1]:
879 yield b
"".join(buffer)
read_chunked(self, amt=None, decode_content=None)
read(self, amt=None, decode_content=None, cache_content=False)
stream(self, amt=2 **16, decode_content=None)
_init_length(self, request_method)
__init__(self, body="", headers=None, status=0, version=0, reason=None, strict=0, preload_content=True, decode_content=True, original_response=None, pool=None, connection=None, msg=None, retries=None, enforce_content_length=False, request_method=None, request_url=None, auto_close=True)
tuple DECODER_ERROR_CLASSES
from_httplib(ResponseCls, r, **response_kw)
_update_chunk_length(self)
_decode(self, data, decode_content, flush_decoder)
getheader(self, name, default=None)
supports_chunked_reads(self)
get_redirect_location(self)