Repository navigation
Expand file tree
/
Copy pathurlreplacefilter.c
More file actions
129 lines (109 loc) · 3.8 KB
/
Copy pathurlreplacefilter.c
File metadata and controls
129 lines (109 loc) · 3.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#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"
#include <ctype.h>
static const char s_szurlReplaceFilterName[]="urlReplaceFilter";
module AP_MODULE_DECLARE_DATA urlReplace_filter_module;
typedef struct
{
int bEnabled;
const char *src_path;
const char *desc_path;
} urlReplaceFilterConfig;
static void *urlReplaceFilterCreateServerConfig(apr_pool_t *p,server_rec *s)
{
urlReplaceFilterConfig *pConfig=apr_pcalloc(p,sizeof *pConfig);
pConfig->bEnabled=0;
return pConfig;
}
static void urlReplaceFilterInsertFilter(request_rec *r)
{
urlReplaceFilterConfig *pConfig=ap_get_module_config(r->server->module_config,
&urlReplace_filter_module);
if (!pConfig->bEnabled)
return;
ap_add_output_filter(s_szurlReplaceFilterName,NULL,r,r->connection);
}
static apr_status_t urlReplaceFilterOutFilter(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);
}
apr_brigade_cleanup(pbbIn);
return ap_pass_brigade(f->next,pbbOut);
}
static const char *urlReplaceFilterEnable(cmd_parms *cmd, void *dummy, int arg)
{
urlReplaceFilterConfig *pConfig=ap_get_module_config(cmd->server->module_config,
&urlReplace_filter_module);
pConfig->bEnabled=arg;
return NULL;
}
static const char *set_src_path(cmd_parms *cmd,void *mconfig,const char *arg)
{
urlReplaceFilterConfig *pConfig=ap_get_module_config(cmd->server->module_config,&urlReplace_filter_module);
pConfig->src_path = apr_pstrdup(cmd->pool, arg);
return NULL;
}
static const char *set_desc_path(cmd_parms *cmd,void *mconfig,const char *arg)
{
urlReplaceFilterConfig *pConfig=ap_get_module_config(cmd->server->module_config,&urlReplace_filter_module);
pConfig->desc_path = apr_pstrdup(cmd->pool, arg);
return NULL;
}
static const command_rec urlReplaceFilterCmds[] =
{
AP_INIT_FLAG("urlReplaceFilter", urlReplaceFilterEnable, NULL, RSRC_CONF,
"Run a urlReplace filter on this host"),
AP_INIT_TAKE1("srcpath", set_src_path, NULL, OR_FILEINFO,"src path regex must not be null"),
AP_INIT_TAKE1("descpath", set_desc_path, NULL, OR_FILEINFO,"desc path must not be null"),
{ NULL }
};
static void urlReplaceFilterRegisterHooks(apr_pool_t *p)
{
ap_hook_insert_filter(urlReplaceFilterInsertFilter,NULL,NULL,APR_HOOK_MIDDLE);
ap_register_output_filter(s_szurlReplaceFilterName,urlReplaceFilterOutFilter,NULL,
AP_FTYPE_RESOURCE);
}
module AP_MODULE_DECLARE_DATA urlReplace_filter_module =
{
STANDARD20_MODULE_STUFF,
NULL,
NULL,
urlReplaceFilterCreateServerConfig,
NULL,
urlReplaceFilterCmds,
urlReplaceFilterRegisterHooks
};