diff --git a/plugins/python/wsgi_subhandler.c b/plugins/python/wsgi_subhandler.c index c2007b32..5d6f5f1f 100644 --- a/plugins/python/wsgi_subhandler.c +++ b/plugins/python/wsgi_subhandler.c @@ -214,12 +214,6 @@ clear: if (wsgi_req->async_environ) { PyDict_Clear(wsgi_req->async_environ); } - if (wsgi_req->async_post && !wsgi_req->fd_closed) { - fclose(wsgi_req->async_post); - if ( !uwsgi.post_buffering || wsgi_req->post_cl <= (size_t) uwsgi.post_buffering) { - wsgi_req->fd_closed = 1; - } - } Py_XDECREF((PyObject *)wsgi_req->async_placeholder); clear2: Py_DECREF((PyObject *)wsgi_req->async_result); diff --git a/proto/base.c b/proto/base.c index 266ccce1..ab23a7d6 100644 --- a/proto/base.c +++ b/proto/base.c @@ -10,3 +10,17 @@ int uwsgi_proto_base_accept(struct wsgi_request *wsgi_req, int fd) { return client_fd; } + +void uwsgi_proto_base_close(struct wsgi_request *wsgi_req) { + + if (wsgi_req->async_post) { + fclose(wsgi_req->async_post); + if (wsgi_req->body_as_file) { + close(wsgi_req->poll.fd); + } + } + else { + close(wsgi_req->poll.fd); + } +} + diff --git a/proto/fastcgi.c b/proto/fastcgi.c index f03ce5d8..29debc5f 100644 --- a/proto/fastcgi.c +++ b/proto/fastcgi.c @@ -50,7 +50,6 @@ int uwsgi_proto_fastcgi_parser(struct wsgi_request *wsgi_req) { // allocate space for a fastcgi record if (!wsgi_req->proto_parser_buf) { wsgi_req->proto_parser_buf = uwsgi_malloc(8 + 65536); - wsgi_req->body_as_file = 1; } if (wsgi_req->proto_parser_status == PROTO_STATUS_RECV_HDR) { @@ -73,6 +72,7 @@ int uwsgi_proto_fastcgi_parser(struct wsgi_request *wsgi_req) { wsgi_req->proto_parser_status = 0; if (wsgi_req->async_post) { rewind(wsgi_req->async_post); + wsgi_req->body_as_file = 1; } free(wsgi_req->proto_parser_buf); return UWSGI_OK; diff --git a/proto/http.c b/proto/http.c index 9690fc33..658fba20 100644 --- a/proto/http.c +++ b/proto/http.c @@ -218,7 +218,6 @@ int uwsgi_proto_http_parser(struct wsgi_request *wsgi_req) { // first round ? this memory area will be freed by async_loop if (!wsgi_req->proto_parser_buf) { wsgi_req->proto_parser_buf = uwsgi_malloc(uwsgi.buffer_size); - wsgi_req->body_as_file = 1; } if (wsgi_req->post_cl) { @@ -244,6 +243,7 @@ int uwsgi_proto_http_parser(struct wsgi_request *wsgi_req) { } rewind(wsgi_req->async_post); + wsgi_req->body_as_file = 1; return UWSGI_OK; } @@ -293,6 +293,7 @@ int uwsgi_proto_http_parser(struct wsgi_request *wsgi_req) { if (wsgi_req->proto_parser_pos >= wsgi_req->post_cl) { free(wsgi_req->proto_parser_buf); rewind(wsgi_req->async_post); + wsgi_req->body_as_file = 1; return UWSGI_OK; } } @@ -325,8 +326,3 @@ ssize_t uwsgi_proto_http_write(struct wsgi_request *wsgi_req, char *buf, size_t ssize_t uwsgi_proto_http_write_header(struct wsgi_request *wsgi_req, char *buf, size_t len) { return write(wsgi_req->poll.fd, buf, len); } - -void uwsgi_proto_http_close(struct wsgi_request *wsgi_req) { - close(wsgi_req->poll.fd); -} - diff --git a/proto/uwsgi.c b/proto/uwsgi.c index e11e0f95..24d7d93a 100644 --- a/proto/uwsgi.c +++ b/proto/uwsgi.c @@ -126,7 +126,3 @@ ssize_t uwsgi_proto_uwsgi_write(struct wsgi_request *wsgi_req, char *buf, size_t ssize_t uwsgi_proto_uwsgi_write_header(struct wsgi_request *wsgi_req, char *buf, size_t len) { return write(wsgi_req->poll.fd, buf, len); } - -void uwsgi_proto_uwsgi_close(struct wsgi_request *wsgi_req) { - close(wsgi_req->poll.fd); -} diff --git a/proto/zeromq.c b/proto/zeromq.c index 94f2552c..428252df 100644 --- a/proto/zeromq.c +++ b/proto/zeromq.c @@ -118,7 +118,6 @@ int uwsgi_proto_zeromq_accept(struct wsgi_request *wsgi_req, int fd) { } if (events & ZMQ_POLLIN || uwsgi.edge_triggered) { - wsgi_req->body_as_file = 1; wsgi_req->do_not_add_to_async_queue = 1; wsgi_req->proto_parser_status = 0; zmq_msg_init(&message); @@ -332,6 +331,7 @@ int uwsgi_proto_zeromq_accept(struct wsgi_request *wsgi_req, int fd) { wsgi_req->async_post = tmpfile(); fwrite(ptr+i+1, wsgi_req->post_cl, 1, wsgi_req->async_post); rewind(wsgi_req->async_post); + wsgi_req->body_as_file = 1; //uwsgi_log("%.*s\n", wsgi_req->post_cl, ptr+i+1); } } diff --git a/uwsgi.c b/uwsgi.c index 786c4dfd..270c00ab 100644 --- a/uwsgi.c +++ b/uwsgi.c @@ -1778,7 +1778,7 @@ int uwsgi_start(void *v_argv) { uwsgi.sockets[i].proto_write_header = uwsgi_proto_http_write_header; uwsgi.sockets[i].proto_writev_header = uwsgi_proto_http_writev_header; uwsgi.sockets[i].proto_sendfile = NULL; - uwsgi.sockets[i].proto_close = uwsgi_proto_http_close; + uwsgi.sockets[i].proto_close = uwsgi_proto_base_close; } else if (uwsgi.protocol && (!strcmp("fastcgi", uwsgi.protocol) || !strcmp("fcgi", uwsgi.protocol))) { uwsgi.shared->options[UWSGI_OPTION_CGI_MODE] = 1; @@ -1799,7 +1799,7 @@ int uwsgi_start(void *v_argv) { uwsgi.sockets[i].proto_write_header = uwsgi_proto_uwsgi_write_header; uwsgi.sockets[i].proto_writev_header = uwsgi_proto_uwsgi_writev_header; uwsgi.sockets[i].proto_sendfile = NULL; - uwsgi.sockets[i].proto_close = uwsgi_proto_uwsgi_close; + uwsgi.sockets[i].proto_close = uwsgi_proto_base_close; } } diff --git a/uwsgi.h b/uwsgi.h index a6d32b6e..41f87b2e 100644 --- a/uwsgi.h +++ b/uwsgi.h @@ -1836,14 +1836,12 @@ ssize_t uwsgi_proto_uwsgi_writev_header(struct wsgi_request *, struct iovec *, s ssize_t uwsgi_proto_uwsgi_writev(struct wsgi_request *, struct iovec *, size_t); ssize_t uwsgi_proto_uwsgi_write(struct wsgi_request *, char *, size_t); ssize_t uwsgi_proto_uwsgi_write_header(struct wsgi_request *, char *, size_t); -void uwsgi_proto_uwsgi_close(struct wsgi_request *); int uwsgi_proto_http_parser(struct wsgi_request *); ssize_t uwsgi_proto_http_writev_header(struct wsgi_request *, struct iovec *, size_t); ssize_t uwsgi_proto_http_writev(struct wsgi_request *, struct iovec *, size_t); ssize_t uwsgi_proto_http_write(struct wsgi_request *, char *, size_t); ssize_t uwsgi_proto_http_write_header(struct wsgi_request *, char *, size_t); -void uwsgi_proto_http_close(struct wsgi_request *); int uwsgi_proto_fastcgi_parser(struct wsgi_request *); ssize_t uwsgi_proto_fastcgi_writev_header(struct wsgi_request *, struct iovec *, size_t); @@ -1855,6 +1853,7 @@ void uwsgi_proto_fastcgi_close(struct wsgi_request *); int uwsgi_proto_base_accept(struct wsgi_request *, int); +void uwsgi_proto_base_close(struct wsgi_request *); #ifdef UWSGI_ZEROMQ int uwsgi_proto_zeromq_accept(struct wsgi_request *, int);