- expand localHostName check of AbstractRemoteHandler

to pevent request is handled as proxy request 
- make domain handler not relay on included path in resolved .yacy address
pull/1/head
reger 12 years ago
parent 561ea135af
commit 6f9ed439d3

@ -25,12 +25,14 @@
package net.yacy.http; package net.yacy.http;
import java.io.IOException; import java.io.IOException;
import java.net.InetAddress;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import javax.servlet.ServletException; import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import net.yacy.cora.protocol.Domains;
import net.yacy.search.Switchboard; import net.yacy.search.Switchboard;
@ -44,33 +46,49 @@ import org.eclipse.jetty.server.handler.AbstractHandler;
*/ */
abstract public class AbstractRemoteHandler extends AbstractHandler implements Handler { abstract public class AbstractRemoteHandler extends AbstractHandler implements Handler {
protected Switchboard sb = null; protected Switchboard sb = null;
private List<String> localVirtualHostNames; // list for quick check for req to local peer
private List<String> localVirtualHostNames;
@Override
@Override protected void doStart() {
protected void doStart() { sb = Switchboard.getSwitchboard();
sb = Switchboard.getSwitchboard();
localVirtualHostNames = new LinkedList<String>(); localVirtualHostNames = new LinkedList<String>();
localVirtualHostNames.add("localpeer"); localVirtualHostNames.add("localhost");
localVirtualHostNames.add("localhost"); localVirtualHostNames.add(sb.getConfig("fileHost", "localpeer"));
}
// add some other known local host names
abstract public void handleRemote(String target, Request baseRequest, HttpServletRequest request, InetAddress localInetAddress = Domains.myPublicLocalIP();
HttpServletResponse response) throws IOException, ServletException; if (localInetAddress != null) {
if (!localVirtualHostNames.contains(localInetAddress.getHostName())) {
localVirtualHostNames.add(localInetAddress.getHostName());
}
if (!localVirtualHostNames.contains(localInetAddress.getCanonicalHostName())) {
localVirtualHostNames.add(localInetAddress.getCanonicalHostName());
}
}
localVirtualHostNames.add(sb.peers.mySeed().getIP());
}
@Override abstract public void handleRemote(String target, Request baseRequest, HttpServletRequest request,
public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException;
HttpServletResponse response) throws IOException, ServletException {
String host = request.getHeader("Host"); @Override
if(host == null) return; // no proxy request, continue processing by handlers public void handle(String target, Request baseRequest, HttpServletRequest request,
int hostSplitPos = host.indexOf(':'); HttpServletResponse response) throws IOException, ServletException {
String hostOnly = hostSplitPos<0 ? host : host.substring(0, hostSplitPos); String host = request.getHeader("Host");
if (host == null) return; // no proxy request, continue processing by handlers
if(localVirtualHostNames.contains(hostOnly)) return; // no proxy request, continue processing by handlers int hostSplitPos = host.indexOf(':');
String hostOnly = hostSplitPos < 0 ? host : host.substring(0, hostSplitPos);
handleRemote(target, baseRequest, request, response);
} if (localVirtualHostNames.contains(hostOnly)) return; // no proxy request (quick check), continue processing by handlers
if (Domains.isLocal(hostOnly, null)) return; // no proxy, continue processing by handlers
if (hostOnly.startsWith(sb.peers.myIP())) { // remote access to my external IP, continue processing by handlers
localVirtualHostNames.add(sb.peers.myIP()); // not available on init, add it now for quickcheck
return;
}
handleRemote(target, baseRequest, request, response);
}
} }

@ -41,80 +41,96 @@ import org.eclipse.jetty.server.handler.AbstractHandler;
import net.yacy.server.http.AlternativeDomainNames; import net.yacy.server.http.AlternativeDomainNames;
/**
* handling of request to virtual ".yacy" domain determines public adress from
* seedlist and forwards modified/wrapped request to it
*/
public class YacyDomainHandler extends AbstractHandler implements Handler { public class YacyDomainHandler extends AbstractHandler implements Handler {
private AlternativeDomainNames alternativeResolvers; private AlternativeDomainNames alternativeResolvers;
public void setAlternativeResolver(AlternativeDomainNames resolver) { public void setAlternativeResolver(AlternativeDomainNames resolver) {
this.alternativeResolvers = resolver; this.alternativeResolvers = resolver;
} }
@Override @Override
public void handle(String target, Request baseRequest, HttpServletRequest request, public void handle(String target, Request baseRequest, HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException { HttpServletResponse response) throws IOException, ServletException {
String host = request.getServerName(); String host = request.getServerName();
String resolved = alternativeResolvers.resolve(host); String resolved = alternativeResolvers.resolve(host);
if(resolved != null) { if (resolved != null) {
// split resolved into host, port and path // split resolved into host, port and path
int posPath = resolved.indexOf('/'); String path;
String path = resolved.substring(posPath); String hostPort;
String hostPort = resolved.substring(0, posPath); int posPath = resolved.indexOf('/');
int posPort = hostPort.lastIndexOf(':'); if (posPath >= 0) {
String newHost = hostPort.substring(0, posPort); path = resolved.substring(posPath);
int newPort = Integer.parseInt(hostPort.substring(posPort + 1)); hostPort = resolved.substring(0, posPath);
} else {
RequestDispatcher dispatcher = request.getRequestDispatcher(path + target); path = "";
dispatcher.forward(new DomainRequestWrapper(request, newHost, newPort), response); hostPort = resolved;
baseRequest.setHandled(true); }
} int posPort = hostPort.lastIndexOf(':');
} String newHost;
int newPort;
private class DomainRequestWrapper extends HttpServletRequestWrapper { if (posPort >= 0) {
newHost = hostPort.substring(0, posPort);
private String newServerName; newPort = Integer.parseInt(hostPort.substring(posPort + 1));
private int newServerPort; } else {
newHost = hostPort;
public DomainRequestWrapper(HttpServletRequest request, String serverName, int serverPort) { newPort = 80;
super(request); }
this.newServerName = serverName; RequestDispatcher dispatcher = request.getRequestDispatcher(path + target);
this.newServerPort = serverPort; dispatcher.forward(new DomainRequestWrapper(request, newHost, newPort), response);
} baseRequest.setHandled(true);
}
@Override }
public String getServerName() {
return newServerName; private class DomainRequestWrapper extends HttpServletRequestWrapper {
}
private String newServerName;
@Override private int newServerPort;
public int getServerPort() {
return newServerPort; public DomainRequestWrapper(HttpServletRequest request, String serverName, int serverPort) {
} super(request);
this.newServerName = serverName;
@Override this.newServerPort = serverPort;
public StringBuffer getRequestURL() { }
StringBuffer buf = new StringBuffer(this.getScheme() +"://"+ newServerName + ":" + newServerPort + this.getPathInfo());
return buf; @Override
} public String getServerName() {
return newServerName;
@Override }
public String getHeader(String name) {
if(name.equals("Host")) { @Override
return newServerName + (newServerPort!=80 ? ":"+newServerPort : ""); public int getServerPort() {
} return newServerPort;
return super.getHeader(name); }
}
@Override
@SuppressWarnings("unchecked") public StringBuffer getRequestURL() {
@Override StringBuffer buf = new StringBuffer(this.getScheme() + "://" + newServerName + ":" + newServerPort + this.getPathInfo());
public Enumeration<String> getHeaders(String name) { return buf;
if(name.equals("Host")) { }
Vector<String> header = new Vector<String>();
header.add(newServerName + (newServerPort!=80 ? ":"+newServerPort : "")); @Override
return header.elements(); public String getHeader(String name) {
} if (name.equals("Host")) {
return super.getHeaders(name); return newServerName + (newServerPort != 80 ? ":" + newServerPort : "");
} }
return super.getHeader(name);
} }
@SuppressWarnings("unchecked")
@Override
public Enumeration<String> getHeaders(String name) {
if (name.equals("Host")) {
Vector<String> header = new Vector<String>();
header.add(newServerName + (newServerPort != 80 ? ":" + newServerPort : ""));
return header.elements();
}
return super.getHeaders(name);
}
}
} }

Loading…
Cancel
Save