1
2
3
4
5
6
7
8
9
10
11
12
13
14 package org.eclipse.jetty.rewrite.handler;
15
16 import java.io.IOException;
17
18 import javax.servlet.http.HttpServletRequest;
19 import javax.servlet.http.HttpServletResponse;
20
21 import org.eclipse.jetty.http.PathMap;
22 import org.eclipse.jetty.server.HttpConnection;
23 import org.eclipse.jetty.server.Request;
24 import org.eclipse.jetty.util.LazyList;
25 import org.eclipse.jetty.util.log.Log;
26
27
28
29
30
31
32
33
34 public class RuleContainer extends Rule
35 {
36 protected Rule[] _rules;
37 protected boolean _handled;
38
39 protected String _originalPathAttribute;
40 protected boolean _rewriteRequestURI=true;
41 protected boolean _rewritePathInfo=true;
42
43 protected LegacyRule _legacy;
44
45
46 private LegacyRule getLegacyRule()
47 {
48 if (_legacy==null)
49 {
50 _legacy= new LegacyRule();
51 addRule(_legacy);
52 }
53 return _legacy;
54 }
55
56
57
58
59
60
61
62
63
64 public void setLegacyRule(LegacyRule legacyRule)
65 {
66 _legacy = legacyRule;
67 }
68
69
70
71
72
73
74 public Rule[] getRules()
75 {
76 return _rules;
77 }
78
79
80
81
82
83
84 public void setRules(Rule[] rules)
85 {
86 if (_legacy==null)
87 _rules = rules;
88 else
89 {
90 _rules=null;
91 addRule(_legacy);
92 if (rules!=null)
93 for (Rule rule:rules)
94 addRule(rule);
95 }
96 }
97
98
99
100
101
102
103 public void addRule(Rule rule)
104 {
105 _rules = (Rule[])LazyList.addToArray(_rules,rule,Rule.class);
106 }
107
108
109
110
111
112
113
114 public boolean isRewriteRequestURI()
115 {
116 return _rewriteRequestURI;
117 }
118
119
120
121
122
123
124 public void setRewriteRequestURI(boolean rewriteRequestURI)
125 {
126 _rewriteRequestURI=rewriteRequestURI;
127 }
128
129
130
131
132
133
134 public boolean isRewritePathInfo()
135 {
136 return _rewritePathInfo;
137 }
138
139
140
141
142
143
144 public void setRewritePathInfo(boolean rewritePathInfo)
145 {
146 _rewritePathInfo=rewritePathInfo;
147 }
148
149
150
151
152
153
154 public String getOriginalPathAttribute()
155 {
156 return _originalPathAttribute;
157 }
158
159
160
161
162
163
164 public void setOriginalPathAttribute(String originalPathAttribte)
165 {
166 _originalPathAttribute=originalPathAttribte;
167 }
168
169
170
171
172
173
174 public PathMap getRewrite()
175 {
176 return getLegacyRule().getRewrite();
177 }
178
179
180
181
182
183 public void setRewrite(PathMap rewrite)
184 {
185 getLegacyRule().setRewrite(rewrite);
186 }
187
188
189
190
191
192 public void addRewriteRule(String pattern, String prefix)
193 {
194 getLegacyRule().addRewriteRule(pattern,prefix);
195 }
196
197
198
199
200
201 public boolean isHandled()
202 {
203 return _handled;
204 }
205
206
207
208
209
210 public void setHandled(boolean handled)
211 {
212 _handled=handled;
213 }
214
215
216
217
218
219
220
221
222 @Override
223 public String matchAndApply(String target, HttpServletRequest request, HttpServletResponse response) throws IOException
224 {
225 return apply(target, request, response);
226 }
227
228
229
230
231
232
233
234 protected String apply(String target, HttpServletRequest request, HttpServletResponse response) throws IOException
235 {
236 _handled=false;
237
238 boolean original_set=_originalPathAttribute==null;
239
240 for (Rule rule : _rules)
241 {
242 String applied=rule.matchAndApply(target,request, response);
243 if (applied!=null)
244 {
245 Log.debug("applied {}",rule);
246 if (!target.equals(applied))
247 {
248 Log.debug("rewrote {} to {}",target,applied);
249 if (!original_set)
250 {
251 original_set=true;
252 request.setAttribute(_originalPathAttribute, target);
253 }
254
255 if (_rewriteRequestURI)
256 ((Request)request).setRequestURI(applied);
257
258 if (_rewritePathInfo)
259 ((Request)request).setPathInfo(applied);
260
261 target=applied;
262 }
263
264 if (rule.isHandling())
265 {
266 Log.debug("handling {}",rule);
267 _handled=true;
268 (request instanceof Request?(Request)request:HttpConnection.getCurrentConnection().getRequest()).setHandled(true);
269 }
270
271 if (rule.isTerminating())
272 {
273 Log.debug("terminating {}",rule);
274 break;
275 }
276 }
277 }
278
279 return target;
280 }
281 }