diff --git a/gluon/contrib/login_methods/oauth10a_account.py b/gluon/contrib/login_methods/oauth10a_account.py
index 98b61a0f..f6cfeb0e 100644
--- a/gluon/contrib/login_methods/oauth10a_account.py
+++ b/gluon/contrib/login_methods/oauth10a_account.py
@@ -176,7 +176,7 @@ class OAuthAccount(object):
HTTP = self.globals['HTTP']
- raise HTTP(307,
+ raise HTTP(302,
"You are not authenticated: you are being redirected to the authentication server",
Location=auth_request_url)
diff --git a/gluon/contrib/login_methods/oauth20_account.py b/gluon/contrib/login_methods/oauth20_account.py
index 27ff2936..e36d9229 100644
--- a/gluon/contrib/login_methods/oauth20_account.py
+++ b/gluon/contrib/login_methods/oauth20_account.py
@@ -285,7 +285,7 @@ server for requests. It can be used for the optional"scope" parameters for Face
if self.args:
data.update(self.args)
auth_request_url = self.auth_url + "?" + urlencode(data)
- raise HTTP(307,
+ raise HTTP(302,
"You are not authenticated: you are being redirected to the authentication server",
Location=auth_request_url)
return
diff --git a/gluon/http.py b/gluon/http.py
index 48efacad..22490340 100644
--- a/gluon/http.py
+++ b/gluon/http.py
@@ -69,12 +69,14 @@ class HTTP(BaseException):
status,
body='',
cookies=None,
+ status_message='',
**headers
):
self.status = status
self.body = body
self.headers = headers
self.cookies2headers(cookies)
+ self.status_message = status_message
def cookies2headers(self, cookies):
if cookies and len(cookies) > 0:
@@ -85,10 +87,14 @@ class HTTP(BaseException):
env = env or {}
status = self.status
headers = self.headers
+ status_message = status
if status in defined_status:
- status = '%d %s' % (status, defined_status[status])
+ if status_message:
+ status = str(status) + ' ' + str(status_message)
+ else:
+ status = '%d %s' % (status, defined_status[status])
else:
- status = str(status)
+ status = str(status) + ' ' + status_message
if not regex_status.match(status):
status = '500 %s' % (defined_status[500])
headers.setdefault('Content-Type', 'text/html; charset=UTF-8')
@@ -124,12 +130,17 @@ class HTTP(BaseException):
message elements that are not defined are omitted
"""
msg = '%(status)d'
- if self.status in defined_status:
+ status_message = ''
+ if self.status_message:
+ status_message = self.status_message
+ elif self.status in defined_status:
+ status_message = defined_status.get(self.status)
+ if status_message:
msg = '%(status)d %(defined_status)s'
if 'web2py_error' in self.headers:
msg += ' [%(web2py_error)s]'
return msg % dict(status=self.status,
- defined_status=defined_status.get(self.status),
+ defined_status=status_message,
web2py_error=self.headers.get('web2py_error'))
def __str__(self):
diff --git a/gluon/tests/__init__.py b/gluon/tests/__init__.py
index 1ce8fb20..01573203 100644
--- a/gluon/tests/__init__.py
+++ b/gluon/tests/__init__.py
@@ -1,3 +1,4 @@
+from test_http import *
from test_cache import *
from test_dal import *
from test_html import *
diff --git a/gluon/tests/test_http.py b/gluon/tests/test_http.py
new file mode 100644
index 00000000..c41db092
--- /dev/null
+++ b/gluon/tests/test_http.py
@@ -0,0 +1,45 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+"""Unit tests for http.py """
+
+import sys
+import os
+import unittest
+if os.path.isdir('gluon'):
+ sys.path.append(os.path.realpath('gluon'))
+else:
+ sys.path.append(os.path.realpath('../'))
+
+from http import HTTP, defined_status
+
+
+class TestHTTP(unittest.TestCase):
+ """ Tests http.HTTP """
+
+ def test_status_message(self):
+ """ Tests http status code message """
+
+ h = HTTP
+
+ def gen_status_str(code, message):
+ return str(code) + ' ' + str(message)
+ message = 'This is a custom message'
+ code = 1423
+ self.assertEqual(str(h(code, status_message=message)), gen_status_str(code, message))
+
+ # test predefined codes
+ for code in defined_status.keys():
+ self.assertEqual(str(h(code)), gen_status_str(code, defined_status[code]))
+
+ # test correct use of status_message
+ for code in defined_status.keys():
+ self.assertEqual(str(h(code, status_message=message)), gen_status_str(code, message))
+
+ # test wrong call detection
+
+
+
+
+if __name__ == '__main__':
+ unittest.main()