JETTY-1049 Improved transparent proxy usability
git-svn-id: svn+ssh://dev.eclipse.org/svnroot/rt/org.eclipse.jetty/jetty/trunk@440 7e9141cc-0065-0410-87d8-b60c137991c4
This commit is contained in:
parent
87d35a5dfd
commit
876369b567
|
@ -2,6 +2,7 @@ jetty-7.0.0.M4-SNAPSHOT
|
||||||
+ 281059 NPE in QTP with debug on
|
+ 281059 NPE in QTP with debug on
|
||||||
+ JETTY-1042 Prevent cookie leak between shared connection
|
+ JETTY-1042 Prevent cookie leak between shared connection
|
||||||
+ JETTY-1048 Fix for large partially filtered static content
|
+ JETTY-1048 Fix for large partially filtered static content
|
||||||
|
+ JETTY-1049 Improved transparent proxy usability
|
||||||
|
|
||||||
jetty-7.0.0.M3 20 June 2009
|
jetty-7.0.0.M3 20 June 2009
|
||||||
+ fixed race with expired async listeners
|
+ fixed race with expired async listeners
|
||||||
|
|
|
@ -29,6 +29,7 @@ import javax.servlet.ServletContext;
|
||||||
import javax.servlet.ServletException;
|
import javax.servlet.ServletException;
|
||||||
import javax.servlet.ServletRequest;
|
import javax.servlet.ServletRequest;
|
||||||
import javax.servlet.ServletResponse;
|
import javax.servlet.ServletResponse;
|
||||||
|
import javax.servlet.UnavailableException;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
|
@ -46,11 +47,14 @@ import org.eclipse.jetty.util.TypeUtil;
|
||||||
import org.eclipse.jetty.util.log.Log;
|
import org.eclipse.jetty.util.log.Log;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* EXPERIMENTAL Proxy servlet.
|
* Asynchronous Proxy Servlet.
|
||||||
*
|
*
|
||||||
|
* Forward requests to another server either as a standard web proxy (as defined by
|
||||||
|
* RFC2616) or as a transparent proxy.
|
||||||
*
|
*
|
||||||
|
* This servlet needs the jetty-util and jetty-client classes to be available to
|
||||||
|
* the web application.
|
||||||
*/
|
*/
|
||||||
public class ProxyServlet implements Servlet
|
public class ProxyServlet implements Servlet
|
||||||
{
|
{
|
||||||
|
@ -118,7 +122,7 @@ public class ProxyServlet implements Servlet
|
||||||
final InputStream in=request.getInputStream();
|
final InputStream in=request.getInputStream();
|
||||||
final OutputStream out=response.getOutputStream();
|
final OutputStream out=response.getOutputStream();
|
||||||
|
|
||||||
final Continuation continuation = ContinuationSupport.getContinuation(request,response);
|
final Continuation continuation = ContinuationSupport.getContinuation(request);
|
||||||
|
|
||||||
if (!continuation.isInitial())
|
if (!continuation.isInitial())
|
||||||
response.sendError(HttpServletResponse.SC_GATEWAY_TIMEOUT); // Need better test that isInitial
|
response.sendError(HttpServletResponse.SC_GATEWAY_TIMEOUT); // Need better test that isInitial
|
||||||
|
@ -138,7 +142,6 @@ public class ProxyServlet implements Servlet
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
HttpExchange exchange = new HttpExchange()
|
HttpExchange exchange = new HttpExchange()
|
||||||
{
|
{
|
||||||
protected void onRequestCommitted() throws IOException
|
protected void onRequestCommitted() throws IOException
|
||||||
|
@ -286,8 +289,6 @@ public class ProxyServlet implements Servlet
|
||||||
{
|
{
|
||||||
String uri = request.getRequestURI();
|
String uri = request.getRequestURI();
|
||||||
|
|
||||||
context.log("CONNECT: "+uri);
|
|
||||||
|
|
||||||
String port = "";
|
String port = "";
|
||||||
String host = "";
|
String host = "";
|
||||||
|
|
||||||
|
@ -315,16 +316,13 @@ public class ProxyServlet implements Servlet
|
||||||
OutputStream out=response.getOutputStream();
|
OutputStream out=response.getOutputStream();
|
||||||
|
|
||||||
Socket socket = new Socket(inetAddress.getAddress(),inetAddress.getPort());
|
Socket socket = new Socket(inetAddress.getAddress(),inetAddress.getPort());
|
||||||
context.log("Socket: "+socket);
|
|
||||||
|
|
||||||
response.setStatus(200);
|
response.setStatus(200);
|
||||||
response.setHeader("Connection","close");
|
response.setHeader("Connection","close");
|
||||||
response.flushBuffer();
|
response.flushBuffer();
|
||||||
// TODO prevent real close!
|
// TODO prevent real close!
|
||||||
|
|
||||||
context.log("out<-in");
|
|
||||||
IO.copyThread(socket.getInputStream(),out);
|
IO.copyThread(socket.getInputStream(),out);
|
||||||
context.log("in->out");
|
|
||||||
IO.copy(in,socket.getOutputStream());
|
IO.copy(in,socket.getOutputStream());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -353,4 +351,54 @@ public class ProxyServlet implements Servlet
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transparent Proxy.
|
||||||
|
*
|
||||||
|
* This convenience extension to AsyncProxyServlet configures the servlet
|
||||||
|
* as a transparent proxy. The servlet is configured with init parameter:<ul>
|
||||||
|
* <li> ProxyTo - a URI like http://host:80/context to which the request is proxied.
|
||||||
|
* <li> Prefix - a URI prefix that is striped from the start of the forwarded URI.
|
||||||
|
* </ul>
|
||||||
|
* For example, if a request was received at /foo/bar and the ProxyTo was http://host:80/context
|
||||||
|
* and the Prefix was /foo, then the request would be proxied to http://host:80/context/bar
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static class Transparent extends ProxyServlet
|
||||||
|
{
|
||||||
|
String _prefix;
|
||||||
|
String _proxyTo;
|
||||||
|
|
||||||
|
public Transparent()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public Transparent(String prefix,String server, int port)
|
||||||
|
{
|
||||||
|
_prefix=prefix;
|
||||||
|
_proxyTo="http://"+server+":"+port;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void init(ServletConfig config) throws ServletException
|
||||||
|
{
|
||||||
|
if (config.getInitParameter("ProxyTo")!=null)
|
||||||
|
_proxyTo=config.getInitParameter("ProxyTo");
|
||||||
|
if (config.getInitParameter("Prefix")!=null)
|
||||||
|
_prefix=config.getInitParameter("Prefix");
|
||||||
|
if (_proxyTo==null)
|
||||||
|
throw new UnavailableException("No ProxyTo");
|
||||||
|
super.init(config);
|
||||||
|
config.getServletContext().log("Transparent AsyncProxyServlet @ "+(_prefix==null?"-":_prefix)+ " to "+_proxyTo);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected HttpURI proxyHttpURI(final String scheme, final String serverName, int serverPort, final String uri) throws MalformedURLException
|
||||||
|
{
|
||||||
|
if (_prefix!=null && !uri.startsWith(_prefix))
|
||||||
|
return null;
|
||||||
|
|
||||||
|
if (_prefix!=null)
|
||||||
|
return new HttpURI(_proxyTo+uri.substring(_prefix.length()));
|
||||||
|
return new HttpURI(_proxyTo+uri);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -173,6 +173,23 @@
|
||||||
<url-pattern>/chat/*</url-pattern>
|
<url-pattern>/chat/*</url-pattern>
|
||||||
</servlet-mapping>
|
</servlet-mapping>
|
||||||
|
|
||||||
|
<servlet>
|
||||||
|
<servlet-name>TransparentProxy</servlet-name>
|
||||||
|
<servlet-class>org.eclipse.jetty.servlets.ProxyServlet$Transparent</servlet-class>
|
||||||
|
<load-on-startup>1</load-on-startup>
|
||||||
|
<init-param>
|
||||||
|
<param-name>ProxyTo</param-name><param-value>http://jetty.mortbay.org/test</param-value>
|
||||||
|
</init-param>
|
||||||
|
<init-param>
|
||||||
|
<param-name>Prefix</param-name><param-value>/jetty</param-value>
|
||||||
|
</init-param>
|
||||||
|
</servlet>
|
||||||
|
|
||||||
|
<servlet-mapping>
|
||||||
|
<servlet-name>TransparentProxy</servlet-name>
|
||||||
|
<url-pattern>/jetty/*</url-pattern>
|
||||||
|
</servlet-mapping>
|
||||||
|
|
||||||
<error-page>
|
<error-page>
|
||||||
<error-code>404</error-code>
|
<error-code>404</error-code>
|
||||||
<location>/error404.html</location>
|
<location>/error404.html</location>
|
||||||
|
|
|
@ -29,7 +29,8 @@ This is a test context that serves:
|
||||||
<li>a <a href="session/">Session Dump Servlet</a></li>
|
<li>a <a href="session/">Session Dump Servlet</a></li>
|
||||||
<li>a <a href="cookie/">Cookie Dump Servlet</a></li>
|
<li>a <a href="cookie/">Cookie Dump Servlet</a></li>
|
||||||
<li>a <a href="dispatch">Dispatcher Servlet</a></li>
|
<li>a <a href="dispatch">Dispatcher Servlet</a></li>
|
||||||
<li>a <a href="cgi-bin/hello.sh">CGI script</a>(unix only)</li>
|
<li>a <a href="jetty/">Transparent Proxy</a> (to jetty.mortbay.org)</li>
|
||||||
|
<li>a <a href="cgi-bin/hello.sh">CGI script</a> (unix only)</li>
|
||||||
</ul>
|
</ul>
|
||||||
<p/>
|
<p/>
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue