diff options
author | Roberto De Ioris <roberto@unbit.it> | 2013-01-05 11:46:11 +0100 |
---|---|---|
committer | Roberto De Ioris <roberto@unbit.it> | 2013-01-05 11:46:11 +0100 |
commit | 3d3b21afc9ddc7474cdaaf700dfce065213b76d7 (patch) | |
tree | 132ffb75965fc8b662d8cae7bbf43f64f862bf3a /core/protocol.c | |
parent | 3cd7a1163df8da7591ce29bb8ba7571a6843b25e (diff) | |
download | uwsgi-3d3b21afc9ddc7474cdaaf700dfce065213b76d7.tar.gz |
improved break routing instruction and first round of uwsgi protocol parsing optimizations
Diffstat (limited to 'core/protocol.c')
-rw-r--r-- | core/protocol.c | 458 |
1 files changed, 298 insertions, 160 deletions
diff --git a/core/protocol.c b/core/protocol.c index b3fd3c2a..5bf99ba7 100644 --- a/core/protocol.c +++ b/core/protocol.c @@ -2,6 +2,7 @@ extern struct uwsgi_server uwsgi; +// this is line uwsgi_str_num but with security checks static size_t get_content_length(char *buf, uint16_t size) { int i; size_t val = 0; @@ -438,6 +439,288 @@ int uwsgi_simple_parse_vars(struct wsgi_request *wsgi_req, char *ptrbuf, char *b return 0; } +#define uwsgi_proto_key(x, y) memcmp(x, key, y) + +static int uwsgi_proto_check_5(struct wsgi_request *wsgi_req, char *key, char *buf, uint16_t len) { + + if (!uwsgi_proto_key("HTTPS", 5)) { + wsgi_req->https = buf; + wsgi_req->https_len = len; + return 0; + } + + return 0; +} + +static int uwsgi_proto_check_9(struct wsgi_request *wsgi_req, char *key, char *buf, uint16_t len) { + + if (!uwsgi_proto_key("PATH_INFO", 9)) { + wsgi_req->path_info = buf; + wsgi_req->path_info_len = len; + wsgi_req->path_info_pos = wsgi_req->var_cnt + 1; +#ifdef UWSGI_DEBUG + uwsgi_debug("PATH_INFO=%.*s\n", wsgi_req->path_info_len, wsgi_req->path_info); +#endif + return 0; + } + + if (!uwsgi_proto_key("HTTP_HOST", 9)) { + wsgi_req->host = buf; + wsgi_req->host_len = len; +#ifdef UWSGI_DEBUG + uwsgi_debug("HTTP_HOST=%.*s\n", wsgi_req->host_len, wsgi_req->host); +#endif + return 0; + } + + return 0; +} + +static int uwsgi_proto_check_10(struct wsgi_request *wsgi_req, char *key, char *buf, uint16_t len) { + + if (!uwsgi_proto_key("UWSGI_FILE", 10)) { + wsgi_req->file = buf; + wsgi_req->file_len = len; + wsgi_req->dynamic = 1; + return 0; + } + + return 0; +} + +static int uwsgi_proto_check_11(struct wsgi_request *wsgi_req, char *key, char *buf, uint16_t len) { + + if (!uwsgi_proto_key("SCRIPT_NAME", 11)) { + wsgi_req->script_name = buf; + wsgi_req->script_name_len = len; + wsgi_req->script_name_pos = wsgi_req->var_cnt + 1; +#ifdef UWSGI_DEBUG + uwsgi_debug("SCRIPT_NAME=%.*s\n", wsgi_req->script_name_len, wsgi_req->script_name); +#endif + return 0; + } + + if (!uwsgi_proto_key("REQUEST_URI", 11)) { + wsgi_req->uri = buf; + wsgi_req->uri_len = len; + return 0; + } + + if (!uwsgi_proto_key("REMOTE_USER", 11)) { + wsgi_req->remote_user = buf; + wsgi_req->remote_user_len = len; + return 0; + } + + if (wsgi_req->host_len == 0 && !uwsgi_proto_key("SERVER_NAME", 11)) { + wsgi_req->host = buf; + wsgi_req->host_len = len; +#ifdef UWSGI_DEBUG + uwsgi_debug("SERVER_NAME=%.*s\n", wsgi_req->host_len, wsgi_req->host); +#endif + return 0; + } + + if (wsgi_req->remote_addr_len == 0 && !uwsgi_proto_key("REMOTE_ADDR", 11)) { + wsgi_req->remote_addr = buf; + wsgi_req->remote_addr_len = len; + return 0; + } + + if (!uwsgi_proto_key("UWSGI_APPID", 11)) { + wsgi_req->appid = buf; + wsgi_req->appid_len = len; + return 0; + } + + if (!uwsgi_proto_key("UWSGI_CHDIR", 11)) { + wsgi_req->chdir = buf; + wsgi_req->chdir_len = len; + return 0; + } + + return 0; +} + +static int uwsgi_proto_check_12(struct wsgi_request *wsgi_req, char *key, char *buf, uint16_t len) { + if (!uwsgi_proto_key("QUERY_STRING", 12)) { + wsgi_req->query_string = buf; + wsgi_req->query_string_len = len; + return 0; + } + + if (!uwsgi_proto_key("CONTENT_TYPE", 12)) { + wsgi_req->content_type = buf; + wsgi_req->content_type_len = len; + return 0; + } + + if (!uwsgi_proto_key("UWSGI_SCHEME", 12)) { + wsgi_req->scheme = buf; + wsgi_req->scheme_len = len; + return 0; + } + + if (!uwsgi_proto_key("UWSGI_SCRIPT", 12)) { + wsgi_req->script = buf; + wsgi_req->script_len = len; + wsgi_req->dynamic = 1; + return 0; + } + + if (!uwsgi_proto_key("UWSGI_MODULE", 12)) { + wsgi_req->module = buf; + wsgi_req->module_len = len; + wsgi_req->dynamic = 1; + return 0; + } + + if (!uwsgi_proto_key("UWSGI_PYHOME", 12)) { + wsgi_req->pyhome = buf; + wsgi_req->pyhome_len = len; + return 0; + } + + if (!uwsgi_proto_key("UWSGI_SETENV", 12)) { + char *env_value = memchr(buf, '=', len); + if (env_value) { + env_value[0] = 0; + env_value = uwsgi_concat2n(env_value + 1, len - ((env_value + 1) - buf), "", 0); + if (setenv(buf, env_value, 1)) { + uwsgi_error("setenv()"); + } + free(env_value); + } + return 0; + } + return 0; +} + +static int uwsgi_proto_check_13(struct wsgi_request *wsgi_req, char *key, char *buf, uint16_t len) { + if (!uwsgi_proto_key("DOCUMENT_ROOT", 13)) { + wsgi_req->document_root = buf; + wsgi_req->document_root_len = len; + return 0; + } + return 0; +} + +static int uwsgi_proto_check_14(struct wsgi_request *wsgi_req, char *key, char *buf, uint16_t len) { + if (!uwsgi_proto_key("REQUEST_METHOD", 14)) { + wsgi_req->method = buf; + wsgi_req->method_len = len; + return 0; + } + + if (!uwsgi_proto_key("CONTENT_LENGTH", 14)) { + wsgi_req->post_cl = get_content_length(buf, len); + if (uwsgi.limit_post) { + if (wsgi_req->post_cl > uwsgi.limit_post) { + uwsgi_log("Invalid (too big) CONTENT_LENGTH. skip.\n"); + return -1; + } + } + return 0; + } + + if (!uwsgi_proto_key("UWSGI_POSTFILE", 14)) { + char *postfile = uwsgi_concat2n(buf, len, "", 0); + wsgi_req->async_post = fopen(postfile, "r"); + if (!wsgi_req->async_post) { + uwsgi_error_open(postfile); + } + free(postfile); + wsgi_req->body_as_file = 1; + return 0; + } + + if (!uwsgi_proto_key("UWSGI_CALLABLE", 14)) { + wsgi_req->callable = buf; + wsgi_req->callable_len = len; + wsgi_req->dynamic = 1; + return 0; + } + + return 0; +} + +static int uwsgi_proto_check_15(struct wsgi_request *wsgi_req, char *key, char *buf, uint16_t len) { + if (!uwsgi_proto_key("SERVER_PROTOCOL", 15)) { + wsgi_req->protocol = buf; + wsgi_req->protocol_len = len; + return 0; + } + + if (!uwsgi_proto_key("HTTP_USER_AGENT", 15)) { + wsgi_req->user_agent = buf; + wsgi_req->user_agent_len = len; + return 0; + } + + if (uwsgi.cache_max_items > 0 && !uwsgi_proto_key("UWSGI_CACHE_GET", 15)) { + wsgi_req->cache_get = buf; + wsgi_req->cache_get_len = len; + return 0; + } + + return 0; +} + +static int uwsgi_proto_check_18(struct wsgi_request *wsgi_req, char *key, char *buf, uint16_t len) { + if (!uwsgi_proto_key("HTTP_AUTHORIZATION", 18)) { + wsgi_req->authorization = buf; + wsgi_req->authorization_len = len; + return 0; + } + + if (!uwsgi_proto_key("UWSGI_TOUCH_RELOAD", 18)) { + wsgi_req->touch_reload = buf; + wsgi_req->touch_reload_len = len; + return 0; + } + + return 0; +} + + +static int uwsgi_proto_check_20(struct wsgi_request *wsgi_req, char *key, char *buf, uint16_t len) { + if (uwsgi.log_x_forwarded_for && !uwsgi_proto_key("HTTP_X_FORWARDED_FOR", 20)) { + wsgi_req->remote_addr = buf; + wsgi_req->remote_addr_len = len; + return 0; + } + return 0; +} + +static int uwsgi_proto_check_22(struct wsgi_request *wsgi_req, char *key, char *buf, uint16_t len) { + if (!uwsgi_proto_key("HTTP_IF_MODIFIED_SINCE", 22)) { + wsgi_req->if_modified_since = buf; + wsgi_req->if_modified_since_len = len; + return 0; + } + return 0; +} + +void uwsgi_proto_hooks_setup() { + int i = 0; + for(i=0;i<UWSGI_PROTO_MAX_CHECK;i++) { + uwsgi.proto_hooks[i] = NULL; + } + + uwsgi.proto_hooks[5] = uwsgi_proto_check_5; + uwsgi.proto_hooks[9] = uwsgi_proto_check_9; + uwsgi.proto_hooks[10] = uwsgi_proto_check_10; + uwsgi.proto_hooks[11] = uwsgi_proto_check_11; + uwsgi.proto_hooks[12] = uwsgi_proto_check_12; + uwsgi.proto_hooks[13] = uwsgi_proto_check_13; + uwsgi.proto_hooks[14] = uwsgi_proto_check_14; + uwsgi.proto_hooks[15] = uwsgi_proto_check_15; + uwsgi.proto_hooks[18] = uwsgi_proto_check_18; + uwsgi.proto_hooks[20] = uwsgi_proto_check_20; + uwsgi.proto_hooks[22] = uwsgi_proto_check_22; +} + + int uwsgi_parse_vars(struct wsgi_request *wsgi_req) { char *buffer = wsgi_req->buffer; @@ -449,8 +732,8 @@ int uwsgi_parse_vars(struct wsgi_request *wsgi_req) { ptrbuf = buffer; bufferend = ptrbuf + wsgi_req->uh.pktsize; - int i, script_name = -1; - + int i; + /* set an HTTP 500 status as default */ wsgi_req->status = 500; @@ -468,6 +751,7 @@ int uwsgi_parse_vars(struct wsgi_request *wsgi_req) { } wsgi_req->parsed = 1; + wsgi_req->script_name_pos = -1; wsgi_req->path_info_pos = -1; while (ptrbuf < bufferend) { @@ -496,160 +780,14 @@ int uwsgi_parse_vars(struct wsgi_request *wsgi_req) { #endif ptrbuf += 2; if (ptrbuf + strsize <= bufferend) { - //uwsgi_log("uwsgi %.*s = %.*s\n", wsgi_req->hvec[wsgi_req->var_cnt].iov_len, wsgi_req->hvec[wsgi_req->var_cnt].iov_base, strsize, ptrbuf); - if (!uwsgi_strncmp("SCRIPT_NAME", 11, wsgi_req->hvec[wsgi_req->var_cnt].iov_base, wsgi_req->hvec[wsgi_req->var_cnt].iov_len)) { - wsgi_req->script_name = ptrbuf; - wsgi_req->script_name_len = strsize; - script_name = wsgi_req->var_cnt + 1; -#ifdef UWSGI_DEBUG - uwsgi_debug("SCRIPT_NAME=%.*s\n", wsgi_req->script_name_len, wsgi_req->script_name); -#endif - } - else if (!uwsgi_strncmp("PATH_INFO", 9, wsgi_req->hvec[wsgi_req->var_cnt].iov_base, wsgi_req->hvec[wsgi_req->var_cnt].iov_len)) { - wsgi_req->path_info = ptrbuf; - wsgi_req->path_info_len = strsize; - wsgi_req->path_info_pos = wsgi_req->var_cnt + 1; -#ifdef UWSGI_DEBUG - uwsgi_debug("PATH_INFO=%.*s\n", wsgi_req->path_info_len, wsgi_req->path_info); -#endif - } - else if (!uwsgi_strncmp("SERVER_PROTOCOL", 15, wsgi_req->hvec[wsgi_req->var_cnt].iov_base, wsgi_req->hvec[wsgi_req->var_cnt].iov_len)) { - wsgi_req->protocol = ptrbuf; - wsgi_req->protocol_len = strsize; - } - else if (!uwsgi_strncmp("REQUEST_URI", 11, wsgi_req->hvec[wsgi_req->var_cnt].iov_base, wsgi_req->hvec[wsgi_req->var_cnt].iov_len)) { - wsgi_req->uri = ptrbuf; - wsgi_req->uri_len = strsize; - } - else if (!uwsgi_strncmp("QUERY_STRING", 12, wsgi_req->hvec[wsgi_req->var_cnt].iov_base, wsgi_req->hvec[wsgi_req->var_cnt].iov_len)) { - wsgi_req->query_string = ptrbuf; - wsgi_req->query_string_len = strsize; - } - else if (!uwsgi_strncmp("REQUEST_METHOD", 14, wsgi_req->hvec[wsgi_req->var_cnt].iov_base, wsgi_req->hvec[wsgi_req->var_cnt].iov_len)) { - wsgi_req->method = ptrbuf; - wsgi_req->method_len = strsize; - } - else if ((!uwsgi.log_x_forwarded_for || uwsgi_strncmp("HTTP_X_FORWARDED_FOR", 20, wsgi_req->hvec[wsgi_req->var_cnt].iov_base, wsgi_req->hvec[wsgi_req->var_cnt].iov_len)) - && !uwsgi_strncmp("REMOTE_ADDR", 11, wsgi_req->hvec[wsgi_req->var_cnt].iov_base, wsgi_req->hvec[wsgi_req->var_cnt].iov_len)) { - wsgi_req->remote_addr = ptrbuf; - wsgi_req->remote_addr_len = strsize; - } - else if (!uwsgi_strncmp("REMOTE_USER", 11, wsgi_req->hvec[wsgi_req->var_cnt].iov_base, wsgi_req->hvec[wsgi_req->var_cnt].iov_len)) { - wsgi_req->remote_user = ptrbuf; - wsgi_req->remote_user_len = strsize; - } - else if (!uwsgi_strncmp("UWSGI_SCHEME", 12, wsgi_req->hvec[wsgi_req->var_cnt].iov_base, wsgi_req->hvec[wsgi_req->var_cnt].iov_len)) { - wsgi_req->scheme = ptrbuf; - wsgi_req->scheme_len = strsize; - } - else if (!uwsgi_strncmp("UWSGI_SCRIPT", 12, wsgi_req->hvec[wsgi_req->var_cnt].iov_base, wsgi_req->hvec[wsgi_req->var_cnt].iov_len)) { - wsgi_req->script = ptrbuf; - wsgi_req->script_len = strsize; - wsgi_req->dynamic = 1; - } - else if (!uwsgi_strncmp("UWSGI_MODULE", 12, wsgi_req->hvec[wsgi_req->var_cnt].iov_base, wsgi_req->hvec[wsgi_req->var_cnt].iov_len)) { - wsgi_req->module = ptrbuf; - wsgi_req->module_len = strsize; - wsgi_req->dynamic = 1; - } - else if (!uwsgi_strncmp("UWSGI_CALLABLE", 14, wsgi_req->hvec[wsgi_req->var_cnt].iov_base, wsgi_req->hvec[wsgi_req->var_cnt].iov_len)) { - wsgi_req->callable = ptrbuf; - wsgi_req->callable_len = strsize; - wsgi_req->dynamic = 1; - } - else if (!uwsgi_strncmp("UWSGI_PYHOME", 12, wsgi_req->hvec[wsgi_req->var_cnt].iov_base, wsgi_req->hvec[wsgi_req->var_cnt].iov_len)) { - wsgi_req->pyhome = ptrbuf; - wsgi_req->pyhome_len = strsize; - } - else if (!uwsgi_strncmp("UWSGI_CHDIR", 11, wsgi_req->hvec[wsgi_req->var_cnt].iov_base, wsgi_req->hvec[wsgi_req->var_cnt].iov_len)) { - wsgi_req->chdir = ptrbuf; - wsgi_req->chdir_len = strsize; - } - else if (!uwsgi_strncmp("UWSGI_APPID", 11, wsgi_req->hvec[wsgi_req->var_cnt].iov_base, wsgi_req->hvec[wsgi_req->var_cnt].iov_len)) { - wsgi_req->appid = ptrbuf; - wsgi_req->appid_len = strsize; - } - else if (!uwsgi_strncmp("UWSGI_FILE", 10, wsgi_req->hvec[wsgi_req->var_cnt].iov_base, wsgi_req->hvec[wsgi_req->var_cnt].iov_len)) { - wsgi_req->file = ptrbuf; - wsgi_req->file_len = strsize; - wsgi_req->dynamic = 1; - } - else if (!uwsgi_strncmp("UWSGI_POSTFILE", 14, wsgi_req->hvec[wsgi_req->var_cnt].iov_base, wsgi_req->hvec[wsgi_req->var_cnt].iov_len)) { - char *postfile = uwsgi_concat2n(ptrbuf, strsize, "", 0); - wsgi_req->async_post = fopen(postfile, "r"); - if (!wsgi_req->async_post) { - uwsgi_error_open(postfile); - } - free(postfile); - wsgi_req->body_as_file = 1; - } - else if (!uwsgi_strncmp("UWSGI_TOUCH_RELOAD", 18, wsgi_req->hvec[wsgi_req->var_cnt].iov_base, wsgi_req->hvec[wsgi_req->var_cnt].iov_len)) { - wsgi_req->touch_reload = ptrbuf; - wsgi_req->touch_reload_len = strsize; - } - else if (uwsgi.cache_max_items > 0 && !uwsgi_strncmp("UWSGI_CACHE_GET", 15, wsgi_req->hvec[wsgi_req->var_cnt].iov_base, wsgi_req->hvec[wsgi_req->var_cnt].iov_len)) { - wsgi_req->cache_get = ptrbuf; - wsgi_req->cache_get_len = strsize; - } - else if (!uwsgi_strncmp("UWSGI_SETENV", 12, wsgi_req->hvec[wsgi_req->var_cnt].iov_base, wsgi_req->hvec[wsgi_req->var_cnt].iov_len)) { - char *env_value = memchr(ptrbuf, '=', strsize); - if (env_value) { - env_value[0] = 0; - env_value = uwsgi_concat2n(env_value + 1, strsize - ((env_value + 1) - ptrbuf), "", 0); - if (setenv(ptrbuf, env_value, 1)) { - uwsgi_error("setenv()"); - } - free(env_value); + if (wsgi_req->hvec[wsgi_req->var_cnt].iov_len > UWSGI_PROTO_MIN_CHECK && + wsgi_req->hvec[wsgi_req->var_cnt].iov_len < UWSGI_PROTO_MAX_CHECK && + uwsgi.proto_hooks[wsgi_req->hvec[wsgi_req->var_cnt].iov_len]) { + if (uwsgi.proto_hooks[wsgi_req->hvec[wsgi_req->var_cnt].iov_len](wsgi_req, wsgi_req->hvec[wsgi_req->var_cnt].iov_base, ptrbuf, strsize)) { + return -1; } } - else if (!uwsgi_strncmp("SERVER_NAME", 11, wsgi_req->hvec[wsgi_req->var_cnt].iov_base, wsgi_req->hvec[wsgi_req->var_cnt].iov_len) && !wsgi_req->host_len) { - wsgi_req->host = ptrbuf; - wsgi_req->host_len = strsize; -#ifdef UWSGI_DEBUG - uwsgi_debug("SERVER_NAME=%.*s\n", wsgi_req->host_len, wsgi_req->host); -#endif - } - else if (!uwsgi_strncmp("HTTP_HOST", 9, wsgi_req->hvec[wsgi_req->var_cnt].iov_base, wsgi_req->hvec[wsgi_req->var_cnt].iov_len)) { - wsgi_req->host = ptrbuf; - wsgi_req->host_len = strsize; -#ifdef UWSGI_DEBUG - uwsgi_debug("HTTP_HOST=%.*s\n", wsgi_req->host_len, wsgi_req->host); -#endif - } - else if (!uwsgi_strncmp("HTTPS", 5, wsgi_req->hvec[wsgi_req->var_cnt].iov_base, wsgi_req->hvec[wsgi_req->var_cnt].iov_len)) { - wsgi_req->https = ptrbuf; - wsgi_req->https_len = strsize; - } - else if (!uwsgi_strncmp("HTTP_IF_MODIFIED_SINCE", 22, wsgi_req->hvec[wsgi_req->var_cnt].iov_base, wsgi_req->hvec[wsgi_req->var_cnt].iov_len)) { - wsgi_req->if_modified_since = ptrbuf; - wsgi_req->if_modified_since_len = strsize; - } - else if (!uwsgi_strncmp("HTTP_AUTHORIZATION", 18, wsgi_req->hvec[wsgi_req->var_cnt].iov_base, wsgi_req->hvec[wsgi_req->var_cnt].iov_len)) { - wsgi_req->authorization = ptrbuf; - wsgi_req->authorization_len = strsize; - } - else if (!uwsgi_strncmp("DOCUMENT_ROOT", 13, wsgi_req->hvec[wsgi_req->var_cnt].iov_base, wsgi_req->hvec[wsgi_req->var_cnt].iov_len)) { - wsgi_req->document_root = ptrbuf; - wsgi_req->document_root_len = strsize; - } - else if (uwsgi.log_x_forwarded_for && !uwsgi_strncmp("HTTP_X_FORWARDED_FOR", 20, wsgi_req->hvec[wsgi_req->var_cnt].iov_base, wsgi_req->hvec[wsgi_req->var_cnt].iov_len)) { - wsgi_req->remote_addr = ptrbuf; - wsgi_req->remote_addr_len = strsize; - } - else if (!uwsgi_strncmp("CONTENT_TYPE", 12, wsgi_req->hvec[wsgi_req->var_cnt].iov_base, wsgi_req->hvec[wsgi_req->var_cnt].iov_len)) { - wsgi_req->content_type = ptrbuf; - wsgi_req->content_type_len = strsize; - } - else if (!uwsgi_strncmp("CONTENT_LENGTH", 14, wsgi_req->hvec[wsgi_req->var_cnt].iov_base, wsgi_req->hvec[wsgi_req->var_cnt].iov_len)) { - wsgi_req->post_cl = get_content_length(ptrbuf, strsize); - if (uwsgi.limit_post) { - if (wsgi_req->post_cl > uwsgi.limit_post) { - uwsgi_log("Invalid (too big) CONTENT_LENGTH. skip.\n"); - return -1; - } - } - - } + //uwsgi_log("uwsgi %.*s = %.*s\n", wsgi_req->hvec[wsgi_req->var_cnt].iov_len, wsgi_req->hvec[wsgi_req->var_cnt].iov_base, strsize, ptrbuf); if (wsgi_req->var_cnt < uwsgi.vec_size - (4 + 1)) { wsgi_req->var_cnt++; @@ -739,7 +877,7 @@ next: char *orig_path_info = wsgi_req->path_info; int orig_path_info_len = wsgi_req->path_info_len; // if SCRIPT_NAME is not allocated, add a slot for it - if (script_name == -1) { + if (wsgi_req->script_name_pos == -1) { if (wsgi_req->var_cnt >= uwsgi.vec_size - (4 + 2)) { uwsgi_log("max vec size reached. skip this var.\n"); return -1; @@ -747,9 +885,9 @@ next: wsgi_req->hvec[wsgi_req->var_cnt].iov_base = "SCRIPT_NAME"; wsgi_req->hvec[wsgi_req->var_cnt].iov_len = 11; wsgi_req->var_cnt++; - script_name = wsgi_req->var_cnt; - wsgi_req->hvec[script_name].iov_base = ""; - wsgi_req->hvec[script_name].iov_len = 0; + wsgi_req->script_name_pos = wsgi_req->var_cnt; + wsgi_req->hvec[wsgi_req->script_name_pos].iov_base = ""; + wsgi_req->hvec[wsgi_req->script_name_pos].iov_len = 0; wsgi_req->var_cnt++; } @@ -763,8 +901,8 @@ next: wsgi_req->path_info = orig_path_info + wsgi_req->script_name_len; wsgi_req->path_info_len = orig_path_info_len - wsgi_req->script_name_len; - wsgi_req->hvec[script_name].iov_base = wsgi_req->script_name; - wsgi_req->hvec[script_name].iov_len = wsgi_req->script_name_len; + wsgi_req->hvec[wsgi_req->script_name_pos].iov_base = wsgi_req->script_name; + wsgi_req->hvec[wsgi_req->script_name_pos].iov_len = wsgi_req->script_name_len; wsgi_req->hvec[wsgi_req->path_info_pos].iov_base = wsgi_req->path_info; wsgi_req->hvec[wsgi_req->path_info_pos].iov_len = wsgi_req->path_info_len; |