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,60 +410,57 @@ 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) {
} item = PyIter_Next(iterator);
while (run_ctx.bytes_sent < run_ctx.content_length) { if (item == NULL) {
item = PyIter_Next(iterator); if (nxt_slow_path(PyErr_Occurred() != NULL)) {
nxt_unit_req_error(req, "Python failed to iterate over "
"the application response object");
PyErr_Print();
if (item == NULL) { rc = NXT_UNIT_ERROR;
if (nxt_slow_path(PyErr_Occurred() != NULL)) { }
nxt_unit_req_error(req, "Python failed to iterate over "
"the application response object");
PyErr_Print();
goto fail; break;
} }
break; if (nxt_fast_path(PyBytes_Check(item))) {
rc = nxt_python_write(&run_ctx, item);
} else {
nxt_unit_req_error(req, "the application returned "
"not a bytestring object");
rc = NXT_UNIT_ERROR;
}
Py_DECREF(item);
if (nxt_slow_path(rc != NXT_UNIT_OK)) {
break;
}
} }
if (nxt_slow_path(!PyBytes_Check(item))) { Py_DECREF(iterator);
nxt_unit_req_error(req, "the application returned "
"not a bytestring object");
goto fail; } else {
} nxt_unit_req_error(req,
"the application returned not an iterable object");
PyErr_Print();
rc = nxt_python_write(&run_ctx, item); rc = NXT_UNIT_ERROR;
if (nxt_slow_path(rc != NXT_UNIT_OK)) {
goto fail;
}
Py_DECREF(item);
} }
Py_DECREF(iterator);
if (PyObject_HasAttrString(result, "close")) { if (PyObject_HasAttrString(result, "close")) {
PyObject_CallMethod(result, (char *) "close", NULL); PyObject_CallMethod(result, (char *) "close", NULL);
} }
@@ -471,28 +468,6 @@ nxt_python_request_handler(nxt_unit_request_info_t *req)
Py_DECREF(result); 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;
done: done:
nxt_python_thread_state = PyEval_SaveThread(); nxt_python_thread_state = PyEval_SaveThread();