Commit b3bc51b6 authored by Ryan Bloom's avatar Ryan Bloom
Browse files

Make mod_echo use filters for all communication with clients.

Submitted by:	Ryan Morgan <rmorgan@covalent.net>


git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@89279 13f79535-47bb-0310-9956-ffa450edef68
parent 26c677d4
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
Changes with Apache 2.0.19-dev

  *) Modify mod_echo to make it use filters for input and output.
     [Ryan Morgan <rmorgan@covalent.net>]

  *) 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:
+18 −10
Original line number Diff line number Diff line
@@ -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,7 +90,10 @@ 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);

@@ -96,18 +101,21 @@ static int process_echo_connection(conn_rec *c)
        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) {
            break;
        }
        w = r;
	apr_send(c->client_socket, buf, &w);
	if (w != r) {
        /* 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;
        }

        /* 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;
}