=== modified file 'src/com/goldencode/p2j/main/WebHandler.java' --- src/com/goldencode/p2j/main/WebHandler.java 2016-04-29 13:39:33 +0000 +++ src/com/goldencode/p2j/main/WebHandler.java 2017-03-02 11:50:53 +0000 @@ -32,6 +32,8 @@ package com.goldencode.p2j.main; import java.io.*; +import java.net.URI; +import java.net.URISyntaxException; import java.util.*; import java.util.logging.*; @@ -43,7 +45,6 @@ import org.eclipse.jetty.server.handler.*; import com.goldencode.p2j.directory.*; -import com.goldencode.p2j.security.*; import com.goldencode.p2j.security.SecurityManager; import com.goldencode.p2j.util.*; @@ -393,6 +394,28 @@ } } + private String rewriteUri(String forwardedProto, String forwardedHost, String uri) + throws URISyntaxException + { + // rewrite uri + URI uriParser = new URI(uri); + String query = uriParser.getQuery(); + String path = uriParser.getPath(); + String port = String.valueOf(uriParser.getPort()); + String proto = uriParser.getScheme(); + if (forwardedProto != null && !forwardedProto.isEmpty()) + { + proto = forwardedProto; + } + StringBuilder buffer = new StringBuilder(proto.length() + 3 + + forwardedHost.length() + 1 + port.length() + path.length() + 1 + + query.length()); + buffer.append(proto).append("://").append(forwardedHost).append("/"); + buffer.append(port).append(path).append("?").append(query); + //rewrite uri + return buffer.toString(); + } + /** * Handle POST request. Spawn web client and redirect the request to the embedded server. * @@ -417,6 +440,8 @@ // get referrer URL String referrer = base.getHeader(HttpHeader.REFERER.asString()); + String forwardedHost = base.getHeader(HttpHeader.X_FORWARDED_HOST.asString()); + String forwardedProto = base.getHeader(HttpHeader.X_FORWARDED_PROTO.asString()); // get form parameters; String user = base.getParameter("usr"); @@ -428,6 +453,21 @@ if (result.uri != null) { + if (forwardedHost != null && !forwardedHost.isEmpty()) + { + try + { + result.uri = rewriteUri(forwardedProto, forwardedHost, result.uri); + } + catch (URISyntaxException e) + { + LOG.logp(Level.SEVERE, + "WebHandler.handle", + "", + LogHelper.generate("Rewrite failed: X_FORWARDED_HOST=%s X_FORWARDED_PROTO=%s", + forwardedHost, forwardedProto)); + } + } String type = isGui ? "GUI" : "ChUI"; LOG.logp(Level.INFO,