2013-04-23 18:51:17 +02:00
|
|
|
|
2013-03-21 20:15:27 +01:00
|
|
|
from django.http import HttpResponse, HttpResponseNotAllowed
|
2013-06-18 23:55:55 +02:00
|
|
|
import ujson
|
2012-11-06 20:31:53 +01:00
|
|
|
|
2016-12-21 13:17:53 +01:00
|
|
|
from typing import Optional, Any, Dict, List, Text
|
2017-07-21 02:19:52 +02:00
|
|
|
from zerver.lib.exceptions import JsonableError
|
2016-06-04 20:38:42 +02:00
|
|
|
|
2013-03-21 20:15:27 +01:00
|
|
|
class HttpResponseUnauthorized(HttpResponse):
|
|
|
|
status_code = 401
|
|
|
|
|
2016-05-18 03:42:07 +02:00
|
|
|
def __init__(self, realm, www_authenticate=None):
|
2016-12-21 13:17:53 +01:00
|
|
|
# type: (Text, Optional[Text]) -> None
|
2013-03-21 20:15:27 +01:00
|
|
|
HttpResponse.__init__(self)
|
2016-05-18 03:42:07 +02:00
|
|
|
if www_authenticate is None:
|
|
|
|
self["WWW-Authenticate"] = 'Basic realm="%s"' % (realm,)
|
|
|
|
elif www_authenticate == "session":
|
|
|
|
self["WWW-Authenticate"] = 'Session realm="%s"' % (realm,)
|
|
|
|
else:
|
2017-03-05 09:26:07 +01:00
|
|
|
raise AssertionError("Invalid www_authenticate value!")
|
2013-03-21 20:15:27 +01:00
|
|
|
|
2016-05-18 03:42:07 +02:00
|
|
|
def json_unauthorized(message, www_authenticate=None):
|
2016-12-21 13:17:53 +01:00
|
|
|
# type: (Text, Optional[Text]) -> HttpResponse
|
2016-05-18 03:42:07 +02:00
|
|
|
resp = HttpResponseUnauthorized("zulip", www_authenticate=www_authenticate)
|
2017-11-04 16:15:52 +01:00
|
|
|
resp.content = (ujson.dumps({"result": "error",
|
|
|
|
"msg": message}) + "\n").encode()
|
2013-07-30 23:20:16 +02:00
|
|
|
return resp
|
|
|
|
|
2013-03-21 20:15:27 +01:00
|
|
|
def json_method_not_allowed(methods):
|
2017-05-24 03:04:36 +02:00
|
|
|
# type: (List[Text]) -> HttpResponseNotAllowed
|
2013-03-21 20:15:27 +01:00
|
|
|
resp = HttpResponseNotAllowed(methods)
|
2017-11-04 16:15:52 +01:00
|
|
|
resp.content = ujson.dumps({"result": "error",
|
|
|
|
"msg": "Method Not Allowed",
|
|
|
|
"allowed_methods": methods}).encode()
|
2013-03-21 20:15:27 +01:00
|
|
|
return resp
|
|
|
|
|
2016-06-03 01:04:39 +02:00
|
|
|
def json_response(res_type="success", msg="", data=None, status=200):
|
2016-12-21 13:17:53 +01:00
|
|
|
# type: (Text, Text, Optional[Dict[str, Any]], int) -> HttpResponse
|
2012-11-06 20:31:53 +01:00
|
|
|
content = {"result": res_type, "msg": msg}
|
2016-06-03 01:04:39 +02:00
|
|
|
if data is not None:
|
|
|
|
content.update(data)
|
2013-12-04 19:42:57 +01:00
|
|
|
return HttpResponse(content=ujson.dumps(content) + "\n",
|
2015-08-19 03:41:11 +02:00
|
|
|
content_type='application/json', status=status)
|
2012-11-06 20:31:53 +01:00
|
|
|
|
2016-06-03 01:04:39 +02:00
|
|
|
def json_success(data=None):
|
2016-06-04 20:38:42 +02:00
|
|
|
# type: (Optional[Dict[str, Any]]) -> HttpResponse
|
2012-11-06 20:31:53 +01:00
|
|
|
return json_response(data=data)
|
|
|
|
|
2017-07-21 02:19:52 +02:00
|
|
|
def json_response_from_error(exception):
|
|
|
|
# type: (JsonableError) -> HttpResponse
|
2017-07-25 22:17:55 +02:00
|
|
|
'''
|
|
|
|
This should only be needed in middleware; in app code, just raise.
|
|
|
|
|
|
|
|
When app code raises a JsonableError, the JsonErrorHandler
|
|
|
|
middleware takes care of transforming it into a response by
|
|
|
|
calling this function.
|
|
|
|
'''
|
2017-07-21 02:19:52 +02:00
|
|
|
return json_response('error',
|
|
|
|
msg=exception.msg,
|
|
|
|
data=exception.data,
|
|
|
|
status=exception.http_status_code)
|
|
|
|
|
2016-06-03 01:04:39 +02:00
|
|
|
def json_error(msg, data=None, status=400):
|
2017-07-20 00:19:42 +02:00
|
|
|
# type: (Text, Optional[Dict[str, Any]], int) -> HttpResponse
|
2012-11-06 20:31:53 +01:00
|
|
|
return json_response(res_type="error", msg=msg, data=data, status=status)
|