@@ -12356,6 +12356,7 @@ static void wsgi_drop_invalid_headers(request_rec *r)
12356
12356
}
12357
12357
12358
12358
static const char * wsgi_proxy_headers [] = {
12359
+ "HTTP_X_FORWARDED_FOR" ,
12359
12360
"HTTP_X_FORWARDED_HTTPS" ,
12360
12361
"HTTP_X_FORWARDED_PROTO" ,
12361
12362
"HTTP_X_FORWARDED_SCHEME" ,
@@ -12395,7 +12396,37 @@ static void wsgi_process_proxy_headers(request_rec *r)
12395
12396
value = apr_table_get (r -> subprocess_env , name );
12396
12397
12397
12398
if (value ) {
12398
- if (!strcmp (name , "HTTP_X_FORWARDED_PROTO" ) ||
12399
+ if (!strcmp (name , "HTTP_X_FORWARDED_FOR" )) {
12400
+ const char * end = NULL ;
12401
+
12402
+ /*
12403
+ * A potentially comma separated list where client
12404
+ * we are interested in will be listed first.
12405
+ */
12406
+
12407
+ while (* value != '\0' && apr_isspace (* value ))
12408
+ value ++ ;
12409
+
12410
+ if (* value != '\0' ) {
12411
+ end = value ;
12412
+
12413
+ while (* end != '\0' && * end != ',' )
12414
+ end ++ ;
12415
+
12416
+ /* Need to deal with trailing whitespace. */
12417
+
12418
+ while (end != value ) {
12419
+ if (!apr_isspace (* (end - 1 )))
12420
+ break ;
12421
+
12422
+ end -- ;
12423
+ }
12424
+
12425
+ apr_table_setn (r -> subprocess_env , "REMOTE_ADDR" ,
12426
+ apr_pstrndup (r -> pool , value , (end - value )));
12427
+ }
12428
+ }
12429
+ else if (!strcmp (name , "HTTP_X_FORWARDED_PROTO" ) ||
12399
12430
!strcmp (name , "HTTP_X_FORWARDED_SCHEME" ) ||
12400
12431
!strcmp (name , "HTTP_X_SCHEME" )) {
12401
12432
0 commit comments