1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

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"