parent
b6d67507db
commit
13724ddd43
@ -0,0 +1,76 @@
|
||||
//
|
||||
// AbstractRemoteHandler
|
||||
// Copyright 2011 by Florian Richter
|
||||
// First released 2011 at http://yacy.net
|
||||
//
|
||||
// $LastChangedDate$
|
||||
// $LastChangedRevision$
|
||||
// $LastChangedBy$
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Lesser General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2.1 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Lesser General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser General Public License
|
||||
// along with this program in the file lgpl21.txt
|
||||
// If not, see <http://www.gnu.org/licenses/>.
|
||||
//
|
||||
|
||||
package net.yacy.http;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
|
||||
import javax.servlet.ServletException;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
import org.eclipse.jetty.server.Handler;
|
||||
import org.eclipse.jetty.server.Request;
|
||||
import org.eclipse.jetty.server.handler.AbstractHandler;
|
||||
|
||||
import de.anomic.search.Switchboard;
|
||||
|
||||
/**
|
||||
* abstract jetty http handler
|
||||
* only request to remote hosts (proxy requests) are processed by derived classes
|
||||
*/
|
||||
abstract public class AbstractRemoteHandler extends AbstractHandler implements Handler {
|
||||
|
||||
protected Switchboard sb = null;
|
||||
|
||||
private List<String> localVirtualHostNames;
|
||||
|
||||
@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;
|
||||
|
||||
@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);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,95 @@
|
||||
//
|
||||
// ProxyCacheHandler
|
||||
// Copyright 2004 by Michael Peter Christen; mc@yacy.net, Frankfurt a. M., Germany
|
||||
// Copyright 2011 by Florian Richter
|
||||
// First released 2011 at http://yacy.net
|
||||
//
|
||||
// $LastChangedDate$
|
||||
// $LastChangedRevision$
|
||||
// $LastChangedBy$
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Lesser General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2.1 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Lesser General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser General Public License
|
||||
// along with this program in the file lgpl21.txt
|
||||
// If not, see <http://www.gnu.org/licenses/>.
|
||||
//
|
||||
|
||||
package net.yacy.http;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import javax.servlet.ServletException;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
import net.yacy.cora.protocol.RequestHeader;
|
||||
import net.yacy.cora.protocol.ResponseHeader;
|
||||
import net.yacy.kelondro.data.meta.DigestURI;
|
||||
|
||||
import org.eclipse.jetty.server.Handler;
|
||||
import org.eclipse.jetty.server.HttpConnection;
|
||||
import org.eclipse.jetty.server.Request;
|
||||
|
||||
import de.anomic.crawler.retrieval.Response;
|
||||
import de.anomic.http.client.Cache;
|
||||
import de.anomic.search.Switchboard;
|
||||
|
||||
/**
|
||||
* jetty http handler
|
||||
* serves pages from cache if available and valid
|
||||
*/
|
||||
public class ProxyCacheHandler extends AbstractRemoteHandler implements Handler {
|
||||
|
||||
|
||||
private void handleRequestFromCache(HttpServletRequest request, HttpServletResponse response, ResponseHeader cachedResponseHeader, byte[] content) throws IOException {
|
||||
System.err.println("handle from cache");
|
||||
// TODO: check if-modified
|
||||
for(Entry<String, String> entry: cachedResponseHeader.entrySet()) {
|
||||
response.addHeader(entry.getKey(), entry.getValue());
|
||||
}
|
||||
response.setStatus(HttpServletResponse.SC_NON_AUTHORITATIVE_INFORMATION);
|
||||
response.getOutputStream().write(content);
|
||||
// we handled this request, break out of handler chain
|
||||
Request base_request = (request instanceof Request) ? (Request)request:HttpConnection.getCurrentConnection().getRequest();
|
||||
base_request.setHandled(true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleRemote(String target, Request baseRequest,
|
||||
HttpServletRequest request, HttpServletResponse response)
|
||||
throws IOException, ServletException {
|
||||
if(request.getMethod().equals("GET")) {
|
||||
String queryString = request.getQueryString()!=null ? "?" + request.getQueryString() : "";
|
||||
DigestURI url = new DigestURI(request.getRequestURL().toString() + queryString);
|
||||
ResponseHeader cachedResponseHeader = Cache.getResponseHeader(url);
|
||||
|
||||
if(cachedResponseHeader != null) {
|
||||
RequestHeader proxyHeaders = ProxyHandler.convertHeaderFromJetty(request);
|
||||
|
||||
final Response cachedResponse = new Response(
|
||||
null,
|
||||
proxyHeaders,
|
||||
cachedResponseHeader,
|
||||
"200 OK",
|
||||
sb.crawler.defaultProxyProfile
|
||||
);
|
||||
byte[] cacheContent = Cache.getContent(url);
|
||||
if (cacheContent != null && cachedResponse.isFreshForProxy()) {
|
||||
handleRequestFromCache(request, response, cachedResponseHeader, cacheContent);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in new issue