Tres Seaver
2015-06-09 ebf0daec6764681bff895792d0e6b1ca093b8109
Return concrete classes from 'pyramid.httpexceptions.exception_response'

The base classes are not appropriate for ``400`` and ``500`` status
codes.

See: #1832
3 files modified
31 ■■■■■ changed files
CHANGES.txt 4 ●●●● patch | view | raw | blame | history
pyramid/httpexceptions.py 14 ●●●●● patch | view | raw | blame | history
pyramid/tests/test_httpexceptions.py 13 ●●●● patch | view | raw | blame | history
CHANGES.txt
@@ -1,6 +1,10 @@
unreleased
==========
- Ensure that ``pyramid.httpexceptions.exception_response`` returns the
  appropriate "concreate" class for ``400`` and ``500`` status codes.
  See: https://github.com/Pylons/pyramid/issues/1832
- Further fix the JSONP renderer by prefixing the returned content with
  a comment. This should mitigate attacks from Flash (See CVE-2014-4671).
  See https://github.com/Pylons/pyramid/pull/1649
pyramid/httpexceptions.py
@@ -562,10 +562,6 @@
    a bug.  A server-side traceback is not warranted.  Unless specialized,
    this is a '400 Bad Request'
    """
    code = 400
    title = 'Bad Request'
    explanation = ('The server could not comply with the request since '
                   'it is either malformed or otherwise incorrect.')
class HTTPBadRequest(HTTPClientError):
    """
@@ -576,7 +572,10 @@
    code: 400, title: Bad Request
    """
    pass
    code = 400
    title = 'Bad Request'
    explanation = ('The server could not comply with the request since '
                   'it is either malformed or otherwise incorrect.')
class HTTPUnauthorized(HTTPClientError):
    """
@@ -988,14 +987,13 @@
    This is an error condition in which the server is presumed to be
    in-error.  Unless specialized, this is a '500 Internal Server Error'.
    """
class HTTPInternalServerError(HTTPServerError):
    code = 500
    title = 'Internal Server Error'
    explanation = (
      'The server has either erred or is incapable of performing '
      'the requested operation.')
class HTTPInternalServerError(HTTPServerError):
    pass
class HTTPNotImplemented(HTTPServerError):
    """
pyramid/tests/test_httpexceptions.py
@@ -10,13 +10,22 @@
        from pyramid.httpexceptions import exception_response
        return exception_response(*arg, **kw)
    def test_status_400(self):
        from pyramid.httpexceptions import HTTPBadRequest
        self.assertTrue(isinstance(self._callFUT(400), HTTPBadRequest))
    def test_status_404(self):
        from pyramid.httpexceptions import HTTPNotFound
        self.assertEqual(self._callFUT(404).__class__, HTTPNotFound)
        self.assertTrue(isinstance(self._callFUT(404), HTTPNotFound))
    def test_status_500(self):
        from pyramid.httpexceptions import HTTPInternalServerError
        self.assertTrue(isinstance(self._callFUT(500),
                        HTTPInternalServerError))
    def test_status_201(self):
        from pyramid.httpexceptions import HTTPCreated
        self.assertEqual(self._callFUT(201).__class__, HTTPCreated)
        self.assertTrue(isinstance(self._callFUT(201), HTTPCreated))
    def test_extra_kw(self):
        resp = self._callFUT(404,  headers=[('abc', 'def')])