Commit 09e21568 authored by Paul Querna's avatar Paul Querna
Browse files

New API, ap_body_to_table, a very ineffeicent and bad hack to remove an apreq dependency.

parent ac22fe48
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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
+2 −0
Original line number Diff line number Diff line
@@ -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
+77 −0
Original line number Diff line number Diff line
@@ -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, '=');
@@ -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;
}