diff --git a/plugins/http/http.c b/plugins/http/http.c index fe805d66..aa57b583 100644 --- a/plugins/http/http.c +++ b/plugins/http/http.c @@ -399,9 +399,9 @@ int http_parse(struct http_session *h_session, size_t http_req_len) { while (ptr < watermark) { if (*ptr == '\r') { if (ptr + 1 >= watermark) - return 0; + break; if (*(ptr + 1) != '\n') - return 0; + break; // multiline header ? if (ptr + 2 < watermark) { if (*(ptr + 2) == ' ' || *(ptr + 2) == '\t') { diff --git a/plugins/php/php_plugin.c b/plugins/php/php_plugin.c index 1d746e9c..099715e7 100644 --- a/plugins/php/php_plugin.c +++ b/plugins/php/php_plugin.c @@ -22,6 +22,7 @@ struct uwsgi_php { struct uwsgi_string_list *index; struct uwsgi_string_list *set; struct uwsgi_string_list *append_config; + struct uwsgi_string_list *vars; char *docroot; char *app; char *app_qs; @@ -50,6 +51,7 @@ struct uwsgi_option uwsgi_php_options[] = { {"php-allowed-script", required_argument, 0, "list the allowed php scripts (require absolute path)", uwsgi_opt_add_string_list, &uphp.allowed_scripts, 0}, {"php-server-software", required_argument, 0, "force php SERVER_SOFTWARE", uwsgi_opt_set_str, &uphp.server_software, 0}, {"php-app", required_argument, 0, "force the php file to run at each request", uwsgi_opt_set_str, &uphp.app, 0}, + {"php-var", required_argument, 0, "add/overwrite a CGI variable at each request", uwsgi_opt_add_string_list, &uphp.vars, 0}, {"php-app-qs", required_argument, 0, "when in app mode force QUERY_STRING to the specified value + PATH_INFO", uwsgi_opt_set_str, &uphp.app_qs, 0}, {"php-dump-config", no_argument, 0, "dump php config (if modified via --php-set or append options)", uwsgi_opt_true, &uphp.dump_config, 0}, {0, 0, 0, 0, 0, 0, 0}, @@ -309,6 +311,16 @@ static void sapi_uwsgi_register_variables(zval *track_vars_array TSRMLS_DC) php_register_variable_safe("PHP_SELF", wsgi_req->script_name, wsgi_req->script_name_len, track_vars_array TSRMLS_CC); + struct uwsgi_string_list *usl = uphp.vars; + while(usl) { + char *equal = strchr(usl->value, '='); + if (equal) { + php_register_variable_safe( estrndup(usl->value, equal-usl->value), + equal+1, strlen(equal+1), track_vars_array TSRMLS_CC); + } + usl = usl->next; + } + } @@ -663,6 +675,16 @@ int uwsgi_php_init(void) { uwsgi_log("--- end of PHP custom config ---\n"); } + // fix docroot + if (uphp.docroot) { + char *orig_docroot = uphp.docroot; + uphp.docroot = uwsgi_expand_path(uphp.docroot, strlen(uphp.docroot), NULL); + if (!uphp.docroot) { + uwsgi_log("unable to set php docroot to %s\n", orig_docroot); + exit(1); + } + } + uwsgi_sapi_module.startup(&uwsgi_sapi_module); // filling http status codes @@ -917,7 +939,6 @@ secure2: secure3: - if (wsgi_req->document_root[wsgi_req->document_root_len-1] == '/') { wsgi_req->script_name = real_filename + (wsgi_req->document_root_len-1); } diff --git a/plugins/router_rewrite/router_rewrite.c b/plugins/router_rewrite/router_rewrite.c index 46230e94..e068293d 100644 --- a/plugins/router_rewrite/router_rewrite.c +++ b/plugins/router_rewrite/router_rewrite.c @@ -5,6 +5,8 @@ extern struct uwsgi_server uwsgi; int uwsgi_routing_func_rewrite(struct wsgi_request *wsgi_req, struct uwsgi_route *ur) { + char *tmp_qs = NULL; + char **subject = (char **) (((char *)(wsgi_req))+ur->subject); uint16_t *subject_len = (uint16_t *) (((char *)(wsgi_req))+ur->subject_len); @@ -18,10 +20,21 @@ int uwsgi_routing_func_rewrite(struct wsgi_request *wsgi_req, struct uwsgi_route path_info_len = query_string - path_info; query_string++; query_string_len = strlen(query_string); - + if (wsgi_req->query_string_len > 0) { + tmp_qs = uwsgi_concat4n(query_string, query_string_len, "&", 1, wsgi_req->query_string, wsgi_req->query_string_len, "", 0); + query_string = tmp_qs; + query_string_len = strlen(query_string); + } } + // over engineering, could be requiredin the future... else { - query_string = ""; + if (wsgi_req->query_string_len > 0) { + query_string = wsgi_req->query_string; + query_string_len = wsgi_req->query_string_len; + } + else { + query_string = ""; + } } char *ptr = uwsgi_req_append(wsgi_req, "PATH_INFO", 9, path_info, path_info_len); @@ -39,12 +52,14 @@ int uwsgi_routing_func_rewrite(struct wsgi_request *wsgi_req, struct uwsgi_route wsgi_req->query_string_len = query_string_len; free(path_info); + if (tmp_qs) free(tmp_qs); if (ur->custom) return UWSGI_ROUTE_CONTINUE; return UWSGI_ROUTE_NEXT; clear: free(path_info); + if (tmp_qs) free(tmp_qs); return UWSGI_ROUTE_BREAK; }