@@ -962,6 +962,79 @@ public async Task AllOptionsDisabledRequestDoesntChange()
962
962
Assert . Equal ( PathString . Empty , context . Request . PathBase ) ;
963
963
}
964
964
965
+ [ Theory ]
966
+ [ InlineData ( ForwardedHeaders . XForwardedFor , false ) ]
967
+ [ InlineData ( ForwardedHeaders . XForwardedFor , true ) ]
968
+ [ InlineData ( ForwardedHeaders . XForwardedHost , false ) ]
969
+ [ InlineData ( ForwardedHeaders . XForwardedHost , true ) ]
970
+ [ InlineData ( ForwardedHeaders . XForwardedProto , false ) ]
971
+ [ InlineData ( ForwardedHeaders . XForwardedProto , true ) ]
972
+ [ InlineData ( ForwardedHeaders . XForwardedPrefix , false ) ]
973
+ [ InlineData ( ForwardedHeaders . XForwardedPrefix , true ) ]
974
+ public async Task IgnoreXForwardedHeadersFromUnknownProxy ( ForwardedHeaders forwardedHeaders , bool unknownProxy )
975
+ {
976
+ using var host = new HostBuilder ( )
977
+ . ConfigureWebHost ( webHostBuilder =>
978
+ {
979
+ webHostBuilder
980
+ . UseTestServer ( )
981
+ . Configure ( app =>
982
+ {
983
+ var options = new ForwardedHeadersOptions
984
+ {
985
+ ForwardedHeaders = forwardedHeaders
986
+ } ;
987
+ if ( ! unknownProxy )
988
+ {
989
+ var proxy = IPAddress . Parse ( "10.0.0.1" ) ;
990
+ options . KnownProxies . Add ( proxy ) ;
991
+ }
992
+ app . UseForwardedHeaders ( options ) ;
993
+ } ) ;
994
+ } ) . Build ( ) ;
995
+
996
+ await host . StartAsync ( ) ;
997
+
998
+ var server = host . GetTestServer ( ) ;
999
+
1000
+ var context = await server . SendAsync ( c =>
1001
+ {
1002
+ c . Request . Headers [ "X-Forwarded-For" ] = "11.111.111.11" ;
1003
+ c . Request . Headers [ "X-Forwarded-Host" ] = "testhost" ;
1004
+ c . Request . Headers [ "X-Forwarded-Proto" ] = "Protocol" ;
1005
+ c . Request . Headers [ "X-Forwarded-Prefix" ] = "/pathbase" ;
1006
+ c . Connection . RemoteIpAddress = IPAddress . Parse ( "10.0.0.1" ) ;
1007
+ c . Connection . RemotePort = 99 ;
1008
+ } ) ;
1009
+
1010
+ if ( unknownProxy )
1011
+ {
1012
+ Assert . Equal ( "10.0.0.1" , context . Connection . RemoteIpAddress . ToString ( ) ) ;
1013
+ Assert . Equal ( "localhost" , context . Request . Host . ToString ( ) ) ;
1014
+ Assert . Equal ( "http" , context . Request . Scheme ) ;
1015
+ Assert . Equal ( PathString . Empty , context . Request . PathBase ) ;
1016
+ }
1017
+ else
1018
+ {
1019
+ if ( forwardedHeaders . HasFlag ( ForwardedHeaders . XForwardedFor ) )
1020
+ {
1021
+ Assert . Equal ( "11.111.111.11" , context . Connection . RemoteIpAddress . ToString ( ) ) ;
1022
+ }
1023
+ if ( forwardedHeaders . HasFlag ( ForwardedHeaders . XForwardedHost ) )
1024
+ {
1025
+ Assert . Equal ( "testhost" , context . Request . Host . ToString ( ) ) ;
1026
+ }
1027
+ if ( forwardedHeaders . HasFlag ( ForwardedHeaders . XForwardedProto ) )
1028
+ {
1029
+ Assert . Equal ( "Protocol" , context . Request . Scheme ) ;
1030
+ }
1031
+ if ( forwardedHeaders . HasFlag ( ForwardedHeaders . XForwardedPrefix ) )
1032
+ {
1033
+ Assert . Equal ( "/pathbase" , context . Request . PathBase ) ;
1034
+ }
1035
+ }
1036
+ }
1037
+
965
1038
[ Fact ]
966
1039
public async Task PartiallyEnabledForwardsPartiallyChangesRequest ( )
967
1040
{
0 commit comments