45
45
import org .apache .juli .logging .Log ;
46
46
import org .apache .juli .logging .LogFactory ;
47
47
import org .apache .tomcat .util .http .FastHttpDateFormat ;
48
+ import org .apache .tomcat .util .http .parser .Host ;
48
49
import org .apache .tomcat .util .res .StringManager ;
49
50
50
51
/**
@@ -448,6 +449,8 @@ public static class XForwardedRequest extends HttpServletRequestWrapper {
448
449
449
450
protected final Map <String , List <String >> headers ;
450
451
452
+ protected String localName ;
453
+
451
454
protected int localPort ;
452
455
453
456
protected String remoteAddr ;
@@ -458,15 +461,19 @@ public static class XForwardedRequest extends HttpServletRequestWrapper {
458
461
459
462
protected boolean secure ;
460
463
464
+ protected String serverName ;
465
+
461
466
protected int serverPort ;
462
467
463
468
public XForwardedRequest (HttpServletRequest request ) {
464
469
super (request );
470
+ this .localName = request .getLocalName ();
465
471
this .localPort = request .getLocalPort ();
466
472
this .remoteAddr = request .getRemoteAddr ();
467
473
this .remoteHost = request .getRemoteHost ();
468
474
this .scheme = request .getScheme ();
469
475
this .secure = request .isSecure ();
476
+ this .serverName = request .getServerName ();
470
477
this .serverPort = request .getServerPort ();
471
478
472
479
headers = new HashMap <>();
@@ -530,6 +537,11 @@ public int getIntHeader(String name) {
530
537
return Integer .parseInt (value );
531
538
}
532
539
540
+ @ Override
541
+ public String getLocalName () {
542
+ return localName ;
543
+ }
544
+
533
545
@ Override
534
546
public int getLocalPort () {
535
547
return localPort ;
@@ -550,6 +562,11 @@ public String getScheme() {
550
562
return scheme ;
551
563
}
552
564
565
+ @ Override
566
+ public String getServerName () {
567
+ return serverName ;
568
+ }
569
+
553
570
@ Override
554
571
public int getServerPort () {
555
572
return serverPort ;
@@ -578,6 +595,10 @@ public void setHeader(String name, String value) {
578
595
579
596
}
580
597
598
+ public void setLocalName (String localName ) {
599
+ this .localName = localName ;
600
+ }
601
+
581
602
public void setLocalPort (int localPort ) {
582
603
this .localPort = localPort ;
583
604
}
@@ -598,6 +619,10 @@ public void setSecure(boolean secure) {
598
619
this .secure = secure ;
599
620
}
600
621
622
+ public void setServerName (String serverName ) {
623
+ this .serverName = serverName ;
624
+ }
625
+
601
626
public void setServerPort (int serverPort ) {
602
627
this .serverPort = serverPort ;
603
628
}
@@ -642,8 +667,12 @@ public PushBuilder newPushBuilder() {
642
667
643
668
protected static final String PROTOCOL_HEADER_HTTPS_VALUE_PARAMETER = "protocolHeaderHttpsValue" ;
644
669
670
+ protected static final String HOST_HEADER_PARAMETER = "hostHeader" ;
671
+
645
672
protected static final String PORT_HEADER_PARAMETER = "portHeader" ;
646
673
674
+ protected static final String CHANGE_LOCAL_NAME_PARAMETER = "changeLocalName" ;
675
+
647
676
protected static final String CHANGE_LOCAL_PORT_PARAMETER = "changeLocalPort" ;
648
677
649
678
protected static final String PROXIES_HEADER_PARAMETER = "proxiesHeader" ;
@@ -716,6 +745,10 @@ protected static String listToCommaDelimitedString(List<String> stringList) {
716
745
717
746
private String protocolHeaderHttpsValue = "https" ;
718
747
748
+ private String hostHeader = null ;
749
+
750
+ private boolean changeLocalName = false ;
751
+
719
752
private String portHeader = null ;
720
753
721
754
private boolean changeLocalPort = false ;
@@ -822,17 +855,37 @@ public void doFilter(HttpServletRequest request, HttpServletResponse response, F
822
855
}
823
856
}
824
857
858
+ if (hostHeader != null ) {
859
+ String hostHeaderValue = request .getHeader (hostHeader );
860
+ if (hostHeaderValue != null ) {
861
+ try {
862
+ int portIndex = Host .parse (hostHeaderValue );
863
+ if (portIndex > -1 ) {
864
+ log .debug (sm .getString ("remoteIpFilter.invalidHostWithPort" , hostHeaderValue , hostHeader ));
865
+ hostHeaderValue = hostHeaderValue .substring (0 , portIndex );
866
+ }
867
+
868
+ xRequest .setServerName (hostHeaderValue );
869
+ if (isChangeLocalName ()) {
870
+ xRequest .setLocalName (hostHeaderValue );
871
+ }
872
+
873
+ } catch (IllegalArgumentException iae ) {
874
+ log .debug (sm .getString ("remoteIpFilter.invalidHostHeader" , hostHeaderValue , hostHeader ));
875
+ }
876
+ }
877
+ }
825
878
request .setAttribute (Globals .REQUEST_FORWARDED_ATTRIBUTE , Boolean .TRUE );
826
879
827
880
if (log .isDebugEnabled ()) {
828
- log .debug ("Incoming request " + request .getRequestURI () + " with originalRemoteAddr ' " + request .getRemoteAddr ()
829
- + "' , originalRemoteHost=' " + request .getRemoteHost () + "' , originalSecure=' " + request .isSecure ()
830
- + "' , originalScheme=' " + request .getScheme () + "', original [" + remoteIpHeader + "]='"
831
- + concatRemoteIpHeaderValue + "', original [" + protocolHeader + "]='"
832
- + ( protocolHeader == null ? null : request . getHeader ( protocolHeader )) + "' will be seen as newRemoteAddr='"
833
- + xRequest .getRemoteAddr () + "', newRemoteHost=' " + xRequest .getRemoteHost () + "', newScheme='"
834
- + xRequest . getScheme () + "', newSecure=' " + xRequest .isSecure () + "', new [" + remoteIpHeader + "]='"
835
- + xRequest . getHeader ( remoteIpHeader ) + "', new [" + proxiesHeader + "]='" + xRequest .getHeader ( proxiesHeader ) + "' " );
881
+ log .debug ("Incoming request " + request .getRequestURI () + " with originalRemoteAddr [ " + request .getRemoteAddr () +
882
+ "] , originalRemoteHost=[ " + request .getRemoteHost () + "] , originalSecure=[ " + request .isSecure () +
883
+ "] , originalScheme=[ " + request .getScheme () + "], originalServerName= [" + request . getServerName () +
884
+ "], originalServerPort= [" + request . getServerPort () +
885
+ "] will be seen as newRemoteAddr=[" + xRequest . getRemoteAddr () +
886
+ "], newRemoteHost=[" + xRequest .getRemoteHost () + "], newSecure=[ " + xRequest .isSecure () +
887
+ "], newScheme=[ " + xRequest .getScheme () + "], newServerName= [" + xRequest . getServerName () +
888
+ "], newServerPort= [" + xRequest .getServerPort ( ) + "] " );
836
889
}
837
890
if (requestAttributesEnabled ) {
838
891
request .setAttribute (AccessLog .REMOTE_ADDR_ATTRIBUTE ,
@@ -843,6 +896,8 @@ public void doFilter(HttpServletRequest request, HttpServletResponse response, F
843
896
xRequest .getRemoteHost ());
844
897
request .setAttribute (AccessLog .PROTOCOL_ATTRIBUTE ,
845
898
xRequest .getProtocol ());
899
+ request .setAttribute (AccessLog .SERVER_NAME_ATTRIBUTE ,
900
+ xRequest .getServerName ());
846
901
request .setAttribute (AccessLog .SERVER_PORT_ATTRIBUTE ,
847
902
Integer .valueOf (xRequest .getServerPort ()));
848
903
}
@@ -909,6 +964,10 @@ public void doFilter(ServletRequest request, ServletResponse response, FilterCha
909
964
}
910
965
}
911
966
967
+ public boolean isChangeLocalName () {
968
+ return changeLocalName ;
969
+ }
970
+
912
971
public boolean isChangeLocalPort () {
913
972
return changeLocalPort ;
914
973
}
@@ -968,10 +1027,18 @@ public void init() throws ServletException {
968
1027
setProtocolHeaderHttpsValue (getInitParameter (PROTOCOL_HEADER_HTTPS_VALUE_PARAMETER ));
969
1028
}
970
1029
1030
+ if (getInitParameter (HOST_HEADER_PARAMETER ) != null ) {
1031
+ setHostHeader (getInitParameter (HOST_HEADER_PARAMETER ));
1032
+ }
1033
+
971
1034
if (getInitParameter (PORT_HEADER_PARAMETER ) != null ) {
972
1035
setPortHeader (getInitParameter (PORT_HEADER_PARAMETER ));
973
1036
}
974
1037
1038
+ if (getInitParameter (CHANGE_LOCAL_NAME_PARAMETER ) != null ) {
1039
+ setChangeLocalName (Boolean .parseBoolean (getInitParameter (CHANGE_LOCAL_NAME_PARAMETER )));
1040
+ }
1041
+
975
1042
if (getInitParameter (CHANGE_LOCAL_PORT_PARAMETER ) != null ) {
976
1043
setChangeLocalPort (Boolean .parseBoolean (getInitParameter (CHANGE_LOCAL_PORT_PARAMETER )));
977
1044
}
@@ -1005,6 +1072,22 @@ public void init() throws ServletException {
1005
1072
}
1006
1073
}
1007
1074
1075
+ /**
1076
+ * <p>
1077
+ * If <code>true</code>, the return values for both {@link
1078
+ * ServletRequest#getLocalName()} and {@link ServletRequest#getServerName()}
1079
+ * will be modified by this Filter rather than just
1080
+ * {@link ServletRequest#getServerName()}.
1081
+ * </p>
1082
+ * <p>
1083
+ * Default value : <code>false</code>
1084
+ * </p>
1085
+ * @param changeLocalName The new flag value
1086
+ */
1087
+ public void setChangeLocalName (boolean changeLocalName ) {
1088
+ this .changeLocalName = changeLocalName ;
1089
+ }
1090
+
1008
1091
/**
1009
1092
* <p>
1010
1093
* If <code>true</code>, the return values for both {@link
@@ -1065,6 +1148,20 @@ public void setInternalProxies(String internalProxies) {
1065
1148
}
1066
1149
}
1067
1150
1151
+ /**
1152
+ * <p>
1153
+ * Header that holds the incoming host, usually named
1154
+ * <code>X-Forwarded-HOst</code>.
1155
+ * </p>
1156
+ * <p>
1157
+ * Default value : <code>null</code>
1158
+ * </p>
1159
+ * @param hostHeader The header name
1160
+ */
1161
+ public void setHostHeader (String hostHeader ) {
1162
+ this .hostHeader = hostHeader ;
1163
+ }
1164
+
1068
1165
/**
1069
1166
* <p>
1070
1167
* Header that holds the incoming port, usually named
0 commit comments