@@ -187,6 +187,8 @@ static ngx_int_t ngx_http_auth_jwt_handler(ngx_http_request_t *r)
187
187
ngx_int_t uri_variable_hash ;
188
188
ngx_http_variable_value_t * request_uri_var ;
189
189
ngx_str_t uri ;
190
+ ngx_str_t uri_escaped ;
191
+ uintptr_t escaped_len ;
190
192
191
193
loginlen = jwtcf -> auth_jwt_loginurl .len ;
192
194
@@ -197,7 +199,7 @@ static ngx_int_t ngx_http_auth_jwt_handler(ngx_http_request_t *r)
197
199
uri_variable_hash = ngx_hash_key (uri_variable_name .data , uri_variable_name .len );
198
200
request_uri_var = ngx_http_get_variable (r , & uri_variable_name , uri_variable_hash );
199
201
200
- // get the uri
202
+ // get the URI
201
203
if (request_uri_var && !request_uri_var -> not_found && request_uri_var -> valid )
202
204
{
203
205
// ideally we would like the uri with the querystring parameters
@@ -211,7 +213,13 @@ static ngx_int_t ngx_http_auth_jwt_handler(ngx_http_request_t *r)
211
213
uri = r -> uri ;
212
214
}
213
215
214
- r -> headers_out .___location -> value .len = loginlen + sizeof ("?return_url=" ) - 1 + strlen (scheme ) + sizeof ("://" ) - 1 + server .len + uri .len ;
216
+ // escape the URI
217
+ escaped_len = ngx_escape_uri (NULL , uri .data , uri .len , NGX_ESCAPE_URI );
218
+ uri_escaped .data = ngx_palloc (r -> pool , escaped_len );
219
+ uri_escaped .len = escaped_len ;
220
+ ngx_escape_uri (uri_escaped .data , uri .data , uri .len , NGX_ESCAPE_URI );
221
+
222
+ r -> headers_out .___location -> value .len = loginlen + sizeof ("?return_url=" ) - 1 + strlen (scheme ) + sizeof ("://" ) - 1 + server .len + url_escaped .len ;
215
223
return_url = ngx_alloc (r -> headers_out .___location -> value .len , r -> connection -> log );
216
224
ngx_memcpy (return_url , jwtcf -> auth_jwt_loginurl .data , jwtcf -> auth_jwt_loginurl .len );
217
225
int return_url_idx = jwtcf -> auth_jwt_loginurl .len ;
@@ -223,8 +231,8 @@ static ngx_int_t ngx_http_auth_jwt_handler(ngx_http_request_t *r)
223
231
return_url_idx += sizeof ("://" ) - 1 ;
224
232
ngx_memcpy (return_url + return_url_idx , server .data , server .len );
225
233
return_url_idx += server .len ;
226
- ngx_memcpy (return_url + return_url_idx , uri .data , uri .len );
227
- return_url_idx += uri .len ;
234
+ ngx_memcpy (return_url + return_url_idx , url_escaped .data , url_escaped .len );
235
+ return_url_idx += url_escaped .len ;
228
236
r -> headers_out .___location -> value .data = (u_char * )return_url ;
229
237
230
238
ngx_log_error (NGX_LOG_ERR , r -> connection -> log , 0 , "redirect for get request" );
0 commit comments