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 import java.util.regex.Matcher;
23
24 import javax.servlet.http.HttpServletRequest;
25 import javax.servlet.http.HttpServletResponse;
26
27 import org.eclipse.jetty.http.HttpStatus;
28
29
30
31
32
33
34
35
36
37
38 public class RedirectRegexRule extends RegexRule
39 {
40 protected String _replacement;
41 private int _statusCode = HttpStatus.FOUND_302;
42
43 public RedirectRegexRule()
44 {
45 _handling = true;
46 _terminating = true;
47 }
48
49
50
51
52
53
54 public void setReplacement(String replacement)
55 {
56 _replacement = replacement;
57 }
58
59
60
61
62
63
64 public void setStatusCode(int statusCode)
65 {
66 if ((300 <= statusCode) || (statusCode >= 399))
67 {
68 _statusCode = statusCode;
69 }
70 else
71 {
72 throw new IllegalArgumentException("Invalid redirect status code " + statusCode + " (must be a value between 300 and 399)");
73 }
74 }
75
76 @Override
77 protected String apply(String target, HttpServletRequest request, HttpServletResponse response, Matcher matcher)
78 throws IOException
79 {
80 target=_replacement;
81 for (int g=1;g<=matcher.groupCount();g++)
82 {
83 String group = matcher.group(g);
84 target=target.replaceAll("\\$"+g,group);
85 }
86
87 target = response.encodeRedirectURL(target);
88 response.setHeader("Location",RedirectUtil.toRedirectURL(request,target));
89 response.setStatus(_statusCode);
90 response.getOutputStream().flush();
91 response.getOutputStream().close();
92 return target;
93 }
94
95
96
97
98 @Override
99 public String toString()
100 {
101 StringBuilder str = new StringBuilder();
102 str.append(super.toString());
103 str.append('[').append(_statusCode);
104 str.append('>').append(_replacement);
105 str.append(']');
106 return str.toString();
107 }
108
109 }