from webob.request import Request
from webob.dec import wsgify
from webob import exc as webob_exc
from nose.tools import eq_, ok_, assert_equal, assert_raises
@wsgify
def method_not_allowed_app(req):
if req.method != 'GET':
raise webob_exc.HTTPMethodNotAllowed()
return 'hello!'
def test_noescape_null():
assert_equal(webob_exc.no_escape(None), '')
def test_noescape_not_basestring():
assert_equal(webob_exc.no_escape(42), '42')
def test_noescape_unicode():
class DummyUnicodeObject(object):
def __unicode__(self):
return '42'
duo = DummyUnicodeObject()
assert_equal(webob_exc.no_escape(duo), '42')
def test_strip_tags_empty():
assert_equal(webob_exc.strip_tags(''), '')
def test_strip_tags_newline_to_space():
assert_equal(webob_exc.strip_tags('a\nb'), 'a b')
def test_strip_tags_zaps_carriage_return():
assert_equal(webob_exc.strip_tags('a\rb'), 'ab')
def test_strip_tags_br_to_newline():
assert_equal(webob_exc.strip_tags('a
b'), 'a\nb')
def test_strip_tags_zaps_comments():
assert_equal(webob_exc.strip_tags('a'), 'ab')
def test_strip_tags_zaps_tags():
assert_equal(webob_exc.strip_tags('foobaz'), 'foobaz')
def test_HTTPException():
import warnings
_called = []
_result = object()
def _response(environ, start_response):
_called.append((environ, start_response))
return _result
environ = {}
start_response = object()
exc = webob_exc.HTTPException('testing', _response)
ok_(exc.wsgi_response is _response)
result = exc(environ, start_response)
ok_(result is result)
assert_equal(_called, [(environ, start_response)])
def test_exception_with_unicode_data():
req = Request.blank('/', method='POST')
res = req.get_response(method_not_allowed_app)
assert res.status_code == 405
def test_WSGIHTTPException_headers():
exc = webob_exc.WSGIHTTPException(headers=[('Set-Cookie', 'a=1'),
('Set-Cookie', 'a=2')])
mixed = exc.headers.mixed()
assert mixed['set-cookie'] == ['a=1', 'a=2']
def test_WSGIHTTPException_w_body_template():
from string import Template
TEMPLATE = '$foo: $bar'
exc = webob_exc.WSGIHTTPException(body_template = TEMPLATE)
assert_equal(exc.body_template, TEMPLATE)
ok_(isinstance(exc.body_template_obj, Template))
eq_(exc.body_template_obj.substitute({'foo': 'FOO', 'bar': 'BAR'}),
'FOO: BAR')
def test_WSGIHTTPException_w_empty_body():
class EmptyOnly(webob_exc.WSGIHTTPException):
empty_body = True
exc = EmptyOnly(content_type='text/plain', content_length=234)
ok_('content_type' not in exc.__dict__)
ok_('content_length' not in exc.__dict__)
def test_WSGIHTTPException___str__():
exc1 = webob_exc.WSGIHTTPException(detail='Detail')
eq_(str(exc1), 'Detail')
class Explain(webob_exc.WSGIHTTPException):
explanation = 'Explanation'
eq_(str(Explain()), 'Explanation')
def test_WSGIHTTPException_plain_body_no_comment():
class Explain(webob_exc.WSGIHTTPException):
code = '999'
title = 'Testing'
explanation = 'Explanation'
exc = Explain(detail='Detail')
eq_(exc.plain_body({}),
'999 Testing\n\nExplanation\n\n Detail ')
def test_WSGIHTTPException_html_body_w_comment():
class Explain(webob_exc.WSGIHTTPException):
code = '999'
title = 'Testing'
explanation = 'Explanation'
exc = Explain(detail='Detail', comment='Comment')
eq_(exc.html_body({}),
'\n'
'
\n'
' 999 Testing\n'
' \n'
' \n'
' 999 Testing
\n'
' Explanation
\n'
'Detail\n'
'\n\n'
' \n'
''
)
def test_WSGIHTTPException_generate_response():
def start_response(status, headers, exc_info=None):
pass
environ = {
'wsgi.url_scheme': 'HTTP',
'SERVER_NAME': 'localhost',
'SERVER_PORT': '80',
'REQUEST_METHOD': 'PUT',
'HTTP_ACCEPT': 'text/html'
}
excep = webob_exc.WSGIHTTPException()
assert_equal( excep(environ,start_response), [
b'\n'
b' \n'
b' 500 Internal Server Error\n'
b' \n'
b' \n'
b' 500 Internal Server Error
\n'
b'
\n'
b'\n'
b'\n\n'
b' \n'
b'' ]
)
def test_WSGIHTTPException_call_w_body():
def start_response(status, headers, exc_info=None):
pass
environ = {
'wsgi.url_scheme': 'HTTP',
'SERVER_NAME': 'localhost',
'SERVER_PORT': '80',
'REQUEST_METHOD': 'PUT'
}
excep = webob_exc.WSGIHTTPException()
excep.body = b'test'
assert_equal( excep(environ,start_response), [b'test'] )
def test_WSGIHTTPException_wsgi_response():
def start_response(status, headers, exc_info=None):
pass
environ = {
'wsgi.url_scheme': 'HTTP',
'SERVER_NAME': 'localhost',
'SERVER_PORT': '80',
'REQUEST_METHOD': 'HEAD'
}
excep = webob_exc.WSGIHTTPException()
assert_equal( excep.wsgi_response(environ,start_response), [] )
def test_WSGIHTTPException_exception_newstyle():
def start_response(status, headers, exc_info=None):
pass
environ = {
'wsgi.url_scheme': 'HTTP',
'SERVER_NAME': 'localhost',
'SERVER_PORT': '80',
'REQUEST_METHOD': 'HEAD'
}
excep = webob_exc.WSGIHTTPException()
webob_exc.newstyle_exceptions = True
assert_equal( excep(environ,start_response), [] )
def test_WSGIHTTPException_exception_no_newstyle():
def start_response(status, headers, exc_info=None):
pass
environ = {
'wsgi.url_scheme': 'HTTP',
'SERVER_NAME': 'localhost',
'SERVER_PORT': '80',
'REQUEST_METHOD': 'HEAD'
}
excep = webob_exc.WSGIHTTPException()
webob_exc.newstyle_exceptions = False
assert_equal( excep(environ,start_response), [] )
def test_HTTPOk_head_of_proxied_head():
# first set up a response to a HEAD request
HELLO_WORLD = "Hi!\n"
CONTENT_TYPE = "application/hello"
def head_app(environ, start_response):
"""An application object that understands HEAD"""
status = '200 OK'
response_headers = [('Content-Type', CONTENT_TYPE),
('Content-Length', len(HELLO_WORLD))]
start_response(status, response_headers)
if environ['REQUEST_METHOD'] == 'HEAD':
return []
else:
return [HELLO_WORLD]
def verify_response(resp, description):
assert_equal(resp.content_type, CONTENT_TYPE, description)
assert_equal(resp.content_length, len(HELLO_WORLD), description)
assert_equal(resp.body, b'', description)
req = Request.blank('/', method='HEAD')
resp1 = req.get_response(head_app)
verify_response(resp1, "first response")
# Copy the response like a proxy server would.
# Copying an empty body has set content_length
# so copy the headers only afterwards.
resp2 = webob_exc.status_map[resp1.status_int](request=req)
resp2.body = resp1.body
resp2.headerlist = resp1.headerlist
verify_response(resp2, "copied response")
# evaluate it again
resp3 = req.get_response(resp2)
verify_response(resp3, "evaluated copy")
def test_HTTPMove():
def start_response(status, headers, exc_info=None):
pass
environ = {
'wsgi.url_scheme': 'HTTP',
'SERVER_NAME': 'localhost',
'SERVER_PORT': '80',
'REQUEST_METHOD': 'HEAD',
'PATH_INFO': '/',
}
m = webob_exc._HTTPMove()
assert_equal( m( environ, start_response ), [] )
def test_HTTPMove_location_not_none():
def start_response(status, headers, exc_info=None):
pass
environ = {
'wsgi.url_scheme': 'HTTP',
'SERVER_NAME': 'localhost',
'SERVER_PORT': '80',
'REQUEST_METHOD': 'HEAD',
'PATH_INFO': '/',
}
m = webob_exc._HTTPMove(location='http://example.com')
assert_equal( m( environ, start_response ), [] )
def test_HTTPMove_add_slash_and_location():
def start_response(status, headers, exc_info=None):
pass
assert_raises( TypeError, webob_exc._HTTPMove, location='http://example.com',
add_slash=True )
def test_HTTPMove_call_add_slash():
def start_response(status, headers, exc_info=None):
pass
environ = {
'wsgi.url_scheme': 'HTTP',
'SERVER_NAME': 'localhost',
'SERVER_PORT': '80',
'REQUEST_METHOD': 'HEAD',
'PATH_INFO': '/',
}
m = webob_exc._HTTPMove()
m.add_slash = True
assert_equal( m( environ, start_response ), [] )
def test_HTTPMove_call_query_string():
def start_response(status, headers, exc_info=None):
pass
environ = {
'wsgi.url_scheme': 'HTTP',
'SERVER_NAME': 'localhost',
'SERVER_PORT': '80',
'REQUEST_METHOD': 'HEAD'
}
m = webob_exc._HTTPMove()
m.add_slash = True
environ[ 'QUERY_STRING' ] = 'querystring'
environ['PATH_INFO'] = '/'
assert_equal( m( environ, start_response ), [] )
def test_HTTPExceptionMiddleware_ok():
def app( environ, start_response ):
return '123'
application = app
m = webob_exc.HTTPExceptionMiddleware(application)
environ = {}
start_response = None
res = m( environ, start_response )
assert_equal( res, '123' )
def test_HTTPExceptionMiddleware_exception():
def wsgi_response( environ, start_response):
return '123'
def app( environ, start_response ):
raise webob_exc.HTTPException( None, wsgi_response )
application = app
m = webob_exc.HTTPExceptionMiddleware(application)
environ = {}
start_response = None
res = m( environ, start_response )
assert_equal( res, '123' )
def test_HTTPExceptionMiddleware_exception_exc_info_none():
class DummySys:
def exc_info(self):
return None
def wsgi_response( environ, start_response):
return start_response('200 OK', [], exc_info=None)
def app( environ, start_response ):
raise webob_exc.HTTPException( None, wsgi_response )
application = app
m = webob_exc.HTTPExceptionMiddleware(application)
environ = {}
def start_response(status, headers, exc_info):
pass
try:
old_sys = webob_exc.sys
sys = DummySys()
res = m( environ, start_response )
assert_equal( res, None )
finally:
webob_exc.sys = old_sys
def test_status_map_is_deterministic():
for code, cls in (
(200, webob_exc.HTTPOk),
(201, webob_exc.HTTPCreated),
(202, webob_exc.HTTPAccepted),
(203, webob_exc.HTTPNonAuthoritativeInformation),
(204, webob_exc.HTTPNoContent),
(205, webob_exc.HTTPResetContent),
(206, webob_exc.HTTPPartialContent),
(300, webob_exc.HTTPMultipleChoices),
(301, webob_exc.HTTPMovedPermanently),
(302, webob_exc.HTTPFound),
(303, webob_exc.HTTPSeeOther),
(304, webob_exc.HTTPNotModified),
(305, webob_exc.HTTPUseProxy),
(307, webob_exc.HTTPTemporaryRedirect),
(400, webob_exc.HTTPBadRequest),
(401, webob_exc.HTTPUnauthorized),
(402, webob_exc.HTTPPaymentRequired),
(403, webob_exc.HTTPForbidden),
(404, webob_exc.HTTPNotFound),
(405, webob_exc.HTTPMethodNotAllowed),
(406, webob_exc.HTTPNotAcceptable),
(407, webob_exc.HTTPProxyAuthenticationRequired),
(408, webob_exc.HTTPRequestTimeout),
(409, webob_exc.HTTPConflict),
(410, webob_exc.HTTPGone),
(411, webob_exc.HTTPLengthRequired),
(412, webob_exc.HTTPPreconditionFailed),
(413, webob_exc.HTTPRequestEntityTooLarge),
(414, webob_exc.HTTPRequestURITooLong),
(415, webob_exc.HTTPUnsupportedMediaType),
(416, webob_exc.HTTPRequestRangeNotSatisfiable),
(417, webob_exc.HTTPExpectationFailed),
(422, webob_exc.HTTPUnprocessableEntity),
(423, webob_exc.HTTPLocked),
(424, webob_exc.HTTPFailedDependency),
(428, webob_exc.HTTPPreconditionRequired),
(429, webob_exc.HTTPTooManyRequests),
(431, webob_exc.HTTPRequestHeaderFieldsTooLarge),
(451, webob_exc.HTTPUnavailableForLegalReasons),
(500, webob_exc.HTTPInternalServerError),
(501, webob_exc.HTTPNotImplemented),
(502, webob_exc.HTTPBadGateway),
(503, webob_exc.HTTPServiceUnavailable),
(504, webob_exc.HTTPGatewayTimeout),
(505, webob_exc.HTTPVersionNotSupported),
(511, webob_exc.HTTPNetworkAuthenticationRequired),
):
assert webob_exc.status_map[code] == cls