Skip to content

Commit 136d4de

Browse files
committed
Do the matching before inserting filters
1 parent fa11d47 commit 136d4de

File tree

1 file changed

+62
-51
lines changed

1 file changed

+62
-51
lines changed

src/mod_redirectionio.c

Lines changed: 62 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#include "http_config.h"
33
#include "http_log.h"
44
#include "http_protocol.h"
5+
#include "http_request.h"
56
#include "ap_config.h"
67
#include "apr_network_io.h"
78
#include "apr_strings.h"
@@ -14,8 +15,8 @@ static char errbuf[1024];
1415
static void redirectionio_register_hooks(apr_pool_t *p);
1516

1617
static void ap_headers_insert_output_filter(request_rec *r);
17-
static void ap_headers_insert_content_filters(request_rec *r, redirectionio_context *ctx);
1818

19+
static int redirectionio_match_handler(request_rec *r);
1920
static int redirectionio_redirect_handler(request_rec *r);
2021
static int redirectionio_log_handler(request_rec *r);
2122

@@ -59,6 +60,8 @@ module AP_MODULE_DECLARE_DATA redirectionio_module = {
5960
};
6061

6162
static void redirectionio_register_hooks(apr_pool_t *p) {
63+
ap_hook_type_checker(redirectionio_match_handler, NULL, NULL, APR_HOOK_LAST);
64+
6265
ap_hook_handler(redirectionio_redirect_handler, NULL, NULL, APR_HOOK_FIRST);
6366
ap_hook_log_transaction(redirectionio_log_handler, NULL, NULL, APR_HOOK_MIDDLE);
6467

@@ -69,98 +72,106 @@ static void redirectionio_register_hooks(apr_pool_t *p) {
6972
ap_register_output_filter("redirectionio_body_filter", redirectionio_filter_body_filtering, NULL, AP_FTYPE_CONTENT_SET);
7073
}
7174

72-
static void ap_headers_insert_output_filter(request_rec *r) {
73-
redirectionio_config *config = (redirectionio_config*) ap_get_module_config(r->per_dir_config, &redirectionio_module);
74-
redirectionio_context *ctx = ap_get_module_config(r->request_config, &redirectionio_module);
75+
static int redirectionio_match_handler(request_rec *r) {
76+
redirectionio_config *config = (redirectionio_config*) ap_get_module_config(r->per_dir_config, &redirectionio_module);
7577

7678
if (config->enable != 1) {
77-
return;
79+
return DECLINED;
7880
}
7981

80-
if (ctx == NULL) {
81-
return;
82+
// Create context
83+
redirectionio_context *ctx = ap_get_module_config(r->request_config, &redirectionio_module);
84+
85+
if (ctx != NULL) {
86+
return DECLINED;
8287
}
8388

84-
if (ctx->status == 0 || ctx->match_on_response_status == 0 || ctx->is_redirected) {
85-
ap_headers_insert_content_filters(r, ctx);
89+
ctx = apr_palloc(r->pool, sizeof(redirectionio_context));
8690

87-
return;
91+
if (ctx == NULL) {
92+
ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, "mod_redirectionio: cannot create context, skipping module");
93+
94+
return DECLINED;
8895
}
8996

90-
if (r->status != ctx->match_on_response_status) {
91-
ap_headers_insert_content_filters(r, ctx);
97+
ctx->status = 0;
98+
ctx->match_on_response_status = 0;
99+
ctx->is_redirected = 0;
100+
ctx->should_filter_body = 0;
101+
ctx->should_filter_headers = 0;
102+
ctx->body_filter_conn = NULL;
92103

93-
return;
104+
ap_set_module_config(r->request_config, &redirectionio_module, ctx);
105+
redirectionio_connection* conn = redirectionio_acquire_connection(config, r->pool);
106+
107+
if (conn == NULL) {
108+
return DECLINED;
94109
}
95110

96-
ap_add_output_filter("redirectionio_redirect_filter", ctx, r, r->connection);
97-
ap_headers_insert_content_filters(r, ctx);
98-
}
111+
// Ask for redirection
112+
if (redirectionio_protocol_match(conn, ctx, r, config->project_key) != APR_SUCCESS) {
113+
redirectionio_invalidate_connection(conn, config, r->pool);
99114

100-
static void ap_headers_insert_content_filters(request_rec *r, redirectionio_context *ctx) {
101-
if (ctx->should_filter_headers == 1) {
102-
ap_add_output_filter("redirectionio_header_filter", ctx, r, r->connection);
115+
return DECLINED;
103116
}
104117

105-
if (ctx->should_filter_body == 1) {
106-
ap_add_output_filter("redirectionio_body_filter", ctx, r, r->connection);
107-
}
118+
redirectionio_release_connection(conn, config, r->pool);
119+
120+
return APR_SUCCESS;
108121
}
109122

110-
static int redirectionio_redirect_handler(request_rec *r) {
111-
redirectionio_config *config = (redirectionio_config*) ap_get_module_config(r->per_dir_config, &redirectionio_module);
123+
static void ap_headers_insert_output_filter(request_rec *r) {
124+
redirectionio_config *config = (redirectionio_config*) ap_get_module_config(r->per_dir_config, &redirectionio_module);
125+
redirectionio_context *ctx = ap_get_module_config(r->request_config, &redirectionio_module);
112126

113127
if (config->enable != 1) {
114-
return DECLINED;
128+
return;
115129
}
116130

117-
// Create context
118-
redirectionio_context* context = apr_palloc(r->pool, sizeof(redirectionio_context));
119-
120-
if (context == NULL) {
121-
ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, "mod_redirectionio: cannot create context, skipping module");
122-
123-
return DECLINED;
131+
if (ctx == NULL) {
132+
return;
124133
}
125134

126-
context->status = 0;
127-
context->match_on_response_status = 0;
128-
context->is_redirected = 0;
129-
context->body_filter_conn = NULL;
135+
if (ctx->status != 0 && ctx->match_on_response_status != 0 && !ctx->is_redirected && r->status == ctx->match_on_response_status) {
136+
ap_add_output_filter("redirectionio_redirect_filter", ctx, r, r->connection);
137+
}
130138

131-
ap_set_module_config(r->request_config, &redirectionio_module, context);
132-
redirectionio_connection* conn = redirectionio_acquire_connection(config, r->pool);
139+
if (ctx->should_filter_headers == 1) {
140+
ap_add_output_filter("redirectionio_header_filter", ctx, r, r->connection);
141+
}
133142

134-
if (conn == NULL) {
135-
return DECLINED;
143+
if (ctx->should_filter_body == 1) {
144+
ap_add_output_filter("redirectionio_body_filter", ctx, r, r->connection);
136145
}
146+
}
137147

138-
// Ask for redirection
139-
if (redirectionio_protocol_match(conn, context, r, config->project_key) != APR_SUCCESS) {
140-
redirectionio_invalidate_connection(conn, config, r->pool);
148+
static int redirectionio_redirect_handler(request_rec *r) {
149+
redirectionio_config *config = (redirectionio_config*) ap_get_module_config(r->per_dir_config, &redirectionio_module);
141150

151+
// Not enabled
152+
if (config->enable != 1) {
142153
return DECLINED;
143154
}
144155

145-
redirectionio_release_connection(conn, config, r->pool);
156+
redirectionio_context *ctx = ap_get_module_config(r->request_config, &redirectionio_module);
146157

147158
// No match here
148-
if (context->status == 0) {
159+
if (ctx->status == 0 || ctx->is_redirected == 1) {
149160
return DECLINED;
150161
}
151162

152-
if (context->match_on_response_status > 0) {
163+
if (ctx->match_on_response_status > 0) {
153164
return DECLINED;
154165
}
155166

156-
if (context->status != 410) {
157-
apr_table_setn(r->headers_out, "Location", context->target);
167+
if (ctx->status != 410) {
168+
apr_table_setn(r->headers_out, "Location", ctx->target);
158169
}
159170

160-
r->status = context->status;
161-
context->is_redirected = 1;
171+
r->status = ctx->status;
172+
ctx->is_redirected = 1;
162173

163-
return context->status;
174+
return ctx->status;
164175
}
165176

166177
static apr_status_t redirectionio_filter_match_on_response(ap_filter_t *f, apr_bucket_brigade *bb) {

0 commit comments

Comments
 (0)