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.HostPortHttpField;
26 import org.eclipse.jetty.http.HttpFields;
27 import org.eclipse.jetty.http.HttpHeader;
28 import org.eclipse.jetty.http.HttpScheme;
29 import org.eclipse.jetty.server.HttpConfiguration.Customizer;
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50 public class ForwardedRequestCustomizer implements Customizer
51 {
52 private HostPortHttpField _hostHeader;
53 private String _forwardedHostHeader = HttpHeader.X_FORWARDED_HOST.toString();
54 private String _forwardedServerHeader = HttpHeader.X_FORWARDED_SERVER.toString();
55 private String _forwardedForHeader = HttpHeader.X_FORWARDED_FOR.toString();
56 private String _forwardedProtoHeader = HttpHeader.X_FORWARDED_PROTO.toString();
57 private String _forwardedCipherSuiteHeader;
58 private String _forwardedSslSessionIdHeader;
59
60
61
62 public String getHostHeader()
63 {
64 return _hostHeader.getValue();
65 }
66
67
68
69
70
71
72
73
74 public void setHostHeader(String hostHeader)
75 {
76 _hostHeader = new HostPortHttpField(hostHeader);
77 }
78
79
80
81
82
83
84 public String getForwardedHostHeader()
85 {
86 return _forwardedHostHeader;
87 }
88
89
90
91
92
93
94 public void setForwardedHostHeader(String forwardedHostHeader)
95 {
96 _forwardedHostHeader = forwardedHostHeader;
97 }
98
99
100
101
102
103 public String getForwardedServerHeader()
104 {
105 return _forwardedServerHeader;
106 }
107
108
109
110
111
112
113 public void setForwardedServerHeader(String forwardedServerHeader)
114 {
115 _forwardedServerHeader = forwardedServerHeader;
116 }
117
118
119
120
121
122 public String getForwardedForHeader()
123 {
124 return _forwardedForHeader;
125 }
126
127
128
129
130
131
132 public void setForwardedForHeader(String forwardedRemoteAddressHeader)
133 {
134 _forwardedForHeader = forwardedRemoteAddressHeader;
135 }
136
137
138
139
140
141
142
143 public String getForwardedProtoHeader()
144 {
145 return _forwardedProtoHeader;
146 }
147
148
149
150
151
152
153
154
155 public void setForwardedProtoHeader(String forwardedProtoHeader)
156 {
157 _forwardedProtoHeader = forwardedProtoHeader;
158 }
159
160
161
162
163
164 public String getForwardedCipherSuiteHeader()
165 {
166 return _forwardedCipherSuiteHeader;
167 }
168
169
170
171
172
173
174 public void setForwardedCipherSuiteHeader(String forwardedCipherSuite)
175 {
176 _forwardedCipherSuiteHeader = forwardedCipherSuite;
177 }
178
179
180
181
182
183 public String getForwardedSslSessionIdHeader()
184 {
185 return _forwardedSslSessionIdHeader;
186 }
187
188
189
190
191
192
193 public void setForwardedSslSessionIdHeader(String forwardedSslSessionId)
194 {
195 _forwardedSslSessionIdHeader = forwardedSslSessionId;
196 }
197
198
199 @Override
200 public void customize(Connector connector, HttpConfiguration config, Request request)
201 {
202 HttpFields httpFields = request.getHttpFields();
203
204
205 if (getForwardedCipherSuiteHeader()!=null)
206 {
207 String cipher_suite=httpFields.get(getForwardedCipherSuiteHeader());
208 if (cipher_suite!=null)
209 request.setAttribute("javax.servlet.request.cipher_suite",cipher_suite);
210 }
211 if (getForwardedSslSessionIdHeader()!=null)
212 {
213 String ssl_session_id=httpFields.get(getForwardedSslSessionIdHeader());
214 if(ssl_session_id!=null)
215 {
216 request.setAttribute("javax.servlet.request.ssl_session_id", ssl_session_id);
217 request.setScheme(HttpScheme.HTTPS.asString());
218 }
219 }
220
221
222 String forwardedHost = getLeftMostFieldValue(httpFields,getForwardedHostHeader());
223 String forwardedServer = getLeftMostFieldValue(httpFields,getForwardedServerHeader());
224 String forwardedFor = getLeftMostFieldValue(httpFields,getForwardedForHeader());
225 String forwardedProto = getLeftMostFieldValue(httpFields,getForwardedProtoHeader());
226
227 if (_hostHeader != null)
228 {
229
230 httpFields.put(_hostHeader);
231 request.setAuthority(_hostHeader.getHost(),_hostHeader.getPort());
232 }
233 else if (forwardedHost != null)
234 {
235
236 HostPortHttpField auth = new HostPortHttpField(forwardedHost);
237 httpFields.put(auth);
238 request.setAuthority(auth.getHost(),auth.getPort());
239 }
240 else if (forwardedServer != null)
241 {
242
243 request.setAuthority(forwardedServer,request.getServerPort());
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.get(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 }