1 //
2 // ========================================================================
3 // Copyright (c) 1995-2014 Mort Bay Consulting Pty. Ltd.
4 // ------------------------------------------------------------------------
5 // All rights reserved. This program and the accompanying materials
6 // are made available under the terms of the Eclipse Public License v1.0
7 // and Apache License v2.0 which accompanies this distribution.
8 //
9 // The Eclipse Public License is available at
10 // http://www.eclipse.org/legal/epl-v10.html
11 //
12 // The Apache License v2.0 is available at
13 // http://www.opensource.org/licenses/apache2.0.php
14 //
15 // You may elect to redistribute this code under either of these licenses.
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.http.HttpURI;
27 import org.eclipse.jetty.http.PathMap;
28 import org.eclipse.jetty.server.Request;
29 import org.eclipse.jetty.util.URIUtil;
30
31 /**
32 * Rewrite the URI by replacing the matched {@link PathMap} path with a fixed string.
33 */
34 public class RewritePatternRule extends PatternRule implements Rule.ApplyURI
35 {
36 private String _replacement;
37 private String _query;
38
39 /* ------------------------------------------------------------ */
40 public RewritePatternRule()
41 {
42 _handling = false;
43 _terminating = false;
44 }
45
46 /* ------------------------------------------------------------ */
47 /**
48 * Whenever a match is found, it replaces with this value.
49 *
50 * @param replacement the replacement string.
51 */
52 public void setReplacement(String replacement)
53 {
54 String[] split = replacement.split("\\?", 2);
55 _replacement = split[0];
56 _query = split.length == 2 ? split[1] : null;
57 }
58
59 /* ------------------------------------------------------------ */
60 /*
61 * (non-Javadoc)
62 *
63 * @see org.eclipse.jetty.server.handler.rules.RuleBase#apply(javax.servlet.http.HttpServletRequest,
64 * javax.servlet.http.HttpServletResponse)
65 */
66 @Override
67 public String apply(String target, HttpServletRequest request, HttpServletResponse response) throws IOException
68 {
69 target = URIUtil.addPaths(_replacement, PathMap.pathInfo(_pattern, target));
70 return target;
71 }
72
73 /* ------------------------------------------------------------ */
74
75 /**
76 * This method will add _query to the requests's queryString and also combine it with existing queryStrings in
77 * the request. However it won't take care for duplicate. E.g. if request.getQueryString contains a parameter
78 * "param1 = true" and _query will contain "param1=false" the result will be param1=true¶m1=false.
79 * To cover this use case some more complex pattern matching is necessary. We can implement this if there's use
80 * cases.
81 *
82 * @param request
83 * @param oldTarget
84 * @param newTarget
85 * @throws IOException
86 */
87 @Override
88 public void applyURI(Request request, String oldTarget, String newTarget) throws IOException
89 {
90 if (_query == null)
91 {
92 request.setRequestURI(newTarget);
93 }
94 else
95 {
96 String queryString = request.getQueryString();
97 if (queryString != null)
98 queryString = queryString + "&" + _query;
99 else
100 queryString = _query;
101 HttpURI uri = new HttpURI(newTarget + "?" + queryString);
102 request.setUri(uri);
103 request.setRequestURI(newTarget);
104 request.setQueryString(queryString);
105 }
106 }
107
108 /* ------------------------------------------------------------ */
109 /**
110 * Returns the replacement string.
111 */
112 @Override
113 public String toString()
114 {
115 return super.toString()+"["+_replacement+"]";
116 }
117 }