summaryrefslogtreecommitdiffstats
path: root/debian/perl-framework/c-modules/test_pass_brigade
diff options
context:
space:
mode:
Diffstat (limited to 'debian/perl-framework/c-modules/test_pass_brigade')
-rw-r--r--debian/perl-framework/c-modules/test_pass_brigade/mod_test_pass_brigade.c88
1 files changed, 88 insertions, 0 deletions
diff --git a/debian/perl-framework/c-modules/test_pass_brigade/mod_test_pass_brigade.c b/debian/perl-framework/c-modules/test_pass_brigade/mod_test_pass_brigade.c
new file mode 100644
index 0000000..07a9fce
--- /dev/null
+++ b/debian/perl-framework/c-modules/test_pass_brigade/mod_test_pass_brigade.c
@@ -0,0 +1,88 @@
+#define HTTPD_TEST_REQUIRE_APACHE 2
+
+#if CONFIG_FOR_HTTPD_TEST
+
+<Location /test_pass_brigade>
+ SetHandler test_pass_brigade
+</Location>
+
+#endif
+
+#define APACHE_HTTPD_TEST_HANDLER test_pass_brigade_handler
+
+#include "apache_httpd_test.h"
+
+#include "apr_buckets.h"
+
+#define WANT_HTTPD_TEST_SPLIT_QS_NUMBERS
+#include "httpd_test_util.c"
+
+/*
+ * mainly for testing / researching core_output_filter buffering
+ */
+
+static int test_pass_brigade_handler(request_rec *r)
+{
+ conn_rec *c = r->connection;
+ size_t total=0, remaining=1;
+ char *buff;
+ size_t buff_size = 8192;
+ apr_bucket_brigade *bb;
+
+ if (strcmp(r->handler, "test_pass_brigade")) {
+ return DECLINED;
+ }
+ if (r->method_number != M_GET) {
+ return DECLINED;
+ }
+
+ httpd_test_split_qs_numbers(r, &buff_size, &remaining, NULL);
+
+ fprintf(stderr, "[mod_test_pass_brigade] "
+ "going to echo %" APR_SIZE_T_FMT " bytes with "
+ "buffer size=%" APR_SIZE_T_FMT "\n",
+ remaining, buff_size);
+
+ buff = malloc(buff_size);
+ memset(buff, 'a', buff_size);
+ bb = apr_brigade_create(r->pool, c->bucket_alloc);
+
+ while (total < remaining) {
+ int left = (remaining - total);
+ int len = left <= buff_size ? left : buff_size;
+ apr_bucket *bucket = apr_bucket_heap_create(buff, len, NULL,
+ c->bucket_alloc);
+ apr_status_t status;
+
+ apr_brigade_cleanup(bb);
+ APR_BRIGADE_INSERT_TAIL(bb, bucket);
+
+ status = ap_pass_brigade(r->output_filters->next, bb);
+
+ if (status != APR_SUCCESS) {
+ apr_brigade_destroy(bb);
+ ap_log_error(APLOG_MARK, APLOG_ERR|APLOG_NOERRNO,
+ status, r->server,
+ "[mod_test_pass_brigade] ap_pass_brigade failed");
+ free(buff);
+ return HTTP_INTERNAL_SERVER_ERROR;
+ }
+
+ total += len;
+
+ fprintf(stderr, "[mod_test_pass_brigade] wrote %d of %d bytes\n",
+ len, len);
+ }
+
+ apr_brigade_destroy(bb);
+ fprintf(stderr,
+ "[mod_test_pass_brigade] done writing %" APR_SIZE_T_FMT
+ " of %" APR_SIZE_T_FMT " bytes\n",
+ total, remaining);
+
+ free(buff);
+ return OK;
+}
+
+APACHE_HTTPD_TEST_MODULE(test_pass_brigade);
+