-
-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;
- /* XXX where's our test that len fits in memory???
- * theoretically can be a large file > ram space
- */
- 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;
-}
-
-