diff --git a/django/core/servers/basehttp.py b/django/core/servers/basehttp.py
index 19b287a..2c2bf71 100644
--- a/django/core/servers/basehttp.py
+++ b/django/core/servers/basehttp.py
@@ -151,7 +151,7 @@ class WSGIRequestHandler(simple_server.WSGIRequestHandler, object):
         env['PATH_INFO'] = unquote(path)
         env['QUERY_STRING'] = query
         env['REMOTE_ADDR'] = self.client_address[0]
-        env['CONTENT_TYPE'] = self.headers.get('content-type', 'text/plain')
+        env['CONTENT_TYPE'] = self.headers.get('content-type', '')
 
         length = self.headers.get('content-length')
         if length:
diff --git a/django/http/__init__.py b/django/http/__init__.py
index b385b45..95e5002 100644
--- a/django/http/__init__.py
+++ b/django/http/__init__.py
@@ -315,7 +315,7 @@ class HttpRequest(object):
         self._post_parse_error = True
 
     def _load_post_and_files(self):
-        # Populates self._post and self._files
+        """ Populates self._post and self._files if the content-type is a form type """
         if self.method != 'POST':
             self._post, self._files = QueryDict('', encoding=self._encoding), MultiValueDict()
             return
@@ -323,7 +323,7 @@ class HttpRequest(object):
             self._mark_post_parse_error()
             return
 
-        if self.META.get('CONTENT_TYPE', '').startswith('multipart'):
+        if self.META.get('CONTENT_TYPE', '').startswith('multipart/form-data'):
             if hasattr(self, '_body'):
                 # Use already read data
                 data = BytesIO(self._body)
@@ -341,8 +341,10 @@ class HttpRequest(object):
                 # empty POST
                 self._mark_post_parse_error()
                 raise
-        else:
+        elif self.META.get('CONTENT_TYPE', '').startswith('application/x-www-form-urlencoded'):
             self._post, self._files = QueryDict(self.body, encoding=self._encoding), MultiValueDict()
+        else:
+            self._post, self._files = QueryDict('', encoding=self._encoding), MultiValueDict()
 
     ## File-like and iterator interface.
     ##
diff --git a/docs/ref/request-response.txt b/docs/ref/request-response.txt
index 0a337eb..860bfe1 100644
--- a/docs/ref/request-response.txt
+++ b/docs/ref/request-response.txt
@@ -92,9 +92,16 @@ All attributes should be considered read-only, unless stated otherwise below.
 
 .. attribute:: HttpRequest.POST
 
-    A dictionary-like object containing all given HTTP POST parameters. See the
+    A dictionary-like object containing all given HTTP POST parameters,
+    providing that the request contains form data. See the
     :class:`QueryDict` documentation below.
 
+    .. versionchanged:: 1.5
+        Before Django 1.5, HttpRequest.POST did also contain non-form data. Now if
+        the ``Content-Type`` header is not ``multipart/form-data`` or
+        ``application/x-www-form-urlencoded``, you should access the posted data
+        through :attr:`HttpRequest.body` instead.
+
     It's possible that a request can come in via POST with an empty ``POST``
     dictionary -- if, say, a form is requested via the POST HTTP method but
     does not include form data. Therefore, you shouldn't use ``if request.POST``
diff --git a/docs/releases/1.5.txt b/docs/releases/1.5.txt
index d49bae8..b60761d 100644
--- a/docs/releases/1.5.txt
+++ b/docs/releases/1.5.txt
@@ -245,6 +245,22 @@ For consistency with the design of the other generic views,
 dictionary into the context, instead passing the variables from the URLconf
 directly into the context.
 
+Non-form data in HTTP requests
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+:attr:`request.POST <django.http.HttpRequest.POST>` will no longer include data
+posted via HTTP requests with non form-specific content-types in the header.
+In prior versions, data posted with content-types other than
+``multipart/form-data`` or ``application/x-www-form-urlencoded`` would still
+end up represented in the :attr:`request.POST <django.http.HttpRequest.POST>`
+attribute. Developers wishing to access the raw POST data for these cases,
+should use the :attr:`request.body <django.http.HttpRequest.body>` attribute
+instead.
+
+For requests without a ``Content-Type`` header, this conforms to the HTTP
+specification (:rfc:`2616`) which states that: *If the media type remains
+unknown, the recipient SHOULD treat it as type "application/octet-stream"*.
+
 OPTIONS, PUT and DELETE requests in the test client
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
diff --git a/tests/regressiontests/requests/tests.py b/tests/regressiontests/requests/tests.py
index d801613..378b4cf 100644
--- a/tests/regressiontests/requests/tests.py
+++ b/tests/regressiontests/requests/tests.py
@@ -330,6 +330,7 @@ class RequestsTests(unittest.TestCase):
     def test_stream(self):
         payload = b'name=value'
         request = WSGIRequest({'REQUEST_METHOD': 'POST',
+                               'CONTENT_TYPE': 'application/x-www-form-urlencoded',
                                'CONTENT_LENGTH': len(payload),
                                'wsgi.input': BytesIO(payload)})
         self.assertEqual(request.read(), b'name=value')
@@ -341,6 +342,7 @@ class RequestsTests(unittest.TestCase):
         """
         payload = b'name=value'
         request = WSGIRequest({'REQUEST_METHOD': 'POST',
+                               'CONTENT_TYPE': 'application/x-www-form-urlencoded',
                                'CONTENT_LENGTH': len(payload),
                                'wsgi.input': BytesIO(payload)})
         self.assertEqual(request.POST, {'name': ['value']})
@@ -354,6 +356,7 @@ class RequestsTests(unittest.TestCase):
         """
         payload = b'name=value'
         request = WSGIRequest({'REQUEST_METHOD': 'POST',
+                               'CONTENT_TYPE': 'application/x-www-form-urlencoded',
                                'CONTENT_LENGTH': len(payload),
                                'wsgi.input': BytesIO(payload)})
         self.assertEqual(request.read(2), b'na')
@@ -402,9 +405,28 @@ class RequestsTests(unittest.TestCase):
                                'wsgi.input': BytesIO(payload)})
         self.assertEqual(request.POST, {})
 
+    def test_POST_binary_only(self):
+        payload = b'\r\n\x01\x00\x00\x00ab\x00\x00\xcd\xcc,@'
+        environ = {'REQUEST_METHOD': 'POST',
+                   'CONTENT_TYPE': 'application/octet-stream',
+                   'CONTENT_LENGTH': len(payload),
+                   'wsgi.input': BytesIO(payload)}
+        request = WSGIRequest(environ)
+        self.assertEqual(request.POST, {})
+        self.assertEqual(request.FILES, {})
+        self.assertEqual(request.body, payload)
+
+        # Same test without specifying content-type
+        environ.update({'CONTENT_TYPE': '', 'wsgi.input': BytesIO(payload)})
+        request = WSGIRequest(environ)
+        self.assertEqual(request.POST, {})
+        self.assertEqual(request.FILES, {})
+        self.assertEqual(request.body, payload)
+
     def test_read_by_lines(self):
         payload = b'name=value'
         request = WSGIRequest({'REQUEST_METHOD': 'POST',
+                               'CONTENT_TYPE': 'application/x-www-form-urlencoded',
                                'CONTENT_LENGTH': len(payload),
                                'wsgi.input': BytesIO(payload)})
         self.assertEqual(list(request), [b'name=value'])
@@ -415,6 +437,7 @@ class RequestsTests(unittest.TestCase):
         """
         payload = b'name=value'
         request = WSGIRequest({'REQUEST_METHOD': 'POST',
+                               'CONTENT_TYPE': 'application/x-www-form-urlencoded',
                                'CONTENT_LENGTH': len(payload),
                                'wsgi.input': BytesIO(payload)})
         raw_data = request.body
@@ -427,6 +450,7 @@ class RequestsTests(unittest.TestCase):
         """
         payload = b'name=value'
         request = WSGIRequest({'REQUEST_METHOD': 'POST',
+                               'CONTENT_TYPE': 'application/x-www-form-urlencoded',
                                'CONTENT_LENGTH': len(payload),
                                'wsgi.input': BytesIO(payload)})
         raw_data = request.body
@@ -479,6 +503,7 @@ class RequestsTests(unittest.TestCase):
 
         payload = b'name=value'
         request = WSGIRequest({'REQUEST_METHOD': 'POST',
+                               'CONTENT_TYPE': 'application/x-www-form-urlencoded',
                                'CONTENT_LENGTH': len(payload),
                                'wsgi.input': ExplodingBytesIO(payload)})
 
