From b0ba54040b7cedf91cb0d4881ff6783ce330acd5 Mon Sep 17 00:00:00 2001 From: Jim Jagielski Date: Wed, 20 Jan 2016 16:58:04 +0000 Subject: [PATCH] ap_expr now allows kept_body() function to grab/use response body if stored in r->kept_body git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1725755 13f79535-47bb-0310-9956-ffa450edef68 --- CHANGES | 3 +++ docs/manual/expr.xml | 2 ++ server/util_expr_eval.c | 23 +++++++++++++++++++++++ 3 files changed, 28 insertions(+) diff --git a/CHANGES b/CHANGES index 2ed95841f1..e83d781ab5 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,9 @@ -*- coding: utf-8 -*- Changes with Apache 2.5.0 + *) ap_expr: expression support for r->kept_body if it exists. + [Jim Jagielski] + *) mod_http2: bytes read/written on slave connections are reported via the optional mod_logio functions. Fixes PR 58871. diff --git a/docs/manual/expr.xml b/docs/manual/expr.xml index 257eb1d9a4..c6bb8f00a4 100644 --- a/docs/manual/expr.xml +++ b/docs/manual/expr.xml @@ -501,6 +501,8 @@ listfunction ::= listfuncname "(" word ")" Lookup operating system environment variable note Lookup request note + kept_body + Lookup response body if available in r->kept_body env Return first match of note, reqenv, osenv diff --git a/server/util_expr_eval.c b/server/util_expr_eval.c index 5a8f207ead..d3c981276f 100644 --- a/server/util_expr_eval.c +++ b/server/util_expr_eval.c @@ -1049,6 +1049,28 @@ static const char *req_table_func(ap_expr_eval_ctx_t *ctx, const void *data, return apr_table_get(t, arg); } +static const char *kb_func(ap_expr_eval_ctx_t *ctx, const void *data, + const char *arg) +{ + apr_off_t length; + apr_size_t len; + apr_status_t rv; + char *buf; + + if (!ctx->r || !ctx->r->kept_body) + return ""; + + rv = apr_brigade_length(ctx->r->kept_body, 1, &length); + len = (apr_size_t)length;; + if (rv != APR_SUCCESS || len == 0) + return ""; + + buf = apr_palloc(ctx->r->pool, len); + apr_brigade_flatten(ctx->r->kept_body, buf, &len); + buf[len-1] = '\0'; /* ensure */ + return (const char*)buf; +} + static const char *env_func(ap_expr_eval_ctx_t *ctx, const void *data, const char *arg) { @@ -1785,6 +1807,7 @@ static const struct expr_provider_single string_func_providers[] = { { unbase64_func, "unbase64", NULL, 0 }, { sha1_func, "sha1", NULL, 0 }, { md5_func, "md5", NULL, 0 }, + { kb_func, "kept_body", NULL, 0 }, #if APR_VERSION_AT_LEAST(1,6,0) { ldap_func, "ldap", NULL, 0 }, #endif -- 2.50.0