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