Final pass at the implementation of a reverse SPDY proxy.
This commit is contained in:
parent
8f356ea922
commit
0ac2b99f6a
|
@ -60,4 +60,45 @@
|
|||
-->
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
<!--
|
||||
<profiles>
|
||||
<profile>
|
||||
<id>proxy</id>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.mortbay.jetty</groupId>
|
||||
<artifactId>jetty-maven-plugin</artifactId>
|
||||
<version>${project.version}</version>
|
||||
<configuration>
|
||||
<stopPort>8888</stopPort>
|
||||
<stopKey>quit</stopKey>
|
||||
<jvmArgs>
|
||||
-Dlog4j.configuration=file://${basedir}/src/main/resources/log4j.properties
|
||||
-Xbootclasspath/p:${settings.localRepository}/org/mortbay/jetty/npn/npn-boot/${npn.version}/npn-boot-${npn.version}.jar
|
||||
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
|
||||
</jvmArgs>
|
||||
<jettyXml>${basedir}/src/main/config/etc/jetty-spdy-proxy.xml</jettyXml>
|
||||
<contextPath>/</contextPath>
|
||||
</configuration>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.eclipse.jetty.spdy</groupId>
|
||||
<artifactId>spdy-jetty-http</artifactId>
|
||||
<version>${project.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.slf4j</groupId>
|
||||
<artifactId>slf4j-log4j12</artifactId>
|
||||
<version>${slf4j-version}</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</profile>
|
||||
</profiles>
|
||||
-->
|
||||
|
||||
</project>
|
||||
|
|
|
@ -0,0 +1,88 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">
|
||||
|
||||
<Configure id="Server" class="org.eclipse.jetty.server.Server">
|
||||
|
||||
<New id="sslContextFactory" class="org.eclipse.jetty.util.ssl.SslContextFactory">
|
||||
<Set name="keyStorePath">src/main/resources/keystore.jks</Set>
|
||||
<Set name="keyStorePassword">storepwd</Set>
|
||||
<Set name="trustStore">src/main/resources/truststore.jks</Set>
|
||||
<Set name="trustStorePassword">storepwd</Set>
|
||||
<Set name="protocol">TLSv1</Set>
|
||||
</New>
|
||||
|
||||
<!--
|
||||
<Set class="org.eclipse.jetty.npn.NextProtoNego" name="debug" type="boolean">true</Set>
|
||||
-->
|
||||
|
||||
<!--
|
||||
This is the upstream server connector. It speaks non-SSL SPDY/2(HTTP) on port 9090.
|
||||
-->
|
||||
<Call name="addConnector">
|
||||
<Arg>
|
||||
<New class="org.eclipse.jetty.spdy.http.HTTPSPDYServerConnector">
|
||||
<Set name="Port">9090</Set>
|
||||
<Set name="defaultAsyncConnectionFactory">
|
||||
<Call name="getAsyncConnectionFactory">
|
||||
<Arg>spdy/2</Arg>
|
||||
</Call>
|
||||
</Set>
|
||||
</New>
|
||||
</Arg>
|
||||
</Call>
|
||||
|
||||
<!--
|
||||
The ProxyEngine receives SPDY/x(HTTP) requests from proxy connectors below
|
||||
and is configured to process requests for host "localhost".
|
||||
Such requests are converted from SPDY/x(HTTP) to SPDY/2(HTTP) and forwarded
|
||||
to 127.0.0.1:9090, where they are served by the upstream server above.
|
||||
-->
|
||||
<New id="proxyEngine" class="org.eclipse.jetty.spdy.proxy.SPDYProxyEngine">
|
||||
<Arg>
|
||||
<New class="org.eclipse.jetty.spdy.SPDYClient$Factory">
|
||||
<Call name="start" />
|
||||
</New>
|
||||
</Arg>
|
||||
<Set name="proxyInfos">
|
||||
<Map>
|
||||
<Entry>
|
||||
<Item>localhost</Item>
|
||||
<Item>
|
||||
<New class="org.eclipse.jetty.spdy.proxy.ProxyEngine$ProxyInfo">
|
||||
<Arg type="short">2</Arg>
|
||||
<Arg>127.0.0.1</Arg>
|
||||
<Arg type="int">9090</Arg>
|
||||
</New>
|
||||
</Item>
|
||||
</Entry>
|
||||
</Map>
|
||||
</Set>
|
||||
</New>
|
||||
|
||||
<!--
|
||||
These are the reverse proxy connectors accepting requests from clients.
|
||||
They accept non-SSL (on port 8080) and SSL (on port 8443) HTTP,
|
||||
SPDY/2(HTTP) and SPDY/3(HTTP).
|
||||
Non-SPDY HTTP requests are converted to SPDY internally and passed to the
|
||||
ProxyEngine above.
|
||||
-->
|
||||
<Call name="addConnector">
|
||||
<Arg>
|
||||
<New class="org.eclipse.jetty.spdy.proxy.HTTPSPDYProxyConnector">
|
||||
<Arg><Ref id="proxyEngine" /></Arg>
|
||||
<Set name="Port">8080</Set>
|
||||
</New>
|
||||
</Arg>
|
||||
</Call>
|
||||
<Call name="addConnector">
|
||||
<Arg>
|
||||
<New class="org.eclipse.jetty.spdy.proxy.HTTPSPDYProxyConnector">
|
||||
<Arg><Ref id="proxyEngine" /></Arg>
|
||||
<Arg><Ref id="sslContextFactory" /></Arg>
|
||||
<Set name="Port">8443</Set>
|
||||
</New>
|
||||
</Arg>
|
||||
</Call>
|
||||
|
||||
|
||||
</Configure>
|
|
@ -19,6 +19,8 @@ package org.eclipse.jetty.spdy.proxy;
|
|||
import java.net.InetAddress;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.UnknownHostException;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.ConcurrentMap;
|
||||
|
||||
|
@ -84,6 +86,17 @@ public abstract class ProxyEngine extends ServerSessionFrameListener.Adapter imp
|
|||
// TODO: add Via header
|
||||
}
|
||||
|
||||
public Map<String, ProxyInfo> getProxyInfos()
|
||||
{
|
||||
return new HashMap<>(proxyInfos);
|
||||
}
|
||||
|
||||
public void setProxyInfos(Map<String, ProxyInfo> proxyInfos)
|
||||
{
|
||||
this.proxyInfos.clear();
|
||||
this.proxyInfos.putAll(proxyInfos);
|
||||
}
|
||||
|
||||
public void putProxyInfo(String host, ProxyInfo proxyInfo)
|
||||
{
|
||||
proxyInfos.put(host, proxyInfo);
|
||||
|
|
|
@ -98,14 +98,8 @@ public class SPDYProxyEngine extends ProxyEngine
|
|||
{
|
||||
@SuppressWarnings("unchecked")
|
||||
Set<Session> sessions = (Set<Session>)serverSession.getAttribute(CLIENT_SESSIONS_ATTRIBUTE);
|
||||
for (Session session : sessions)
|
||||
{
|
||||
if (session == clientSession)
|
||||
{
|
||||
sessions.remove(session);
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (sessions.remove(clientSession))
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -207,6 +201,7 @@ public class SPDYProxyEngine extends ProxyEngine
|
|||
SPDYClient client = factory.newSPDYClient(version);
|
||||
session = client.connect(address, sessionListener).get(getConnectTimeout(), TimeUnit.MILLISECONDS);
|
||||
session.setAttribute(CLIENT_SESSIONS_ATTRIBUTE, Collections.newSetFromMap(new ConcurrentHashMap<Session, Boolean>()));
|
||||
logger.debug("Proxy session connected to {}", address);
|
||||
Session existing = serverSessions.putIfAbsent(host, session);
|
||||
if (existing != null)
|
||||
{
|
||||
|
@ -505,6 +500,7 @@ public class SPDYProxyEngine extends ProxyEngine
|
|||
@Override
|
||||
public void onGoAway(Session serverSession, GoAwayInfo goAwayInfo)
|
||||
{
|
||||
serverSessions.values().remove(serverSession);
|
||||
@SuppressWarnings("unchecked")
|
||||
Set<Session> sessions = (Set<Session>)serverSession.removeAttribute(CLIENT_SESSIONS_ATTRIBUTE);
|
||||
for (Session session : sessions)
|
||||
|
|
Loading…
Reference in New Issue