1
2
3
4
5
6
7
8
9
10
11
12
13 package org.eclipse.jetty.rewrite.handler;
14
15 import java.io.IOException;
16 import java.util.regex.Matcher;
17
18 import javax.servlet.http.HttpServletRequest;
19 import javax.servlet.http.HttpServletResponse;
20
21 import org.eclipse.jetty.http.HttpURI;
22 import org.eclipse.jetty.server.Request;
23
24
25
26
27
28
29
30
31
32 public class RewriteRegexRule extends RegexRule implements Rule.ApplyURI
33 {
34 private String _replacement;
35 private String _query;
36 private boolean _queryGroup;
37
38
39 public RewriteRegexRule()
40 {
41 _handling = false;
42 _terminating = false;
43 }
44
45
46
47
48
49
50
51 public void setReplacement(String replacement)
52 {
53 String[] split=replacement.split("\\?",2);
54 _replacement = split[0];
55 _query=split.length==2?split[1]:null;
56 _queryGroup=_query!=null && _query.contains("$Q");
57 }
58
59
60
61
62
63
64 public String apply(String target, HttpServletRequest request, HttpServletResponse response, Matcher matcher) throws IOException
65 {
66 target=_replacement;
67 String query=_query;
68 for (int g=1;g<=matcher.groupCount();g++)
69 {
70 String group=matcher.group(g);
71 if (group==null)
72 group="";
73 else
74 group = Matcher.quoteReplacement(group);
75 target=target.replaceAll("\\$"+g,group);
76 if (query!=null)
77 query=query.replaceAll("\\$"+g,group);
78 }
79
80 if (query!=null)
81 {
82 if (_queryGroup)
83 query=query.replace("$Q",request.getQueryString()==null?"":request.getQueryString());
84 request.setAttribute("org.eclipse.jetty.rewrite.handler.RewriteRegexRule.Q",query);
85 }
86
87 return target;
88 }
89
90
91 public void applyURI(Request request, String oldTarget, String newTarget) throws IOException
92 {
93 if (_query==null)
94 {
95 request.setRequestURI(newTarget);
96 }
97 else
98 {
99 String query=(String)request.getAttribute("org.eclipse.jetty.rewrite.handler.RewriteRegexRule.Q");
100
101 if (!_queryGroup && request.getQueryString()!=null)
102 query=request.getQueryString()+"&"+query;
103 HttpURI uri=new HttpURI(newTarget+"?"+query);
104 request.setUri(uri);
105 request.setRequestURI(newTarget);
106 request.setQueryString(query);
107 }
108 }
109
110
111
112
113
114 public String toString()
115 {
116 return super.toString()+"["+_replacement+"]";
117 }
118 }