From 840737280114b2fdf39669c39855268dbc2ea6e8 Mon Sep 17 00:00:00 2001 From: Roberto De Ioris Date: Sat, 24 Nov 2012 10:11:12 +0100 Subject: [PATCH] fixed PATH_TRANSLATED in php and improved offloading of bigger files --- core/offload.c | 1 + core/protocol.c | 13 ++++++++++++ plugins/cgi/cgi_plugin.c | 12 ++++++++--- plugins/router_rewrite/router_rewrite.c | 27 ------------------------- 4 files changed, 23 insertions(+), 30 deletions(-) diff --git a/core/offload.c b/core/offload.c index 7690852a..bf2d3e76 100644 --- a/core/offload.c +++ b/core/offload.c @@ -234,6 +234,7 @@ static int uwsgi_offload_sendfile_transfer(struct uwsgi_thread *ut, struct uwsgi if (uor->written >= uor->len) { return -1; } + return 0; } else if (len < 0) { uwsgi_offload_retry diff --git a/core/protocol.c b/core/protocol.c index f3d74d6f..e16b59d0 100644 --- a/core/protocol.c +++ b/core/protocol.c @@ -1664,18 +1664,31 @@ char *uwsgi_req_append(struct wsgi_request *wsgi_req, char *key, uint16_t keylen return NULL; } + if (wsgi_req->var_cnt >= uwsgi.vec_size - (4 + 2)) { + uwsgi_log("max vec size reached. skip this header.\n"); + return NULL; + } + char *ptr = wsgi_req->buffer + wsgi_req->uh.pktsize; *ptr++ = (uint8_t) (keylen & 0xff); *ptr++ = (uint8_t) ((keylen >> 8) & 0xff); memcpy(ptr, key, keylen); + wsgi_req->hvec[wsgi_req->var_cnt].iov_base = ptr; + wsgi_req->hvec[wsgi_req->var_cnt].iov_len = keylen; + wsgi_req->var_cnt++; ptr += keylen; + + *ptr++ = (uint8_t) (vallen & 0xff); *ptr++ = (uint8_t) ((vallen >> 8) & 0xff); memcpy(ptr, val, vallen); + wsgi_req->hvec[wsgi_req->var_cnt].iov_base = ptr; + wsgi_req->hvec[wsgi_req->var_cnt].iov_len = vallen; + wsgi_req->var_cnt++; wsgi_req->uh.pktsize += (2 + keylen + 2 + vallen); diff --git a/plugins/cgi/cgi_plugin.c b/plugins/cgi/cgi_plugin.c index 4bb04dcd..88462b9f 100644 --- a/plugins/cgi/cgi_plugin.c +++ b/plugins/cgi/cgi_plugin.c @@ -838,9 +838,15 @@ clear2: uwsgi_error("setenv()"); } - - if (setenv("PATH_TRANSLATED", uwsgi_concat3n(docroot, docroot_len, path_info, pi_len, "", 0) , 1)) { - uwsgi_error("setenv()"); + if (wsgi_req->document_root_len > 0) { + if (setenv("PATH_TRANSLATED", uwsgi_concat3n(wsgi_req->document_root, wsgi_req->document_root_len, path_info, pi_len, "", 0) , 1)) { + uwsgi_error("setenv()"); + } + } + else { + if (setenv("PATH_TRANSLATED", uwsgi_concat3n(docroot, docroot_len, path_info, pi_len, "", 0) , 1)) { + uwsgi_error("setenv()"); + } } } diff --git a/plugins/router_rewrite/router_rewrite.c b/plugins/router_rewrite/router_rewrite.c index d45e6d75..46230e94 100644 --- a/plugins/router_rewrite/router_rewrite.c +++ b/plugins/router_rewrite/router_rewrite.c @@ -27,19 +27,6 @@ int uwsgi_routing_func_rewrite(struct wsgi_request *wsgi_req, struct uwsgi_route char *ptr = uwsgi_req_append(wsgi_req, "PATH_INFO", 9, path_info, path_info_len); if (!ptr) goto clear; - // fill iovec - if (wsgi_req->var_cnt + 2 >= uwsgi.vec_size - (4 + 1)) { - uwsgi_log("not enough io vectors for rewriting url\n"); - goto clear; - } - - wsgi_req->hvec[wsgi_req->var_cnt].iov_base = ptr - (2 + 9); - wsgi_req->hvec[wsgi_req->var_cnt].iov_len = 9; - wsgi_req->var_cnt++; - wsgi_req->hvec[wsgi_req->var_cnt].iov_base = ptr; - wsgi_req->hvec[wsgi_req->var_cnt].iov_len = path_info_len; - wsgi_req->var_cnt++; - // set new path_info wsgi_req->path_info = ptr; wsgi_req->path_info_len = path_info_len; @@ -47,20 +34,6 @@ int uwsgi_routing_func_rewrite(struct wsgi_request *wsgi_req, struct uwsgi_route ptr = uwsgi_req_append(wsgi_req, "QUERY_STRING", 12, query_string, query_string_len); if (!ptr) goto clear; - // fill iovec - if (wsgi_req->var_cnt + 2 >= uwsgi.vec_size - (4 + 1)) { - uwsgi_log("not enough io vectors for rewriting url\n"); - goto clear; - } - - wsgi_req->hvec[wsgi_req->var_cnt].iov_base = ptr - (2 + 12); - wsgi_req->hvec[wsgi_req->var_cnt].iov_len = 12; - wsgi_req->var_cnt++; - wsgi_req->hvec[wsgi_req->var_cnt].iov_base = ptr; - wsgi_req->hvec[wsgi_req->var_cnt].iov_len = query_string_len; - wsgi_req->var_cnt++; - - // set new query_string wsgi_req->query_string = ptr; wsgi_req->query_string_len = query_string_len;