// Ben messing around...

#include "httpd.h"
#include "http_config.h"
#include "apr_general.h"
#include "util_filter.h"
#include "ap_buckets.h"
#include "http_request.h"

static const char s_szCaseFilterName[]="CaseFilter";
module case_filter_module;

typedef struct
    {
    int bEnabled;
    } CaseFilterConfig;

static void *CaseFilterCreateServerConfig(apr_pool_t *p,server_rec *s)
    {
    CaseFilterConfig *pConfig=apr_pcalloc(p,sizeof *pConfig);

    pConfig->bEnabled=0;

    return pConfig;
    }

static void CaseFilterInsertFilter(request_rec *r)
    {
    CaseFilterConfig *pConfig=ap_get_module_config(r->server->module_config,
						   &case_filter_module);

    if(!pConfig->bEnabled)
	return;

    ap_add_output_filter(s_szCaseFilterName,NULL,r,r->connection);
    }

static apr_status_t CaseFilterOutFilter(ap_filter_t *f,
					ap_bucket_brigade *pbbIn)
    {
    ap_bucket *pbktIn;
    ap_bucket_brigade *pbbOut;

    // XXX: is this the most appropriate pool?
    pbbOut=ap_brigade_create(f->r->pool);
    AP_BRIGADE_FOREACH(pbktIn,pbbIn)
	{
	const char *data;
	apr_size_t len;
	char *buf;
	apr_size_t n;
	ap_bucket *pbktOut;

	if(AP_BUCKET_IS_EOS(pbktIn))
	    {
	    // XXX: why can't I reuse pbktIn???
	    ap_bucket *pbktEOS=ap_bucket_create_eos();
	    AP_BRIGADE_INSERT_TAIL(pbbOut,pbktEOS);
	    break;
	    }

	// read
	ap_bucket_read(pbktIn,&data,&len,1);

	// write
	buf=apr_palloc(f->r->pool,len);
	for(n=0 ; n < len ; ++n)
	    buf[n]=toupper(data[n]);

	// XXX: should we use a heap bucket instead? Or a transient (in
	// which case we need a separate brigade for each bucket)?
	pbktOut=ap_bucket_create_pool(buf,len,f->r->pool);
	AP_BRIGADE_INSERT_TAIL(pbbOut,pbktOut);
	}

    // XXX: is there any advantage to passing a brigade for each bucket?
    return ap_pass_brigade(f->next,pbbOut);
    }

static const char *CaseFilterEnable(cmd_parms *cmd, void *dummy, int arg)
    {
    CaseFilterConfig *pConfig=ap_get_module_config(cmd->server->module_config,
						   &case_filter_module);
    pConfig->bEnabled=arg;

    return NULL;
    }

static const command_rec CaseFilterCmds[] = 
    {
    AP_INIT_FLAG("CaseFilter", CaseFilterEnable, NULL, RSRC_CONF,
                 "Run a case filter on this host"),
    { NULL }
    };

static void CaseFilterRegisterHooks(void)
    {
    ap_hook_insert_filter(CaseFilterInsertFilter,NULL,NULL,AP_HOOK_MIDDLE);
    ap_register_output_filter(s_szCaseFilterName,CaseFilterOutFilter,
			      AP_FTYPE_CONTENT);
    }

module case_filter_module =
{
    STANDARD20_MODULE_STUFF,
    NULL,
    NULL,
    CaseFilterCreateServerConfig,
    NULL,
    CaseFilterCmds,
    NULL,
    CaseFilterRegisterHooks
};
