X-Git-Url: https://granicus.if.org/sourcecode?a=blobdiff_plain;f=server%2Futil_script.c;h=b6d361222c5ab93be9cdb7f0104fcc9a3850bb12;hb=690c6105f9e66cb3a8a8b03344f64b2cf00d83e9;hp=ff00962b7687520b6ed230f3fe79dd9e90386efa;hpb=2b494140a556f42c10c838223709b9193daed8a6;p=apache diff --git a/server/util_script.c b/server/util_script.c index ff00962b76..b6d361222c 100644 --- a/server/util_script.c +++ b/server/util_script.c @@ -49,12 +49,13 @@ * where there don't have to be). */ -#define MALFORMED_MESSAGE "malformed header from script. Bad header=" -#define MALFORMED_HEADER_LENGTH_TO_SHOW 30 +/* we know core's module_index is 0 */ +#undef APLOG_MODULE_INDEX +#define APLOG_MODULE_INDEX AP_CORE_MODULE_INDEX -static char *http2env(apr_pool_t *a, const char *w) +static char *http2env(request_rec *r, const char *w) { - char *res = (char *)apr_palloc(a, sizeof("HTTP_") + strlen(w)); + char *res = (char *)apr_palloc(r->pool, sizeof("HTTP_") + strlen(w)); char *cp = res; char c; @@ -65,11 +66,18 @@ static char *http2env(apr_pool_t *a, const char *w) *cp++ = '_'; while ((c = *w++) != 0) { - if (!apr_isalnum(c)) { + if (apr_isalnum(c)) { + *cp++ = apr_toupper(c); + } + else if (c == '-') { *cp++ = '_'; } else { - *cp++ = apr_toupper(c); + if (APLOGrtrace1(r)) + ap_log_rerror(APLOG_MARK, APLOG_TRACE1, 0, r, + "Not exporting header with invalid name as envvar: %s", + ap_escape_logitem(r->pool, w)); + return NULL; } } *cp = 0; @@ -77,6 +85,18 @@ static char *http2env(apr_pool_t *a, const char *w) return res; } +static void add_unless_null(apr_table_t *table, const char *name, const char *val) +{ + if (name && val) { + apr_table_addn(table, name, val); + } +} + +static void env2env(apr_table_t *table, const char *name) +{ + add_unless_null(table, name, getenv(name)); +} + AP_DECLARE(char **) ap_create_environment(apr_pool_t *p, apr_table_t *t) { const apr_array_header_t *env_arr = apr_table_elts(t); @@ -103,7 +123,11 @@ AP_DECLARE(char **) ap_create_environment(apr_pool_t *p, apr_table_t *t) *whack++ = '_'; } while (*whack != '=') { - if (!apr_isalnum(*whack) && *whack != '_') { +#ifdef WIN32 + if (!apr_isalnum(*whack) && *whack != '(' && *whack != ')') { +#else + if (!apr_isalnum(*whack)) { +#endif *whack = '_'; } ++whack; @@ -120,16 +144,14 @@ AP_DECLARE(void) ap_add_common_vars(request_rec *r) apr_table_t *e; server_rec *s = r->server; conn_rec *c = r->connection; - const char *rem_logname; - char *env_path; -#if defined(WIN32) || defined(OS2) || defined(BEOS) - char *env_temp; -#endif - const char *host; + core_dir_config *conf = + (core_dir_config *)ap_get_core_module_config(r->per_dir_config); + const char *env_temp; const apr_array_header_t *hdrs_arr = apr_table_elts(r->headers_in); const apr_table_entry_t *hdrs = (const apr_table_entry_t *) hdrs_arr->elts; int i; apr_port_t rport; + char *q; /* use a temporary apr_table_t which we'll overlap onto * r->subprocess_env later @@ -158,10 +180,10 @@ AP_DECLARE(void) ap_add_common_vars(request_rec *r) * for no particular reason. */ - if (!strcasecmp(hdrs[i].key, "Content-type")) { + if (!ap_casecmpstr(hdrs[i].key, "Content-type")) { apr_table_addn(e, "CONTENT_TYPE", hdrs[i].val); } - else if (!strcasecmp(hdrs[i].key, "Content-length")) { + else if (!ap_casecmpstr(hdrs[i].key, "Content-length")) { apr_table_addn(e, "CONTENT_LENGTH", hdrs[i].val); } /* @@ -170,74 +192,75 @@ AP_DECLARE(void) ap_add_common_vars(request_rec *r) * in the environment with "ps -e". But, if you must... */ #ifndef SECURITY_HOLE_PASS_AUTHORIZATION - else if (!strcasecmp(hdrs[i].key, "Authorization") - || !strcasecmp(hdrs[i].key, "Proxy-Authorization")) { - continue; + else if (!ap_casecmpstr(hdrs[i].key, "Authorization") + || !ap_casecmpstr(hdrs[i].key, "Proxy-Authorization")) { + if (conf->cgi_pass_auth == AP_CGI_PASS_AUTH_ON) { + add_unless_null(e, http2env(r, hdrs[i].key), hdrs[i].val); + } } #endif - else { - apr_table_addn(e, http2env(r->pool, hdrs[i].key), hdrs[i].val); - } - } - - if (!(env_path = getenv("PATH"))) { - env_path = DEFAULT_PATH; - } - apr_table_addn(e, "PATH", apr_pstrdup(r->pool, env_path)); - -#ifdef WIN32 - if (env_temp = getenv("SystemRoot")) { - apr_table_addn(e, "SystemRoot", env_temp); - } - if (env_temp = getenv("COMSPEC")) { - apr_table_addn(e, "COMSPEC", env_temp); - } - if (env_temp = getenv("PATHEXT")) { - apr_table_addn(e, "PATHEXT", env_temp); - } - if (env_temp = getenv("WINDIR")) { - apr_table_addn(e, "WINDIR", env_temp); - } -#endif - -#ifdef OS2 - if ((env_temp = getenv("COMSPEC")) != NULL) { - apr_table_addn(e, "COMSPEC", env_temp); - } - if ((env_temp = getenv("ETC")) != NULL) { - apr_table_addn(e, "ETC", env_temp); - } - if ((env_temp = getenv("DPATH")) != NULL) { - apr_table_addn(e, "DPATH", env_temp); - } - if ((env_temp = getenv("PERLLIB_PREFIX")) != NULL) { - apr_table_addn(e, "PERLLIB_PREFIX", env_temp); - } -#endif - -#ifdef BEOS - if ((env_temp = getenv("LIBRARY_PATH")) != NULL) { - apr_table_addn(e, "LIBRARY_PATH", env_temp); - } + else + add_unless_null(e, http2env(r, hdrs[i].key), hdrs[i].val); + } + + env_temp = apr_table_get(r->subprocess_env, "PATH"); + if (env_temp == NULL) { + env_temp = getenv("PATH"); + } + if (env_temp == NULL) { + env_temp = DEFAULT_PATH; + } + apr_table_addn(e, "PATH", apr_pstrdup(r->pool, env_temp)); + +#if defined(WIN32) + env2env(e, "SystemRoot"); + env2env(e, "COMSPEC"); + env2env(e, "PATHEXT"); + env2env(e, "WINDIR"); +#elif defined(OS2) + env2env(e, "COMSPEC"); + env2env(e, "ETC"); + env2env(e, "DPATH"); + env2env(e, "PERLLIB_PREFIX"); +#elif defined(BEOS) + env2env(e, "LIBRARY_PATH"); +#elif defined(DARWIN) + env2env(e, "DYLD_LIBRARY_PATH"); +#elif defined(_AIX) + env2env(e, "LIBPATH"); +#elif defined(__HPUX__) + /* HPUX PARISC 2.0W knows both, otherwise redundancy is harmless */ + env2env(e, "SHLIB_PATH"); + env2env(e, "LD_LIBRARY_PATH"); +#else /* Some Unix */ + env2env(e, "LD_LIBRARY_PATH"); #endif apr_table_addn(e, "SERVER_SIGNATURE", ap_psignature("", r)); apr_table_addn(e, "SERVER_SOFTWARE", ap_get_server_banner()); apr_table_addn(e, "SERVER_NAME", - ap_escape_html(r->pool, ap_get_server_name(r))); + ap_escape_html(r->pool, ap_get_server_name_for_url(r))); apr_table_addn(e, "SERVER_ADDR", r->connection->local_ip); /* Apache */ apr_table_addn(e, "SERVER_PORT", apr_psprintf(r->pool, "%u", ap_get_server_port(r))); - host = ap_get_remote_host(c, r->per_dir_config, REMOTE_HOST, NULL); - if (host) { - apr_table_addn(e, "REMOTE_HOST", host); - } - apr_table_addn(e, "REMOTE_ADDR", c->remote_ip); + add_unless_null(e, "REMOTE_HOST", + ap_get_useragent_host(r, REMOTE_HOST, NULL)); + apr_table_addn(e, "REMOTE_ADDR", r->useragent_ip); apr_table_addn(e, "DOCUMENT_ROOT", ap_document_root(r)); /* Apache */ + apr_table_setn(e, "REQUEST_SCHEME", ap_http_scheme(r)); + apr_table_addn(e, "CONTEXT_PREFIX", ap_context_prefix(r)); + apr_table_addn(e, "CONTEXT_DOCUMENT_ROOT", ap_context_document_root(r)); apr_table_addn(e, "SERVER_ADMIN", s->server_admin); /* Apache */ - apr_table_addn(e, "SCRIPT_FILENAME", r->filename); /* Apache */ + if (apr_table_get(r->notes, "proxy-noquery") && (q = ap_strchr(r->filename, '?'))) { + *q = '\0'; + apr_table_addn(e, "SCRIPT_FILENAME", apr_pstrdup(r->pool, r->filename)); + *q = '?'; + } + else { + apr_table_addn(e, "SCRIPT_FILENAME", r->filename); /* Apache */ + } - rport = c->remote_addr->port; + rport = c->client_addr->port; apr_table_addn(e, "REMOTE_PORT", apr_itoa(r->pool, rport)); if (r->user) { @@ -254,27 +277,39 @@ AP_DECLARE(void) ap_add_common_vars(request_rec *r) back = back->prev; } } - if (r->ap_auth_type) { - apr_table_addn(e, "AUTH_TYPE", r->ap_auth_type); - } - rem_logname = ap_get_remote_logname(r); - if (rem_logname) { - apr_table_addn(e, "REMOTE_IDENT", apr_pstrdup(r->pool, rem_logname)); + add_unless_null(e, "AUTH_TYPE", r->ap_auth_type); + env_temp = ap_get_remote_logname(r); + if (env_temp) { + apr_table_addn(e, "REMOTE_IDENT", apr_pstrdup(r->pool, env_temp)); } /* Apache custom error responses. If we have redirected set two new vars */ if (r->prev) { - if (r->prev->args) { - apr_table_addn(e, "REDIRECT_QUERY_STRING", r->prev->args); - } - if (r->prev->uri) { - apr_table_addn(e, "REDIRECT_URL", r->prev->uri); + if (conf->qualify_redirect_url != AP_CORE_CONFIG_ON) { + add_unless_null(e, "REDIRECT_URL", r->prev->uri); + } + else { + /* PR#57785: reconstruct full URL here */ + apr_uri_t *uri = &r->prev->parsed_uri; + if (!uri->scheme) { + uri->scheme = (char*)ap_http_scheme(r->prev); + } + if (!uri->port) { + uri->port = ap_get_server_port(r->prev); + uri->port_str = apr_psprintf(r->pool, "%u", uri->port); + } + if (!uri->hostname) { + uri->hostname = (char*)ap_get_server_name_for_url(r->prev); + } + add_unless_null(e, "REDIRECT_URL", + apr_uri_unparse(r->pool, uri, 0)); } + add_unless_null(e, "REDIRECT_QUERY_STRING", r->prev->args); } if (e != r->subprocess_env) { - apr_table_overlap(r->subprocess_env, e, APR_OVERLAP_TABLES_SET); + apr_table_overlap(r->subprocess_env, e, APR_OVERLAP_TABLES_SET); } } @@ -398,10 +433,12 @@ static int set_cookie_doo_doo(void *v, const char *key, const char *val) } #define HTTP_UNSET (-HTTP_OK) +#define SCRIPT_LOG_MARK __FILE__,__LINE__,module_index -AP_DECLARE(int) ap_scan_script_header_err_core(request_rec *r, char *buffer, +AP_DECLARE(int) ap_scan_script_header_err_core_ex(request_rec *r, char *buffer, int (*getsfunc) (char *, int, void *), - void *getsfunc_data) + void *getsfunc_data, + int module_index) { char x[MAX_STRING_LEN]; char *w, *l; @@ -409,6 +446,8 @@ AP_DECLARE(int) ap_scan_script_header_err_core(request_rec *r, char *buffer, int cgi_status = HTTP_UNSET; apr_table_t *merge; apr_table_t *cookie_table; + int trace_log = APLOG_R_MODULE_IS_LEVEL(r, module_index, APLOG_TRACE1); + int first_header = 1; if (buffer) { *buffer = '\0'; @@ -429,12 +468,24 @@ AP_DECLARE(int) ap_scan_script_header_err_core(request_rec *r, char *buffer, while (1) { - if ((*getsfunc) (w, MAX_STRING_LEN - 1, getsfunc_data) == 0) { - ap_log_rerror(APLOG_MARK, APLOG_ERR|APLOG_TOCLIENT, 0, r, - "Premature end of script headers: %s", + int rv = (*getsfunc) (w, MAX_STRING_LEN - 1, getsfunc_data); + if (rv == 0) { + const char *msg = "Premature end of script headers"; + if (first_header) + msg = "End of script output before headers"; + /* Intentional no APLOGNO */ + ap_log_rerror(SCRIPT_LOG_MARK, APLOG_ERR|APLOG_TOCLIENT, 0, r, + "%s: %s", msg, apr_filepath_name_get(r->filename)); return HTTP_INTERNAL_SERVER_ERROR; } + else if (rv == -1) { + /* Intentional no APLOGNO */ + ap_log_rerror(SCRIPT_LOG_MARK, APLOG_ERR|APLOG_TOCLIENT, 0, r, + "Script timed out before returning headers: %s", + apr_filepath_name_get(r->filename)); + return HTTP_GATEWAY_TIME_OUT; + } /* Delete terminal (CR?)LF */ @@ -469,7 +520,7 @@ AP_DECLARE(int) ap_scan_script_header_err_core(request_rec *r, char *buffer, /* PR#38070: This fails because it gets confused when a * CGI Status header overrides ap_meets_conditions. - * + * * We can fix that by dropping ap_meets_conditions when * Status has been set. Since this is the only place * cgi_status gets used, let's test it explicitly. @@ -492,6 +543,14 @@ AP_DECLARE(int) ap_scan_script_header_err_core(request_rec *r, char *buffer, return cond_status; } + if (trace_log) { + if (first_header) + ap_log_rerror(SCRIPT_LOG_MARK, APLOG_TRACE4, 0, r, + "Headers from script '%s':", + apr_filepath_name_get(r->filename)); + ap_log_rerror(SCRIPT_LOG_MARK, APLOG_TRACE4, 0, r, " %s", w); + } + /* if we see a bogus header don't ignore it. Shout and scream */ #if APR_CHARSET_EBCDIC @@ -511,8 +570,9 @@ AP_DECLARE(int) ap_scan_script_header_err_core(request_rec *r, char *buffer, ++maybeASCII; } if (maybeASCII > maybeEBCDIC) { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server, - "CGI Interface Error: Script headers apparently ASCII: (CGI = %s)", + ap_log_error(SCRIPT_LOG_MARK, APLOG_ERR, 0, r->server, + APLOGNO(02660) "CGI Interface Error: " + "Script headers apparently ASCII: (CGI = %s)", r->filename); inbytes_left = outbytes_left = cp - w; apr_xlate_conv_buffer(ap_hdrs_from_ascii, @@ -521,31 +581,26 @@ AP_DECLARE(int) ap_scan_script_header_err_core(request_rec *r, char *buffer, } #endif /*APR_CHARSET_EBCDIC*/ if (!(l = strchr(w, ':'))) { - char malformed[(sizeof MALFORMED_MESSAGE) + 1 - + MALFORMED_HEADER_LENGTH_TO_SHOW]; - - strcpy(malformed, MALFORMED_MESSAGE); - strncat(malformed, w, MALFORMED_HEADER_LENGTH_TO_SHOW); - if (!buffer) { /* Soak up all the script output - may save an outright kill */ - while ((*getsfunc) (w, MAX_STRING_LEN - 1, getsfunc_data)) { + while ((*getsfunc)(w, MAX_STRING_LEN - 1, getsfunc_data) > 0) { continue; } } - ap_log_rerror(APLOG_MARK, APLOG_ERR|APLOG_TOCLIENT, 0, r, - "%s: %s", malformed, - apr_filepath_name_get(r->filename)); + /* Intentional no APLOGNO */ + ap_log_rerror(SCRIPT_LOG_MARK, APLOG_ERR|APLOG_TOCLIENT, 0, r, + "malformed header from script '%s': Bad header: %.30s", + apr_filepath_name_get(r->filename), w); return HTTP_INTERNAL_SERVER_ERROR; } *l++ = '\0'; - while (*l && apr_isspace(*l)) { + while (apr_isspace(*l)) { ++l; } - if (!strcasecmp(w, "Content-type")) { + if (!ap_casecmpstr(w, "Content-type")) { char *tmp; /* Nuke trailing whitespace */ @@ -563,44 +618,64 @@ AP_DECLARE(int) ap_scan_script_header_err_core(request_rec *r, char *buffer, * If the script returned a specific status, that's what * we'll use - otherwise we assume 200 OK. */ - else if (!strcasecmp(w, "Status")) { + else if (!ap_casecmpstr(w, "Status")) { r->status = cgi_status = atoi(l); + if (!ap_is_HTTP_VALID_RESPONSE(cgi_status)) + /* Intentional no APLOGNO */ + ap_log_rerror(SCRIPT_LOG_MARK, APLOG_ERR|APLOG_TOCLIENT, 0, r, + "Invalid status line from script '%s': %.30s", + apr_filepath_name_get(r->filename), l); + else + if (APLOGrtrace1(r)) + ap_log_rerror(SCRIPT_LOG_MARK, APLOG_TRACE1, 0, r, + "Status line from script '%s': %.30s", + apr_filepath_name_get(r->filename), l); r->status_line = apr_pstrdup(r->pool, l); } - else if (!strcasecmp(w, "Location")) { + else if (!ap_casecmpstr(w, "Location")) { apr_table_set(r->headers_out, w, l); } - else if (!strcasecmp(w, "Content-Length")) { + else if (!ap_casecmpstr(w, "Content-Length")) { apr_table_set(r->headers_out, w, l); } - else if (!strcasecmp(w, "Content-Range")) { + else if (!ap_casecmpstr(w, "Content-Range")) { apr_table_set(r->headers_out, w, l); } - else if (!strcasecmp(w, "Transfer-Encoding")) { + else if (!ap_casecmpstr(w, "Transfer-Encoding")) { apr_table_set(r->headers_out, w, l); } - else if (!strcasecmp(w, "ETag")) { + else if (!ap_casecmpstr(w, "ETag")) { apr_table_set(r->headers_out, w, l); } /* * If the script gave us a Last-Modified header, we can't just * pass it on blindly because of restrictions on future values. */ - else if (!strcasecmp(w, "Last-Modified")) { + else if (!ap_casecmpstr(w, "Last-Modified")) { ap_update_mtime(r, apr_date_parse_http(l)); ap_set_last_modified(r); } - else if (!strcasecmp(w, "Set-Cookie")) { + else if (!ap_casecmpstr(w, "Set-Cookie")) { apr_table_add(cookie_table, w, l); } else { apr_table_add(merge, w, l); } + first_header = 0; } - + /* never reached - we leave this function within the while loop above */ return OK; } +AP_DECLARE(int) ap_scan_script_header_err_core(request_rec *r, char *buffer, + int (*getsfunc) (char *, int, void *), + void *getsfunc_data) +{ + return ap_scan_script_header_err_core_ex(r, buffer, getsfunc, + getsfunc_data, + APLOG_MODULE_INDEX); +} + static int getsfunc_FILE(char *buf, int len, void *f) { return apr_file_gets(buf, len, (apr_file_t *) f) == APR_SUCCESS; @@ -609,9 +684,18 @@ static int getsfunc_FILE(char *buf, int len, void *f) AP_DECLARE(int) ap_scan_script_header_err(request_rec *r, apr_file_t *f, char *buffer) { - return ap_scan_script_header_err_core(r, buffer, getsfunc_FILE, f); + return ap_scan_script_header_err_core_ex(r, buffer, getsfunc_FILE, f, + APLOG_MODULE_INDEX); +} + +AP_DECLARE(int) ap_scan_script_header_err_ex(request_rec *r, apr_file_t *f, + char *buffer, int module_index) +{ + return ap_scan_script_header_err_core_ex(r, buffer, getsfunc_FILE, f, + module_index); } + static int getsfunc_BRIGADE(char *buf, int len, void *arg) { apr_bucket_brigade *bb = (apr_bucket_brigade *)arg; @@ -621,7 +705,8 @@ static int getsfunc_BRIGADE(char *buf, int len, void *arg) apr_status_t rv; int done = 0; - while ((dst < dst_end) && !done && !APR_BUCKET_IS_EOS(e)) { + while ((dst < dst_end) && !done && e != APR_BRIGADE_SENTINEL(bb) + && !APR_BUCKET_IS_EOS(e)) { const char *bucket_data; apr_size_t bucket_data_len; const char *src; @@ -631,7 +716,8 @@ static int getsfunc_BRIGADE(char *buf, int len, void *arg) rv = apr_bucket_read(e, &bucket_data, &bucket_data_len, APR_BLOCK_READ); if (rv != APR_SUCCESS || (bucket_data_len == 0)) { - return 0; + *dst = '\0'; + return APR_STATUS_IS_TIMEUP(rv) ? -1 : 0; } src = bucket_data; src_end = bucket_data + bucket_data_len; @@ -649,21 +735,31 @@ static int getsfunc_BRIGADE(char *buf, int len, void *arg) apr_bucket_split(e, src - bucket_data); } next = APR_BUCKET_NEXT(e); - APR_BUCKET_REMOVE(e); - apr_bucket_destroy(e); + apr_bucket_delete(e); e = next; } *dst = 0; - return 1; + return done; } AP_DECLARE(int) ap_scan_script_header_err_brigade(request_rec *r, apr_bucket_brigade *bb, char *buffer) { - return ap_scan_script_header_err_core(r, buffer, getsfunc_BRIGADE, bb); + return ap_scan_script_header_err_core_ex(r, buffer, getsfunc_BRIGADE, bb, + APLOG_MODULE_INDEX); } +AP_DECLARE(int) ap_scan_script_header_err_brigade_ex(request_rec *r, + apr_bucket_brigade *bb, + char *buffer, + int module_index) +{ + return ap_scan_script_header_err_core_ex(r, buffer, getsfunc_BRIGADE, bb, + module_index); +} + + struct vastrs { va_list args; int arg; @@ -676,8 +772,10 @@ static int getsfunc_STRING(char *w, int len, void *pvastrs) const char *p; int t; - if (!strs->curpos || !*strs->curpos) + if (!strs->curpos || !*strs->curpos) { + w[0] = '\0'; return 0; + } p = ap_strchr_c(strs->curpos, '\n'); if (p) ++p; @@ -702,6 +800,28 @@ static int getsfunc_STRING(char *w, int len, void *pvastrs) * character is returned to **arg, **data. (The first optional arg is * counted as 0.) */ +AP_DECLARE_NONSTD(int) ap_scan_script_header_err_strs_ex(request_rec *r, + char *buffer, + int module_index, + const char **termch, + int *termarg, ...) +{ + struct vastrs strs; + int res; + + va_start(strs.args, termarg); + strs.arg = 0; + strs.curpos = va_arg(strs.args, char*); + res = ap_scan_script_header_err_core_ex(r, buffer, getsfunc_STRING, + (void *) &strs, module_index); + if (termch) + *termch = strs.curpos; + if (termarg) + *termarg = strs.arg; + va_end(strs.args); + return res; +} + AP_DECLARE_NONSTD(int) ap_scan_script_header_err_strs(request_rec *r, char *buffer, const char **termch, @@ -713,7 +833,8 @@ AP_DECLARE_NONSTD(int) ap_scan_script_header_err_strs(request_rec *r, va_start(strs.args, termarg); strs.arg = 0; strs.curpos = va_arg(strs.args, char*); - res = ap_scan_script_header_err_core(r, buffer, getsfunc_STRING, (void *) &strs); + res = ap_scan_script_header_err_core_ex(r, buffer, getsfunc_STRING, + (void *) &strs, APLOG_MODULE_INDEX); if (termch) *termch = strs.curpos; if (termarg) @@ -722,7 +843,6 @@ AP_DECLARE_NONSTD(int) ap_scan_script_header_err_strs(request_rec *r, return res; } - static void argstr_to_table(char *str, apr_table_t *parms) { @@ -733,7 +853,7 @@ argstr_to_table(char *str, apr_table_t *parms) if (str == NULL) { return; } - + key = apr_strtok(str, "&", &strtok_state); while (key) { value = strchr(key, '='); @@ -747,10 +867,6 @@ argstr_to_table(char *str, apr_table_t *parms) ap_unescape_url(key); ap_unescape_url(value); apr_table_set(parms, key, value); - /* - ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, - "Found query arg: %s = %s", key, value); - */ key = apr_strtok(NULL, "&", &strtok_state); } } @@ -761,78 +877,3 @@ AP_DECLARE(void) ap_args_to_table(request_rec *r, apr_table_t **table) argstr_to_table(apr_pstrdup(r->pool, r->args), t); *table = t; } - -AP_DECLARE(apr_status_t) ap_body_to_table(request_rec *r, apr_table_t **table) -{ - apr_bucket_brigade *bb; - apr_bucket_brigade *tmpbb; - apr_status_t rv = APR_SUCCESS; - - if (r->body_table) { - *table = r->body_table; - return APR_SUCCESS; - } - - *table = NULL; - - bb = apr_brigade_create(r->pool, r->connection->bucket_alloc); - tmpbb = apr_brigade_create(r->pool, r->connection->bucket_alloc); - - do { - apr_off_t len; - - rv = ap_get_brigade(r->input_filters, tmpbb, AP_MODE_READBYTES, - APR_BLOCK_READ, AP_IOBUFSIZE); - if (rv) { - break; - } - - rv = apr_brigade_length(tmpbb, 1, &len); - if (rv) { - break; - } - - if (len == 0) { - break; - } - - APR_BRIGADE_CONCAT(bb, tmpbb); - } while(1); - - if (!rv) { - r->body_table = apr_table_make(r->pool, 10); - - if (!APR_BRIGADE_EMPTY(bb)) { - char *buffer; - apr_off_t len; - apr_pool_t *tpool; - - apr_pool_create(&tpool, r->pool); - - rv = apr_brigade_length(bb, 1, &len); - - if (!rv) { - apr_size_t total; - buffer = apr_palloc(tpool, len+1); - - total = len+1; - - rv = apr_brigade_flatten(bb, buffer, &total); - - buffer[total] = '\0'; - - argstr_to_table(buffer, r->body_table); - } - apr_pool_destroy(tpool); - } - } - - apr_brigade_destroy(bb); - apr_brigade_destroy(tmpbb); - - *table = r->body_table; - - return rv; -} - -