Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Fixed #17277 - Wrap IOErrors raised due to client disconnect in a spe…

…cific IOError subclass so they can be distinguished from more serious errors. Thanks David Lowe.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@17493 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information...
commit 0ce6636102d9e1c8c158c0e3eadb5a5db6b06a71 1 parent 8be356e
Carl Meyer carljm authored
Showing with 28 additions and 2 deletions.
  1. +7 −1 django/http/__init__.py
  2. +21 −1 tests/regressiontests/requests/tests.py
8 django/http/__init__.py
View
@@ -3,6 +3,7 @@
import datetime
import os
import re
+import sys
import time
import warnings
@@ -177,6 +178,8 @@ def build_request_repr(request, path_override=None, GET_override=None,
unicode(cookies),
unicode(meta)))
+class UnreadablePostError(IOError):
+ pass
class HttpRequest(object):
"""A basic HTTP request."""
@@ -321,7 +324,10 @@ def body(self):
if not hasattr(self, '_body'):
if self._read_started:
raise Exception("You cannot access body after reading from request's data stream")
- self._body = self.read()
+ try:
+ self._body = self.read()
+ except IOError, e:
+ raise UnreadablePostError, e, sys.exc_traceback
self._stream = StringIO(self._body)
return self._body
22 tests/regressiontests/requests/tests.py
View
@@ -1,3 +1,5 @@
+from __future__ import with_statement
+
import time
import warnings
from datetime import datetime, timedelta
@@ -6,7 +8,7 @@
from django.conf import settings
from django.core.handlers.modpython import ModPythonRequest
from django.core.handlers.wsgi import WSGIRequest, LimitedStream
-from django.http import HttpRequest, HttpResponse, parse_cookie, build_request_repr
+from django.http import HttpRequest, HttpResponse, parse_cookie, build_request_repr, UnreadablePostError
from django.test.utils import get_warnings_state, restore_warnings_state
from django.utils import unittest
from django.utils.http import cookie_date
@@ -430,3 +432,21 @@ def test_raw_post_data_returns_body(self):
self.assertEqual(request.body, request.raw_post_data)
finally:
restore_warnings_state(warnings_state)
+
+
+ def test_POST_connection_error(self):
+ """
+ If wsgi.input.read() raises an exception while trying to read() the
+ POST, the exception should be identifiable (not a generic IOError).
+ """
+ class ExplodingStringIO(StringIO):
+ def read(self, len=0):
+ raise IOError("kaboom!")
+
+ payload = 'name=value'
+ request = WSGIRequest({'REQUEST_METHOD': 'POST',
+ 'CONTENT_LENGTH': len(payload),
+ 'wsgi.input': ExplodingStringIO(payload)})
+
+ with self.assertRaises(UnreadablePostError):
+ request.raw_post_data
Please sign in to comment.
Something went wrong with that request. Please try again.