summaryrefslogtreecommitdiffhomepage
path: root/src/python/nxt_python_asgi_http.c
diff options
context:
space:
mode:
authorAndrei Zeliankou <zelenkov@nginx.com>2024-01-26 14:58:43 +0000
committerandrey-zelenkov <xim.andrew@gmail.com>2024-02-21 14:06:43 +0000
commit697a58506235e89af1c8cc3cafc92b3d85a3467d (patch)
tree67d8cf28089e947ed59d00c24df934a8a9eea956 /src/python/nxt_python_asgi_http.c
parentf71ead5fa5b8bae378a0eca2bedb689cf08a8eff (diff)
downloadunit-697a58506235e89af1c8cc3cafc92b3d85a3467d.tar.gz
unit-697a58506235e89af1c8cc3cafc92b3d85a3467d.tar.bz2
Python: bytearray body support for ASGI module.
@filiphanes requested support for bytearray and memoryview in the request body here: <https://github.com/nginx/unit/issues/648> This patch implements bytearray body support only. Memoryview body still need to be implemented.
Diffstat (limited to 'src/python/nxt_python_asgi_http.c')
-rw-r--r--src/python/nxt_python_asgi_http.c31
1 files changed, 19 insertions, 12 deletions
diff --git a/src/python/nxt_python_asgi_http.c b/src/python/nxt_python_asgi_http.c
index 05c0da4f..cdd6357e 100644
--- a/src/python/nxt_python_asgi_http.c
+++ b/src/python/nxt_python_asgi_http.c
@@ -362,16 +362,6 @@ nxt_py_asgi_http_response_body(nxt_py_asgi_http_t *http, PyObject *dict)
Py_ssize_t body_len, body_off;
nxt_py_asgi_ctx_data_t *ctx_data;
- body = PyDict_GetItem(dict, nxt_py_body_str);
- if (nxt_slow_path(body != NULL && !PyBytes_Check(body))) {
- return PyErr_Format(PyExc_TypeError, "'body' is not a byte string");
- }
-
- more_body = PyDict_GetItem(dict, nxt_py_more_body_str);
- if (nxt_slow_path(more_body != NULL && !PyBool_Check(more_body))) {
- return PyErr_Format(PyExc_TypeError, "'more_body' is not a bool");
- }
-
if (nxt_slow_path(http->complete)) {
return PyErr_Format(PyExc_RuntimeError,
"Unexpected ASGI message 'http.response.body' "
@@ -382,9 +372,26 @@ nxt_py_asgi_http_response_body(nxt_py_asgi_http_t *http, PyObject *dict)
return PyErr_Format(PyExc_RuntimeError, "Concurrent send");
}
+ more_body = PyDict_GetItem(dict, nxt_py_more_body_str);
+ if (nxt_slow_path(more_body != NULL && !PyBool_Check(more_body))) {
+ return PyErr_Format(PyExc_TypeError, "'more_body' is not a bool");
+ }
+
+ body = PyDict_GetItem(dict, nxt_py_body_str);
+
if (body != NULL) {
- body_str = PyBytes_AS_STRING(body);
- body_len = PyBytes_GET_SIZE(body);
+ if (PyBytes_Check(body)) {
+ body_str = PyBytes_AS_STRING(body);
+ body_len = PyBytes_GET_SIZE(body);
+
+ } else if (PyByteArray_Check(body)) {
+ body_str = PyByteArray_AS_STRING(body);
+ body_len = PyByteArray_GET_SIZE(body);
+
+ } else {
+ return PyErr_Format(PyExc_TypeError,
+ "'body' is not a byte string or bytearray");
+ }
nxt_unit_req_debug(http->req, "asgi_http_response_body: %d, %d",
(int) body_len, (more_body == Py_True) );