From 7e73bc0d6c1dc613326ea32063e7b06eaa45446c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=9C=B0=E5=B9=B3=E7=BA=BF?= <22250530@qq.com> Date: Wed, 30 Sep 2015 16:41:44 +0800 Subject: [PATCH] --- src/META-INF/application-template.xml | 1 - .../redkale/net/http/HttpPrepareServlet.java | 24 +-- .../redkale/net/http/HttpProxyServlet.java | 194 ------------------ .../wentch/redkale/net/http/HttpRequest.java | 2 +- .../wentch/redkale/net/http/HttpResponse.java | 10 +- .../wentch/redkale/net/http/HttpServlet.java | 2 +- 6 files changed, 11 insertions(+), 222 deletions(-) delete mode 100644 src/com/wentch/redkale/net/http/HttpProxyServlet.java diff --git a/src/META-INF/application-template.xml b/src/META-INF/application-template.xml index ce85b6c83..6c06c3712 100644 --- a/src/META-INF/application-template.xml +++ b/src/META-INF/application-template.xml @@ -77,7 +77,6 @@ readTimeoutSecond: 读操作超时秒数, 默认0, 表示永久不超时 writeTimeoutSecond: 写操作超时秒数, 默认0, 表示永久不超时 - forwardproxy: 正向代理(支持CONNECT); 默认: false, 只有当 protocol==HTTP 才生效 --> diff --git a/src/com/wentch/redkale/net/http/HttpPrepareServlet.java b/src/com/wentch/redkale/net/http/HttpPrepareServlet.java index 47451dda3..1640a58ed 100644 --- a/src/com/wentch/redkale/net/http/HttpPrepareServlet.java +++ b/src/com/wentch/redkale/net/http/HttpPrepareServlet.java @@ -21,7 +21,7 @@ import java.util.regex.*; * * @author zhangjx */ -public final class HttpPrepareServlet extends PrepareServlet { +public final class HttpPrepareServlet extends PrepareServlet> { private ByteBuffer flashPolicyBuffer; @@ -31,10 +31,6 @@ public final class HttpPrepareServlet extends PrepareServlet, HttpServlet>[] regArray = new SimpleEntry[0]; - private boolean forwardproxy = false; - - private final HttpServlet proxyServlet = new HttpProxyServlet(); - private HttpServlet resourceHttpServlet = new HttpResourceServlet(); private String flashdomain = "*"; @@ -69,23 +65,9 @@ public final class HttpPrepareServlet extends PrepareServlet, HttpServlet> en : regArray) { diff --git a/src/com/wentch/redkale/net/http/HttpProxyServlet.java b/src/com/wentch/redkale/net/http/HttpProxyServlet.java deleted file mode 100644 index aedf57f28..000000000 --- a/src/com/wentch/redkale/net/http/HttpProxyServlet.java +++ /dev/null @@ -1,194 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package com.wentch.redkale.net.http; - -import com.wentch.redkale.net.*; -import com.wentch.redkale.util.*; -import java.io.*; -import java.net.*; -import java.nio.*; -import java.nio.channels.*; - -/** - * 在appliation.xml中的HTTP类型的server节点加上forwardproxy="true"表示该HttpServer支持正向代理 - * - * @author zhangjx - */ -public final class HttpProxyServlet extends HttpServlet { - - @Override - public void execute(HttpRequest request, HttpResponse response) throws IOException { - response.skipHeader(); - if ("CONNECT".equalsIgnoreCase(request.getMethod())) { - connect(request, response); - return; - } - String url = request.getRequestURI(); - url = url.substring(url.indexOf("://") + 3); - url = url.substring(url.indexOf('/')); - final ByteBuffer buffer = response.getContext().pollBuffer(); - buffer.put((request.getMethod() + " " + url + " HTTP/1.1\r\n").getBytes()); - for (AnyValue.Entry en : request.header.getStringEntrys()) { - if (!en.name.startsWith("Proxy-")) { - buffer.put((en.name + ": " + en.getValue() + "\r\n").getBytes()); - } - } - if (request.getHost() != null) { - buffer.put(("Host: " + request.getHost() + "\r\n").getBytes()); - } - if (request.getContentType() != null) { - buffer.put(("Content-Type: " + request.getContentType() + "\r\n").getBytes()); - } - if (request.getContentLength() > 0) { - buffer.put(("Content-Length: " + request.getContentLength() + "\r\n").getBytes()); - } - buffer.put(HttpResponse.LINE); - buffer.flip(); - final AsyncConnection remote = AsyncConnection.create("TCP", request.getHostSocketAddress(), 6, 6); - remote.write(buffer, null, new CompletionHandler() { - - @Override - public void completed(Integer result, Void attachment) { - if (buffer.hasRemaining()) { - remote.write(buffer, attachment, this); - return; - } - response.getContext().offerBuffer(buffer); - new ProxyCompletionHandler(remote, request, response).completed(0, null); - } - - @Override - public void failed(Throwable exc, Void attachment) { - response.getContext().offerBuffer(buffer); - response.finish(true); - try { - remote.close(); - } catch (IOException ex) { - } - } - }); - } - - private void connect(HttpRequest request, HttpResponse response) throws IOException { - final InetSocketAddress remoteAddress = HttpRequest.parseSocketAddress(request.getRequestURI()); - final AsyncConnection remote = remoteAddress.getPort() == 443 - ? AsyncConnection.create(Utility.createDefaultSSLSocket(remoteAddress)) : AsyncConnection.create("TCP", remoteAddress, 6, 6); - final ByteBuffer buffer0 = response.getContext().pollBuffer(); - buffer0.put("HTTP/1.1 200 Connection established\r\nConnection: close\r\n\r\n".getBytes()); - buffer0.flip(); - response.sendBody(buffer0, null, new CompletionHandler() { - - @Override - public void completed(Integer result, Void attachment) { - new ProxyCompletionHandler(remote, request, response).completed(0, null); - } - - @Override - public void failed(Throwable exc, Void attachment) { - response.finish(true); - try { - remote.close(); - } catch (IOException ex) { - } - } - }); - - } - - private static class ProxyCompletionHandler implements CompletionHandler { - - private AsyncConnection remote; - - private HttpRequest request; - - private HttpResponse response; - - public ProxyCompletionHandler(AsyncConnection remote, HttpRequest request, HttpResponse response) { - this.remote = remote; - this.request = request; - this.response = response; - } - - @Override - public void completed(Integer result0, Void v0) { - final ByteBuffer rbuffer = request.getContext().pollBuffer(); - remote.read(rbuffer, null, new CompletionHandler() { - - @Override - public void completed(Integer result, Void attachment) { - rbuffer.flip(); - CompletionHandler parent = this; - response.sendBody(rbuffer.duplicate().asReadOnlyBuffer(), null, new CompletionHandler() { - - @Override - public void completed(Integer result, Void attachment) { - rbuffer.clear(); - remote.read(rbuffer, attachment, parent); - } - - @Override - public void failed(Throwable exc, Void attachment) { - parent.failed(exc, attachment); - } - }); - } - - @Override - public void failed(Throwable exc, Void attachment) { - response.getContext().offerBuffer(rbuffer); - response.finish(true); - try { - remote.close(); - } catch (IOException ex) { - } - } - }); - - final ByteBuffer qbuffer = request.getContext().pollBuffer(); - request.getChannel().read(qbuffer, null, new CompletionHandler() { - - @Override - public void completed(Integer result, Void attachment) { - qbuffer.flip(); - CompletionHandler parent = this; - remote.write(qbuffer, null, new CompletionHandler() { - - @Override - public void completed(Integer result, Void attachment) { - qbuffer.clear(); - request.getChannel().read(qbuffer, null, parent); - } - - @Override - public void failed(Throwable exc, Void attachment) { - parent.failed(exc, attachment); - } - }); - } - - @Override - public void failed(Throwable exc, Void attachment) { - response.getContext().offerBuffer(qbuffer); - response.finish(true); - try { - remote.close(); - } catch (IOException ex) { - } - } - }); - } - - @Override - public void failed(Throwable exc, Void v) { - response.finish(true); - try { - remote.close(); - } catch (IOException ex) { - } - } - } - -} diff --git a/src/com/wentch/redkale/net/http/HttpRequest.java b/src/com/wentch/redkale/net/http/HttpRequest.java index c7480e411..4015b2df0 100644 --- a/src/com/wentch/redkale/net/http/HttpRequest.java +++ b/src/com/wentch/redkale/net/http/HttpRequest.java @@ -19,7 +19,7 @@ import java.nio.charset.*; * * @author zhangjx */ -public final class HttpRequest extends Request { +public class HttpRequest extends Request { protected static final Charset UTF8 = Charset.forName("UTF-8"); diff --git a/src/com/wentch/redkale/net/http/HttpResponse.java b/src/com/wentch/redkale/net/http/HttpResponse.java index 8a0e2a228..b550e6269 100644 --- a/src/com/wentch/redkale/net/http/HttpResponse.java +++ b/src/com/wentch/redkale/net/http/HttpResponse.java @@ -22,8 +22,9 @@ import java.util.concurrent.atomic.*; /** * * @author zhangjx + * @param */ -public final class HttpResponse extends Response { +public class HttpResponse extends Response { private static final ByteBuffer buffer304 = ByteBuffer.wrap("HTTP/1.1 304 Not Modified\r\n\r\n".getBytes()).asReadOnlyBuffer(); @@ -109,7 +110,7 @@ public final class HttpResponse extends Response { return new ObjectPool<>(creatCounter, cycleCounter, max, creator, (x) -> ((HttpResponse) x).prepare(), (x) -> ((HttpResponse) x).recycle()); } - public HttpResponse(Context context, HttpRequest request, String[][] defaultAddHeaders, String[][] defaultSetHeaders, HttpCookie defcookie) { + public HttpResponse(Context context, R request, String[][] defaultAddHeaders, String[][] defaultSetHeaders, HttpCookie defcookie) { super(context, request); this.defaultAddHeaders = defaultAddHeaders; this.defaultSetHeaders = defaultSetHeaders; @@ -132,6 +133,11 @@ public final class HttpResponse extends Response { return super.recycle(); } + @Override + protected void init(AsyncConnection channel) { + super.init(channel); + } + protected String getHttpCode(int status) { return httpCodes.get(status); } diff --git a/src/com/wentch/redkale/net/http/HttpServlet.java b/src/com/wentch/redkale/net/http/HttpServlet.java index fd3fa5c99..e50674572 100644 --- a/src/com/wentch/redkale/net/http/HttpServlet.java +++ b/src/com/wentch/redkale/net/http/HttpServlet.java @@ -12,7 +12,7 @@ import com.wentch.redkale.util.*; * * @author zhangjx */ -public abstract class HttpServlet implements Servlet { +public abstract class HttpServlet implements Servlet> { AnyValue conf; //当前HttpServlet的配置