2020-06-13 03:34:01 +02:00
|
|
|
from typing import Any, List, Mapping, Optional
|
2020-06-11 00:54:34 +02:00
|
|
|
|
2020-08-07 01:09:47 +02:00
|
|
|
import orjson
|
2022-01-31 13:44:02 +01:00
|
|
|
from django.http import HttpRequest, HttpResponse, HttpResponseNotAllowed
|
2012-11-06 20:31:53 +01:00
|
|
|
|
2022-07-13 03:29:39 +02:00
|
|
|
from zerver.lib.exceptions import JsonableError, UnauthorizedError
|
2013-03-21 20:15:27 +01:00
|
|
|
|
2021-02-12 08:19:30 +01:00
|
|
|
|
|
|
|
def json_unauthorized(
|
|
|
|
message: Optional[str] = None, www_authenticate: Optional[str] = None
|
|
|
|
) -> HttpResponse:
|
2022-07-13 03:29:39 +02:00
|
|
|
return json_response_from_error(
|
|
|
|
UnauthorizedError(msg=message, www_authenticate=www_authenticate)
|
2020-08-07 01:09:47 +02:00
|
|
|
)
|
2013-07-30 23:20:16 +02:00
|
|
|
|
2021-02-12 08:19:30 +01:00
|
|
|
|
2018-05-10 19:13:36 +02:00
|
|
|
def json_method_not_allowed(methods: List[str]) -> HttpResponseNotAllowed:
|
2013-03-21 20:15:27 +01:00
|
|
|
resp = HttpResponseNotAllowed(methods)
|
2021-02-12 08:19:30 +01:00
|
|
|
resp.content = orjson.dumps(
|
|
|
|
{"result": "error", "msg": "Method Not Allowed", "allowed_methods": methods}
|
|
|
|
)
|
2013-03-21 20:15:27 +01:00
|
|
|
return resp
|
|
|
|
|
2021-02-12 08:19:30 +01:00
|
|
|
|
|
|
|
def json_response(
|
|
|
|
res_type: str = "success", msg: str = "", data: Mapping[str, Any] = {}, status: int = 200
|
|
|
|
) -> HttpResponse:
|
2012-11-06 20:31:53 +01:00
|
|
|
content = {"result": res_type, "msg": msg}
|
2020-06-13 03:34:01 +02:00
|
|
|
content.update(data)
|
2020-08-07 01:09:47 +02:00
|
|
|
|
|
|
|
# Because we don't pass a default handler, OPT_PASSTHROUGH_DATETIME
|
|
|
|
# actually causes orjson to raise a TypeError on datetime objects. This
|
|
|
|
# helps us avoid relying on the particular serialization used by orjson.
|
|
|
|
return HttpResponse(
|
|
|
|
content=orjson.dumps(
|
|
|
|
content,
|
|
|
|
option=orjson.OPT_APPEND_NEWLINE | orjson.OPT_PASSTHROUGH_DATETIME,
|
|
|
|
),
|
2021-02-12 08:20:45 +01:00
|
|
|
content_type="application/json",
|
2020-08-07 01:09:47 +02:00
|
|
|
status=status,
|
|
|
|
)
|
2012-11-06 20:31:53 +01:00
|
|
|
|
2021-02-12 08:19:30 +01:00
|
|
|
|
2022-01-31 13:44:02 +01:00
|
|
|
def json_success(request: HttpRequest, data: Mapping[str, Any] = {}) -> HttpResponse:
|
2012-11-06 20:31:53 +01:00
|
|
|
return json_response(data=data)
|
|
|
|
|
2021-02-12 08:19:30 +01:00
|
|
|
|
2022-10-02 21:32:36 +02:00
|
|
|
def json_partial_success(request: HttpRequest, data: Mapping[str, Any] = {}) -> HttpResponse:
|
|
|
|
return json_response(res_type="partially_completed", data=data, status=200)
|
|
|
|
|
|
|
|
|
2017-11-05 11:15:10 +01:00
|
|
|
def json_response_from_error(exception: JsonableError) -> HttpResponse:
|
2021-02-12 08:19:30 +01:00
|
|
|
"""
|
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.
|
2021-02-12 08:19:30 +01:00
|
|
|
"""
|
|
|
|
response = json_response(
|
2021-02-12 08:20:45 +01:00
|
|
|
"error", msg=exception.msg, data=exception.data, status=exception.http_status_code
|
2021-02-12 08:19:30 +01:00
|
|
|
)
|
2020-11-27 16:33:01 +01:00
|
|
|
|
|
|
|
for header, value in exception.extra_headers.items():
|
|
|
|
response[header] = value
|
|
|
|
|
|
|
|
return response
|
2022-05-27 01:06:39 +02:00
|
|
|
|
|
|
|
|
|
|
|
class AsynchronousResponse(HttpResponse):
|
|
|
|
"""
|
|
|
|
This response is just a sentinel to be discarded by Tornado and replaced
|
|
|
|
with a real response later; see zulip_finish.
|
|
|
|
"""
|
|
|
|
|
|
|
|
status_code = 399
|