日期:2014-05-16 浏览次数:21015 次
# yum install httpd-devel # yum install automake autoconf # yum install libtool # yum install ImageMagick # yum install ImageMagick-devel # yum install pcre-devel
cd /usr/local/src mkdir modtest cd modtest apxs -g -n case_filter
ls -a ./test . .. .deps Makefile case_filter.c modules.mk
#include "httpd.h"
#include "http_config.h"
#include "apr_buckets.h"
#include "apr_general.h"
#include "apr_lib.h"
#include "util_filter.h"
#include "http_request.h"
static const char s_szCaseFilterName[] = "CaseFilter";
module AP_MODULE_DECLARE_DATA 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,
apr_bucket_brigade *pbbIn) {
request_rec *r = f->r;
conn_rec *c = r->connection;
apr_bucket *pbktIn;
apr_bucket_brigade *pbbOut;
pbbOut = apr_brigade_create(r->pool, c->bucket_alloc);
for (pbktIn = APR_BRIGADE_FIRST(pbbIn);
pbktIn != APR_BRIGADE_SENTINEL(pbbIn);
pbktIn = APR_BUCKET_NEXT(pbktIn)) {
const char *data;
apr_size_t len;
char *buf;
apr_size_t n;
apr_bucket *pbktOut;
if (APR_BUCKET_IS_EOS(pbktIn)) {
apr_bucket *pbktEOS = apr_bucket_eos_create(c->bucket_alloc);
APR_BRIGADE_INSERT_TAIL(pbbOut, pbktEOS);
continue;
}
/* read */
apr_bucket_read(pbktIn, &data, &len, APR_BLOCK_READ);
/* write */
buf = apr_bucket_alloc(len, c->bucket_alloc);
for (n = 0; n < len; ++n)
buf[n] = apr_toupper(data[n]);
pbktOut = apr_bucket_heap_create(buf, len, apr_bucket_free,
c->bucket_alloc);
APR_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(apr_pool_t *p) {
ap_hook_insert_filter(CaseFilterInsertFilter, NULL, NULL, APR_HOOK_MIDDLE);
ap_register_output_filter(s_szCaseFilterName, CaseFilterOutFilter, NULL,
AP_FTYPE_RESOURCE);
}
module AP_MODULE_DECLARE_DATA case_filter_module ={
STANDARD20_MODULE_STUFF,
NULL,
NULL,
CaseFilterCreateServerConfig,
NULL,
CaseFilterCmds,
CaseFilterRegisterHooks
};
apxs -c -i mod_case_filter