2
2
#include "http_config.h"
3
3
#include "http_log.h"
4
4
#include "http_protocol.h"
5
+ #include "http_request.h"
5
6
#include "ap_config.h"
6
7
#include "apr_network_io.h"
7
8
#include "apr_strings.h"
@@ -14,8 +15,8 @@ static char errbuf[1024];
14
15
static void redirectionio_register_hooks (apr_pool_t * p );
15
16
16
17
static void ap_headers_insert_output_filter (request_rec * r );
17
- static void ap_headers_insert_content_filters (request_rec * r , redirectionio_context * ctx );
18
18
19
+ static int redirectionio_match_handler (request_rec * r );
19
20
static int redirectionio_redirect_handler (request_rec * r );
20
21
static int redirectionio_log_handler (request_rec * r );
21
22
@@ -59,6 +60,8 @@ module AP_MODULE_DECLARE_DATA redirectionio_module = {
59
60
};
60
61
61
62
static void redirectionio_register_hooks (apr_pool_t * p ) {
63
+ ap_hook_type_checker (redirectionio_match_handler , NULL , NULL , APR_HOOK_LAST );
64
+
62
65
ap_hook_handler (redirectionio_redirect_handler , NULL , NULL , APR_HOOK_FIRST );
63
66
ap_hook_log_transaction (redirectionio_log_handler , NULL , NULL , APR_HOOK_MIDDLE );
64
67
@@ -69,98 +72,106 @@ static void redirectionio_register_hooks(apr_pool_t *p) {
69
72
ap_register_output_filter ("redirectionio_body_filter" , redirectionio_filter_body_filtering , NULL , AP_FTYPE_CONTENT_SET );
70
73
}
71
74
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 );
75
77
76
78
if (config -> enable != 1 ) {
77
- return ;
79
+ return DECLINED ;
78
80
}
79
81
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 ;
82
87
}
83
88
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 ));
86
90
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 ;
88
95
}
89
96
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 ;
92
103
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 ;
94
109
}
95
110
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 );
99
114
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 ;
103
116
}
104
117
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 ;
108
121
}
109
122
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 );
112
126
113
127
if (config -> enable != 1 ) {
114
- return DECLINED ;
128
+ return ;
115
129
}
116
130
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 ;
124
133
}
125
134
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
+ }
130
138
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
+ }
133
142
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 ) ;
136
145
}
146
+ }
137
147
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 );
141
150
151
+ // Not enabled
152
+ if (config -> enable != 1 ) {
142
153
return DECLINED ;
143
154
}
144
155
145
- redirectionio_release_connection ( conn , config , r -> pool );
156
+ redirectionio_context * ctx = ap_get_module_config ( r -> request_config , & redirectionio_module );
146
157
147
158
// No match here
148
- if (context -> status == 0 ) {
159
+ if (ctx -> status == 0 || ctx -> is_redirected == 1 ) {
149
160
return DECLINED ;
150
161
}
151
162
152
- if (context -> match_on_response_status > 0 ) {
163
+ if (ctx -> match_on_response_status > 0 ) {
153
164
return DECLINED ;
154
165
}
155
166
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 );
158
169
}
159
170
160
- r -> status = context -> status ;
161
- context -> is_redirected = 1 ;
171
+ r -> status = ctx -> status ;
172
+ ctx -> is_redirected = 1 ;
162
173
163
- return context -> status ;
174
+ return ctx -> status ;
164
175
}
165
176
166
177
static apr_status_t redirectionio_filter_match_on_response (ap_filter_t * f , apr_bucket_brigade * bb ) {
0 commit comments