From: Ryan Bloom Date: Wed, 6 Jun 2001 21:28:20 +0000 (+0000) Subject: Make mod_echo use filters for all communication with clients. X-Git-Tag: 2.0.19~135 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f4fb42920951d9bc7b2ec480d618112834a1d92a;p=thirdparty%2Fapache%2Fhttpd.git Make mod_echo use filters for all communication with clients. Submitted by: Ryan Morgan git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@89279 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index cbce958d046..1f060b87ab7 100644 --- a/CHANGES +++ b/CHANGES @@ -1,4 +1,8 @@ Changes with Apache 2.0.19-dev + + *) Modify mod_echo to make it use filters for input and output. + [Ryan Morgan ] + *) Extend mod_headers to support conditional driven Header add, append and set. Use SetEnvIf to set an envar and conditionally add/append/set headers based on this envar thusly: diff --git a/modules/echo/mod_echo.c b/modules/echo/mod_echo.c index f1821232130..ee3ca35f112 100644 --- a/modules/echo/mod_echo.c +++ b/modules/echo/mod_echo.c @@ -62,6 +62,8 @@ #include "http_config.h" #include "http_connection.h" +#include "apr_buckets.h" +#include "util_filter.h" AP_DECLARE_DATA module echo_module; typedef struct { @@ -88,26 +90,32 @@ static const char *echo_on(cmd_parms *cmd, void *dummy, int arg) static int process_echo_connection(conn_rec *c) { - char buf[1024]; + apr_bucket_brigade *bb; + apr_bucket *b; + apr_status_t rv; + int zero = 0; EchoConfig *pConfig = ap_get_module_config(c->base_server->module_config, &echo_module); if (!pConfig->bEnabled) { return DECLINED; } + + bb = apr_brigade_create(c->pool); for ( ; ; ) { - apr_ssize_t r, w; - r = sizeof(buf); - apr_recv(c->client_socket, buf, &r); - if (r <= 0) { + /* Get a single line of input from the client */ + if ((rv = ap_get_brigade(c->input_filters, bb, + AP_MODE_BLOCKING, &zero) != APR_SUCCESS || + APR_BRIGADE_EMPTY(bb))) { + apr_brigade_destroy(bb); break; } - w = r; - apr_send(c->client_socket, buf, &w); - if (w != r) { - break; - } + + /* Make sure the data is flushed to the client */ + b = apr_bucket_flush_create(); + APR_BRIGADE_INSERT_TAIL(bb, b); + ap_pass_brigade(c->output_filters, bb); } return OK; }