Wrap IncompleteRead in ChunkedEncodingError.
authorCory Benfield <lukasaoz@gmail.com>
Sun, 28 Jul 2013 06:42:17 +0000 (07:42 +0100)
committerCory Benfield <lukasaoz@gmail.com>
Sun, 28 Jul 2013 06:42:17 +0000 (07:42 +0100)
requests/compat.py
requests/exceptions.py
requests/models.py

index e5f6e1d..0d61a57 100644 (file)
@@ -90,6 +90,7 @@ if is_py2:
     from Cookie import Morsel
     from StringIO import StringIO
     from .packages.urllib3.packages.ordered_dict import OrderedDict
+    from httplib import IncompleteRead
 
     builtin_str = str
     bytes = str
@@ -105,6 +106,7 @@ elif is_py3:
     from http.cookies import Morsel
     from io import StringIO
     from collections import OrderedDict
+    from http.client import IncompleteRead
 
     builtin_str = str
     str = str
index c0588f6..63f2c9c 100644 (file)
@@ -53,3 +53,7 @@ class InvalidSchema(RequestException, ValueError):
 
 class InvalidURL(RequestException, ValueError):
     """ The URL provided was somehow invalid. """
+
+
+class ChunkedEncodingError(RequestException):
+    """The server declared chunked encoding but sent an invalid chunk."""
index 2439153..ab3af67 100644 (file)
@@ -19,14 +19,16 @@ from .auth import HTTPBasicAuth
 from .cookies import cookiejar_from_dict, get_cookie_header
 from .packages.urllib3.filepost import encode_multipart_formdata
 from .packages.urllib3.util import parse_url
-from .exceptions import HTTPError, RequestException, MissingSchema, InvalidURL
+from .exceptions import (
+    HTTPError, RequestException, MissingSchema, InvalidURL,
+    ChunkedEncodingError)
 from .utils import (
     guess_filename, get_auth_from_url, requote_uri,
     stream_decode_response_unicode, to_key_val_list, parse_header_links,
     iter_slices, guess_json_utf, super_len)
 from .compat import (
     cookielib, urlunparse, urlsplit, urlencode, str, bytes, StringIO,
-    is_py2, chardet, json, builtin_str, basestring)
+    is_py2, chardet, json, builtin_str, basestring, IncompleteRead)
 
 CONTENT_CHUNK_SIZE = 10 * 1024
 ITER_CHUNK_SIZE = 512
@@ -547,8 +549,12 @@ class Response(object):
         def generate():
             try:
                 # Special case for urllib3.
-                for chunk in self.raw.stream(chunk_size, decode_content=True):
-                    yield chunk
+                try:
+                    for chunk in self.raw.stream(chunk_size,
+                                                 decode_content=True):
+                        yield chunk
+                except IncompleteRead as e:
+                    raise ChunkedEncodingError(e)
             except AttributeError:
                 # Standard file-like object.
                 while 1: