1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.eclipse.jetty.server;
20
21 import java.net.InetSocketAddress;
22
23 import javax.servlet.ServletRequest;
24
25 import org.eclipse.jetty.http.HttpFields;
26 import org.eclipse.jetty.http.HttpHeader;
27 import org.eclipse.jetty.http.HttpScheme;
28 import org.eclipse.jetty.server.HttpConfiguration.Customizer;
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49 public class ForwardedRequestCustomizer implements Customizer
50 {
51 private String _hostHeader;
52 private String _forwardedHostHeader = HttpHeader.X_FORWARDED_HOST.toString();
53 private String _forwardedServerHeader = HttpHeader.X_FORWARDED_SERVER.toString();
54 private String _forwardedForHeader = HttpHeader.X_FORWARDED_FOR.toString();
55 private String _forwardedProtoHeader = HttpHeader.X_FORWARDED_PROTO.toString();
56 private String _forwardedCipherSuiteHeader;
57 private String _forwardedSslSessionIdHeader;
58
59
60
61 public String getHostHeader()
62 {
63 return _hostHeader;
64 }
65
66
67
68
69
70
71
72
73 public void setHostHeader(String hostHeader)
74 {
75 _hostHeader = hostHeader;
76 }
77
78
79
80
81
82
83 public String getForwardedHostHeader()
84 {
85 return _forwardedHostHeader;
86 }
87
88
89
90
91
92
93 public void setForwardedHostHeader(String forwardedHostHeader)
94 {
95 _forwardedHostHeader = forwardedHostHeader;
96 }
97
98
99
100
101
102 public String getForwardedServerHeader()
103 {
104 return _forwardedServerHeader;
105 }
106
107
108
109
110
111
112 public void setForwardedServerHeader(String forwardedServerHeader)
113 {
114 _forwardedServerHeader = forwardedServerHeader;
115 }
116
117
118
119
120
121 public String getForwardedForHeader()
122 {
123 return _forwardedForHeader;
124 }
125
126
127
128
129
130
131 public void setForwardedForHeader(String forwardedRemoteAddressHeader)
132 {
133 _forwardedForHeader = forwardedRemoteAddressHeader;
134 }
135
136
137
138
139
140
141
142 public String getForwardedProtoHeader()
143 {
144 return _forwardedProtoHeader;
145 }
146
147
148
149
150
151
152
153
154 public void setForwardedProtoHeader(String forwardedProtoHeader)
155 {
156 _forwardedProtoHeader = forwardedProtoHeader;
157 }
158
159
160
161
162
163 public String getForwardedCipherSuiteHeader()
164 {
165 return _forwardedCipherSuiteHeader;
166 }
167
168
169
170
171
172
173 public void setForwardedCipherSuiteHeader(String forwardedCipherSuite)
174 {
175 _forwardedCipherSuiteHeader = forwardedCipherSuite;
176 }
177
178
179
180
181
182 public String getForwardedSslSessionIdHeader()
183 {
184 return _forwardedSslSessionIdHeader;
185 }
186
187
188
189
190
191
192 public void setForwardedSslSessionIdHeader(String forwardedSslSessionId)
193 {
194 _forwardedSslSessionIdHeader = forwardedSslSessionId;
195 }
196
197
198 @Override
199 public void customize(Connector connector, HttpConfiguration config, Request request)
200 {
201 HttpFields httpFields = request.getHttpFields();
202
203
204 if (getForwardedCipherSuiteHeader()!=null)
205 {
206 String cipher_suite=httpFields.getStringField(getForwardedCipherSuiteHeader());
207 if (cipher_suite!=null)
208 request.setAttribute("javax.servlet.request.cipher_suite",cipher_suite);
209 }
210 if (getForwardedSslSessionIdHeader()!=null)
211 {
212 String ssl_session_id=httpFields.getStringField(getForwardedSslSessionIdHeader());
213 if(ssl_session_id!=null)
214 {
215 request.setAttribute("javax.servlet.request.ssl_session_id", ssl_session_id);
216 request.setScheme(HttpScheme.HTTPS.asString());
217 }
218 }
219
220
221 String forwardedHost = getLeftMostFieldValue(httpFields,getForwardedHostHeader());
222 String forwardedServer = getLeftMostFieldValue(httpFields,getForwardedServerHeader());
223 String forwardedFor = getLeftMostFieldValue(httpFields,getForwardedForHeader());
224 String forwardedProto = getLeftMostFieldValue(httpFields,getForwardedProtoHeader());
225
226 if (_hostHeader != null)
227 {
228
229 httpFields.put(HttpHeader.HOST.toString(),_hostHeader);
230 request.setServerName(null);
231 request.setServerPort(-1);
232 request.getServerName();
233 }
234 else if (forwardedHost != null)
235 {
236
237 httpFields.put(HttpHeader.HOST.toString(),forwardedHost);
238 request.setServerName(null);
239 request.setServerPort(-1);
240 request.getServerName();
241 }
242 else if (forwardedServer != null)
243 {
244
245 request.setServerName(forwardedServer);
246 }
247
248 if (forwardedFor != null)
249 {
250 request.setRemoteAddr(new InetSocketAddress(forwardedFor,request.getRemotePort()));
251 }
252
253 if (forwardedProto != null)
254 {
255 request.setScheme(forwardedProto);
256 if (forwardedProto.equals(config.getSecureScheme()))
257 request.setSecure(true);
258 }
259 }
260
261
262 protected String getLeftMostFieldValue(HttpFields fields, String header)
263 {
264 if (header == null)
265 return null;
266
267 String headerValue = fields.getStringField(header);
268
269 if (headerValue == null)
270 return null;
271
272 int commaIndex = headerValue.indexOf(',');
273
274 if (commaIndex == -1)
275 {
276
277 return headerValue;
278 }
279
280
281 return headerValue.substring(0,commaIndex);
282 }
283
284
285
286 @Override
287 public String toString()
288 {
289 return String.format("%s@%x",this.getClass().getSimpleName(),hashCode());
290 }
291 }