1 /* Copyright 2001-2006 The Apache Software Foundation or its licensors, as
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 #include "http_config.h"
19 #include "apr_buckets.h"
20 #include "apr_general.h"
22 #include "util_filter.h"
23 #include "http_request.h"
27 static const char s_szCaseFilterName[]="CaseFilter";
28 module AP_MODULE_DECLARE_DATA case_filter_module;
35 static void *CaseFilterCreateServerConfig(apr_pool_t *p,server_rec *s)
37 CaseFilterConfig *pConfig=apr_pcalloc(p,sizeof *pConfig);
44 static void CaseFilterInsertFilter(request_rec *r)
46 CaseFilterConfig *pConfig=ap_get_module_config(r->server->module_config,
49 if(!pConfig->bEnabled)
52 ap_add_output_filter(s_szCaseFilterName,NULL,r,r->connection);
55 static apr_status_t CaseFilterOutFilter(ap_filter_t *f,
56 apr_bucket_brigade *pbbIn)
58 request_rec *r = f->r;
59 conn_rec *c = r->connection;
61 apr_bucket_brigade *pbbOut;
63 pbbOut=apr_brigade_create(r->pool, c->bucket_alloc);
64 for (pbktIn = APR_BRIGADE_FIRST(pbbIn);
65 pbktIn != APR_BRIGADE_SENTINEL(pbbIn);
66 pbktIn = APR_BUCKET_NEXT(pbktIn))
74 if(APR_BUCKET_IS_EOS(pbktIn))
76 apr_bucket *pbktEOS=apr_bucket_eos_create(c->bucket_alloc);
77 APR_BRIGADE_INSERT_TAIL(pbbOut,pbktEOS);
82 apr_bucket_read(pbktIn,&data,&len,APR_BLOCK_READ);
85 buf = apr_bucket_alloc(len, c->bucket_alloc);
86 for(n=0 ; n < len ; ++n)
87 buf[n] = apr_toupper(data[n]);
89 pbktOut = apr_bucket_heap_create(buf, len, apr_bucket_free,
91 APR_BRIGADE_INSERT_TAIL(pbbOut,pbktOut);
94 /* XXX: is there any advantage to passing a brigade for each bucket? */
95 return ap_pass_brigade(f->next,pbbOut);
98 static const char *CaseFilterEnable(cmd_parms *cmd, void *dummy, int arg)
100 CaseFilterConfig *pConfig=ap_get_module_config(cmd->server->module_config,
101 &case_filter_module);
102 pConfig->bEnabled=arg;
107 static const command_rec CaseFilterCmds[] =
109 AP_INIT_FLAG("CaseFilter", CaseFilterEnable, NULL, RSRC_CONF,
110 "Run a case filter on this host"),
114 static void CaseFilterRegisterHooks(apr_pool_t *p)
116 ap_hook_insert_filter(CaseFilterInsertFilter,NULL,NULL,APR_HOOK_MIDDLE);
117 ap_register_output_filter(s_szCaseFilterName,CaseFilterOutFilter,NULL,
121 module AP_MODULE_DECLARE_DATA case_filter_module =
123 STANDARD20_MODULE_STUFF,
126 CaseFilterCreateServerConfig,
129 CaseFilterRegisterHooks