• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.server.handler;
20 
21 import java.io.IOException;
22 
23 import javax.servlet.ServletException;
24 import javax.servlet.http.HttpServletRequest;
25 import javax.servlet.http.HttpServletResponse;
26 
27 import org.eclipse.jetty.http.HttpHeaders;
28 import org.eclipse.jetty.server.HandlerContainer;
29 import org.eclipse.jetty.server.Request;
30 import org.eclipse.jetty.util.URIUtil;
31 
32 /* ------------------------------------------------------------ */
33 /** Moved ContextHandler.
34  * This context can be used to replace a context that has changed
35  * location.  Requests are redirected (either to a fixed URL or to a
36  * new context base).
37  */
38 public class MovedContextHandler extends ContextHandler
39 {
40     final Redirector _redirector;
41     String _newContextURL;
42     boolean _discardPathInfo;
43     boolean _discardQuery;
44     boolean _permanent;
45     String _expires;
46 
MovedContextHandler()47     public MovedContextHandler()
48     {
49         _redirector=new Redirector();
50         setHandler(_redirector);
51         setAllowNullPathInfo(true);
52     }
53 
MovedContextHandler(HandlerContainer parent, String contextPath, String newContextURL)54     public MovedContextHandler(HandlerContainer parent, String contextPath, String newContextURL)
55     {
56         super(parent,contextPath);
57         _newContextURL=newContextURL;
58         _redirector=new Redirector();
59         setHandler(_redirector);
60     }
61 
isDiscardPathInfo()62     public boolean isDiscardPathInfo()
63     {
64         return _discardPathInfo;
65     }
66 
setDiscardPathInfo(boolean discardPathInfo)67     public void setDiscardPathInfo(boolean discardPathInfo)
68     {
69         _discardPathInfo = discardPathInfo;
70     }
71 
getNewContextURL()72     public String getNewContextURL()
73     {
74         return _newContextURL;
75     }
76 
setNewContextURL(String newContextURL)77     public void setNewContextURL(String newContextURL)
78     {
79         _newContextURL = newContextURL;
80     }
81 
isPermanent()82     public boolean isPermanent()
83     {
84         return _permanent;
85     }
86 
setPermanent(boolean permanent)87     public void setPermanent(boolean permanent)
88     {
89         _permanent = permanent;
90     }
91 
isDiscardQuery()92     public boolean isDiscardQuery()
93     {
94         return _discardQuery;
95     }
96 
setDiscardQuery(boolean discardQuery)97     public void setDiscardQuery(boolean discardQuery)
98     {
99         _discardQuery = discardQuery;
100     }
101 
102     private class Redirector extends AbstractHandler
103     {
handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response)104         public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
105         {
106             if (_newContextURL==null)
107                 return;
108 
109             String path=_newContextURL;
110             if (!_discardPathInfo && request.getPathInfo()!=null)
111                 path=URIUtil.addPaths(path, request.getPathInfo());
112 
113             StringBuilder location = URIUtil.hasScheme(path)?new StringBuilder():baseRequest.getRootURL();
114 
115             location.append(path);
116             if (!_discardQuery && request.getQueryString()!=null)
117             {
118                 location.append('?');
119                 String q=request.getQueryString();
120                 q=q.replaceAll("\r\n?&=","!");
121                 location.append(q);
122             }
123 
124             response.setHeader(HttpHeaders.LOCATION,location.toString());
125 
126             if (_expires!=null)
127                 response.setHeader(HttpHeaders.EXPIRES,_expires);
128 
129             response.setStatus(_permanent?HttpServletResponse.SC_MOVED_PERMANENTLY:HttpServletResponse.SC_FOUND);
130             response.setContentLength(0);
131             baseRequest.setHandled(true);
132         }
133 
134     }
135 
136     /* ------------------------------------------------------------ */
137     /**
138      * @return the expires header value or null if no expires header
139      */
getExpires()140     public String getExpires()
141     {
142         return _expires;
143     }
144 
145     /* ------------------------------------------------------------ */
146     /**
147      * @param expires the expires header value or null if no expires header
148      */
setExpires(String expires)149     public void setExpires(String expires)
150     {
151         _expires = expires;
152     }
153 
154 }
155