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