12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- from __future__ import absolute_import
- from ..packages.six.moves import http_client as httplib
- from ..exceptions import HeaderParsingError
- def is_fp_closed(obj):
- """
- Checks whether a given file-like object is closed.
- :param obj:
- The file-like object to check.
- """
- try:
- # Check `isclosed()` first, in case Python3 doesn't set `closed`.
- # GH Issue #928
- return obj.isclosed()
- except AttributeError:
- pass
- try:
- # Check via the official file-like-object way.
- return obj.closed
- except AttributeError:
- pass
- try:
- # Check if the object is a container for another file-like object that
- # gets released on exhaustion (e.g. HTTPResponse).
- return obj.fp is None
- except AttributeError:
- pass
- raise ValueError("Unable to determine whether fp is closed.")
- def assert_header_parsing(headers):
- """
- Asserts whether all headers have been successfully parsed.
- Extracts encountered errors from the result of parsing headers.
- Only works on Python 3.
- :param headers: Headers to verify.
- :type headers: `httplib.HTTPMessage`.
- :raises urllib3.exceptions.HeaderParsingError:
- If parsing errors are found.
- """
- # This will fail silently if we pass in the wrong kind of parameter.
- # To make debugging easier add an explicit check.
- if not isinstance(headers, httplib.HTTPMessage):
- raise TypeError('expected httplib.Message, got {0}.'.format(
- type(headers)))
- defects = getattr(headers, 'defects', None)
- get_payload = getattr(headers, 'get_payload', None)
- unparsed_data = None
- if get_payload:
- # get_payload is actually email.message.Message.get_payload;
- # we're only interested in the result if it's not a multipart message
- if not headers.is_multipart():
- payload = get_payload()
- if isinstance(payload, (bytes, str)):
- unparsed_data = payload
- if defects or unparsed_data:
- raise HeaderParsingError(defects=defects, unparsed_data=unparsed_data)
- def is_response_to_head(response):
- """
- Checks whether the request of a response has been a HEAD-request.
- Handles the quirks of AppEngine.
- :param conn:
- :type conn: :class:`httplib.HTTPResponse`
- """
- # FIXME: Can we do this somehow without accessing private httplib _method?
- method = response._method
- if isinstance(method, int): # Platform-specific: Appengine
- return method == 3
- return method.upper() == 'HEAD'
|