- 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 11 years ago
parent 561ea135af
commit 6f9ed439d3

@ -25,12 +25,14 @@
package net.yacy.http;
import java.io.IOException;
import java.net.InetAddress;
import java.util.LinkedList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.yacy.cora.protocol.Domains;
import net.yacy.search.Switchboard;
@ -44,33 +46,49 @@ import org.eclipse.jetty.server.handler.AbstractHandler;
*/
abstract public class AbstractRemoteHandler extends AbstractHandler implements Handler {
protected Switchboard sb = null;
private List<String> localVirtualHostNames;
@Override
protected void doStart() {
sb = Switchboard.getSwitchboard();
protected Switchboard sb = null;
private List<String> localVirtualHostNames; // list for quick check for req to local peer
@Override
protected void doStart() {
sb = Switchboard.getSwitchboard();
localVirtualHostNames = new LinkedList<String>();
localVirtualHostNames.add("localpeer");
localVirtualHostNames.add("localhost");
}
abstract public void handleRemote(String target, Request baseRequest, HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException;
localVirtualHostNames = new LinkedList<String>();
localVirtualHostNames.add("localhost");
localVirtualHostNames.add(sb.getConfig("fileHost", "localpeer"));
// add some other known local host names
InetAddress localInetAddress = Domains.myPublicLocalIP();
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
public void handle(String target, Request baseRequest, HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException {
String host = request.getHeader("Host");
if(host == null) return; // no proxy request, continue processing by handlers
int hostSplitPos = host.indexOf(':');
String hostOnly = hostSplitPos<0 ? host : host.substring(0, hostSplitPos);
if(localVirtualHostNames.contains(hostOnly)) return; // no proxy request, continue processing by handlers
handleRemote(target, baseRequest, request, response);
}
abstract public void handleRemote(String target, Request baseRequest, HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException;
@Override
public void handle(String target, Request baseRequest, HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException {
String host = request.getHeader("Host");
if (host == null) return; // no proxy request, continue processing by handlers
int hostSplitPos = host.indexOf(':');
String hostOnly = hostSplitPos < 0 ? host : host.substring(0, hostSplitPos);
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;
/**
* 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 {
private AlternativeDomainNames alternativeResolvers;
public void setAlternativeResolver(AlternativeDomainNames resolver) {
this.alternativeResolvers = resolver;
}
@Override
public void handle(String target, Request baseRequest, HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException {
String host = request.getServerName();
String resolved = alternativeResolvers.resolve(host);
if(resolved != null) {
// split resolved into host, port and path
int posPath = resolved.indexOf('/');
String path = resolved.substring(posPath);
String hostPort = resolved.substring(0, posPath);
int posPort = hostPort.lastIndexOf(':');
String newHost = hostPort.substring(0, posPort);
int newPort = Integer.parseInt(hostPort.substring(posPort + 1));
RequestDispatcher dispatcher = request.getRequestDispatcher(path + target);
dispatcher.forward(new DomainRequestWrapper(request, newHost, newPort), response);
baseRequest.setHandled(true);
}
}
private class DomainRequestWrapper extends HttpServletRequestWrapper {
private String newServerName;
private int newServerPort;
public DomainRequestWrapper(HttpServletRequest request, String serverName, int serverPort) {
super(request);
this.newServerName = serverName;
this.newServerPort = serverPort;
}
@Override
public String getServerName() {
return newServerName;
}
@Override
public int getServerPort() {
return newServerPort;
}
@Override
public StringBuffer getRequestURL() {
StringBuffer buf = new StringBuffer(this.getScheme() +"://"+ newServerName + ":" + newServerPort + this.getPathInfo());
return buf;
}
@Override
public String getHeader(String name) {
if(name.equals("Host")) {
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);
}
}
private AlternativeDomainNames alternativeResolvers;
public void setAlternativeResolver(AlternativeDomainNames resolver) {
this.alternativeResolvers = resolver;
}
@Override
public void handle(String target, Request baseRequest, HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException {
String host = request.getServerName();
String resolved = alternativeResolvers.resolve(host);
if (resolved != null) {
// split resolved into host, port and path
String path;
String hostPort;
int posPath = resolved.indexOf('/');
if (posPath >= 0) {
path = resolved.substring(posPath);
hostPort = resolved.substring(0, posPath);
} else {
path = "";
hostPort = resolved;
}
int posPort = hostPort.lastIndexOf(':');
String newHost;
int newPort;
if (posPort >= 0) {
newHost = hostPort.substring(0, posPort);
newPort = Integer.parseInt(hostPort.substring(posPort + 1));
} else {
newHost = hostPort;
newPort = 80;
}
RequestDispatcher dispatcher = request.getRequestDispatcher(path + target);
dispatcher.forward(new DomainRequestWrapper(request, newHost, newPort), response);
baseRequest.setHandled(true);
}
}
private class DomainRequestWrapper extends HttpServletRequestWrapper {
private String newServerName;
private int newServerPort;
public DomainRequestWrapper(HttpServletRequest request, String serverName, int serverPort) {
super(request);
this.newServerName = serverName;
this.newServerPort = serverPort;
}
@Override
public String getServerName() {
return newServerName;
}
@Override
public int getServerPort() {
return newServerPort;
}
@Override
public StringBuffer getRequestURL() {
StringBuffer buf = new StringBuffer(this.getScheme() + "://" + newServerName + ":" + newServerPort + this.getPathInfo());
return buf;
}
@Override
public String getHeader(String name) {
if (name.equals("Host")) {
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