Python: refactored nxt_python_request_handler().

This commit is contained in:
Valentin Bartenev
2019-11-14 17:48:48 +03:00
parent cd6cb02be0
commit c667bb446d

View File

@@ -410,27 +410,15 @@ nxt_python_request_handler(nxt_unit_request_info_t *req)
goto done; goto done;
} }
item = NULL;
iterator = NULL;
/* Shortcut: avoid iterate over result string symbols. */ /* Shortcut: avoid iterate over result string symbols. */
if (PyBytes_Check(result)) { if (PyBytes_Check(result)) {
rc = nxt_python_write(&run_ctx, result); rc = nxt_python_write(&run_ctx, result);
if (nxt_slow_path(rc != NXT_UNIT_OK)) {
goto fail;
}
} else { } else {
iterator = PyObject_GetIter(result); iterator = PyObject_GetIter(result);
if (nxt_slow_path(iterator == NULL)) { if (nxt_fast_path(iterator != NULL)) {
nxt_unit_req_error(req, "the application returned " rc = NXT_UNIT_OK;
"not an iterable object");
PyErr_Print();
goto fail;
}
while (run_ctx.bytes_sent < run_ctx.content_length) { while (run_ctx.bytes_sent < run_ctx.content_length) {
item = PyIter_Next(iterator); item = PyIter_Next(iterator);
@@ -441,57 +429,44 @@ nxt_python_request_handler(nxt_unit_request_info_t *req)
"the application response object"); "the application response object");
PyErr_Print(); PyErr_Print();
goto fail; rc = NXT_UNIT_ERROR;
} }
break; break;
} }
if (nxt_slow_path(!PyBytes_Check(item))) { if (nxt_fast_path(PyBytes_Check(item))) {
rc = nxt_python_write(&run_ctx, item);
} else {
nxt_unit_req_error(req, "the application returned " nxt_unit_req_error(req, "the application returned "
"not a bytestring object"); "not a bytestring object");
rc = NXT_UNIT_ERROR;
goto fail;
} }
rc = nxt_python_write(&run_ctx, item); Py_DECREF(item);
if (nxt_slow_path(rc != NXT_UNIT_OK)) { if (nxt_slow_path(rc != NXT_UNIT_OK)) {
goto fail; break;
} }
Py_DECREF(item);
} }
Py_DECREF(iterator); Py_DECREF(iterator);
if (PyObject_HasAttrString(result, "close")) { } else {
PyObject_CallMethod(result, (char *) "close", NULL); nxt_unit_req_error(req,
} "the application returned not an iterable object");
} PyErr_Print();
Py_DECREF(result);
rc = NXT_UNIT_OK;
goto done;
fail:
if (item != NULL) {
Py_DECREF(item);
}
if (iterator != NULL) {
Py_DECREF(iterator);
}
if (PyObject_HasAttrString(result, "close")) {
PyObject_CallMethod(result, (char *) "close", NULL);
}
Py_DECREF(result);
rc = NXT_UNIT_ERROR; rc = NXT_UNIT_ERROR;
}
if (PyObject_HasAttrString(result, "close")) {
PyObject_CallMethod(result, (char *) "close", NULL);
}
}
Py_DECREF(result);
done: done: