Loading include/httpd.h +1 −0 Original line number Diff line number Diff line Loading @@ -1005,6 +1005,7 @@ struct request_rec { apr_thread_mutex_t *invoke_mtx; apr_table_t *body_table; /* Things placed at the end of the record to avoid breaking binary * compatibility. It would be nice to remember to reorder the entire * record to improve 64bit alignment the next time we need to break Loading include/util_script.h +2 −0 Original line number Diff line number Diff line Loading @@ -142,6 +142,8 @@ AP_DECLARE(int) ap_scan_script_header_err_core(request_rec *r, char *buffer, AP_DECLARE(void) ap_args_to_table(request_rec *r, apr_table_t **table); AP_DECLARE(apr_status_t) ap_body_to_table(request_rec *r, apr_table_t **table); #ifdef __cplusplus } #endif Loading server/util_script.c +77 −0 Original line number Diff line number Diff line Loading @@ -730,6 +730,10 @@ argstr_to_table(apr_pool_t *p, char *str, apr_table_t *parms) char *value; char *strtok_state; if (str == NULL) { return; } key = apr_strtok(str, "&", &strtok_state); while (key) { value = strchr(key, '='); Loading Loading @@ -758,4 +762,77 @@ AP_DECLARE(void) ap_args_to_table(request_rec *r, apr_table_t **table) *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(r->pool, buffer, r->body_table); } apr_pool_destroy(tpool); } } apr_brigade_destroy(bb); apr_brigade_destroy(tmpbb); *table = r->body_table; return rv; } Loading
include/httpd.h +1 −0 Original line number Diff line number Diff line Loading @@ -1005,6 +1005,7 @@ struct request_rec { apr_thread_mutex_t *invoke_mtx; apr_table_t *body_table; /* Things placed at the end of the record to avoid breaking binary * compatibility. It would be nice to remember to reorder the entire * record to improve 64bit alignment the next time we need to break Loading
include/util_script.h +2 −0 Original line number Diff line number Diff line Loading @@ -142,6 +142,8 @@ AP_DECLARE(int) ap_scan_script_header_err_core(request_rec *r, char *buffer, AP_DECLARE(void) ap_args_to_table(request_rec *r, apr_table_t **table); AP_DECLARE(apr_status_t) ap_body_to_table(request_rec *r, apr_table_t **table); #ifdef __cplusplus } #endif Loading
server/util_script.c +77 −0 Original line number Diff line number Diff line Loading @@ -730,6 +730,10 @@ argstr_to_table(apr_pool_t *p, char *str, apr_table_t *parms) char *value; char *strtok_state; if (str == NULL) { return; } key = apr_strtok(str, "&", &strtok_state); while (key) { value = strchr(key, '='); Loading Loading @@ -758,4 +762,77 @@ AP_DECLARE(void) ap_args_to_table(request_rec *r, apr_table_t **table) *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(r->pool, buffer, r->body_table); } apr_pool_destroy(tpool); } } apr_brigade_destroy(bb); apr_brigade_destroy(tmpbb); *table = r->body_table; return rv; }