| 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" |