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