Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions 02nio/nio02/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,17 @@
<artifactId>httpasyncclient</artifactId>
<version>4.1.4</version>
</dependency>

<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.9.0</version>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib</artifactId>
<version>1.3.70</version>
</dependency>

<!--
<dependency>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package io.github.kimmking.gateway.filter;

import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.http.FullHttpRequest;

public class HttpRequestHeaderFilter implements HttpRequestFilter {

@Override
public void filter(FullHttpRequest fullRequest, ChannelHandlerContext ctx) {
fullRequest.headers().set("nio", "fangkuangzhang");
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package io.github.kimmking.gateway.inbound;

import io.github.kimmking.gateway.filter.HttpRequestFilter;
import io.github.kimmking.gateway.filter.HttpRequestHeaderFilter;
import io.github.kimmking.gateway.outbound.okhttp.OkhttpOutboundFilterHandler;
import io.github.kimmking.gateway.outbound.okhttp.OkhttpOutboundHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.util.ReferenceCountUtil;

public class HttpInboundFilterHandler extends ChannelInboundHandlerAdapter {

private final String proxyServer;
private OkhttpOutboundHandler handler;
private HttpRequestFilter filter;

public HttpInboundFilterHandler(String proxyServer) {
this.proxyServer = proxyServer;
handler = new OkhttpOutboundFilterHandler(this.proxyServer);
filter = new HttpRequestHeaderFilter();
}

@Override
public void channelReadComplete(ChannelHandlerContext ctx) {
ctx.flush();
}

@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
try {
FullHttpRequest fullRequest = (FullHttpRequest) msg;
filter.filter(fullRequest, ctx);
handler.handle(fullRequest, ctx);
} catch(Exception e) {
e.printStackTrace();
} finally {
ReferenceCountUtil.release(msg);
}
}

}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package io.github.kimmking.gateway.inbound;

import io.github.kimmking.gateway.outbound.httpclient4.HttpOutboundHandler;
import io.github.kimmking.gateway.outbound.okhttp.OkhttpOutboundHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.handler.codec.http.FullHttpRequest;
Expand All @@ -12,11 +12,13 @@ public class HttpInboundHandler extends ChannelInboundHandlerAdapter {

private static Logger logger = LoggerFactory.getLogger(HttpInboundHandler.class);
private final String proxyServer;
private HttpOutboundHandler handler;
// private HttpOutboundHandler handler;
private OkhttpOutboundHandler handler;

public HttpInboundHandler(String proxyServer) {
this.proxyServer = proxyServer;
handler = new HttpOutboundHandler(this.proxyServer);
// handler = new HttpOutboundHandler(this.proxyServer);
handler = new OkhttpOutboundHandler(this.proxyServer);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ public void initChannel(SocketChannel ch) {
p.addLast(new HttpServerCodec());
//p.addLast(new HttpServerExpectContinueHandler());
p.addLast(new HttpObjectAggregator(1024 * 1024));
p.addLast(new HttpInboundHandler(this.proxyServer));
// p.addLast(new HttpInboundHandler(this.proxyServer));
p.addLast(new HttpInboundFilterHandler(this.proxyServer));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package io.github.kimmking.gateway.outbound.okhttp;

import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpHeaders;
import okhttp3.Request;

import java.util.Iterator;
import java.util.Map;

public class OkhttpOutboundFilterHandler extends OkhttpOutboundHandler {

public OkhttpOutboundFilterHandler(String backendUrl) {
super(backendUrl);
}

@Override
protected void enhanceRequest(Request.Builder builder, FullHttpRequest fullHttpRequest) {
HttpHeaders headers = fullHttpRequest.headers();
Iterator<Map.Entry<String, String>> iterator = headers.iteratorAsString();
while (iterator.hasNext()) {
Map.Entry<String, String> next = iterator.next();
builder.header(next.getKey(), next.getValue());
}
}

}

Original file line number Diff line number Diff line change
@@ -1,4 +1,73 @@
package io.github.kimmking.gateway.outbound.okhttp;

import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelFutureListener;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.http.DefaultFullHttpResponse;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.FullHttpResponse;
import io.netty.handler.codec.http.HttpUtil;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.ResponseBody;
import org.jetbrains.annotations.NotNull;

import java.io.IOException;

import static io.netty.handler.codec.http.HttpResponseStatus.NO_CONTENT;
import static io.netty.handler.codec.http.HttpResponseStatus.OK;
import static io.netty.handler.codec.http.HttpVersion.HTTP_1_1;

public class OkhttpOutboundHandler {

private String backendUrl;
private OkHttpClient client;

public OkhttpOutboundHandler(String backendUrl) {
this.backendUrl = backendUrl.endsWith("/") ? backendUrl.substring(0, backendUrl.length()-1) : backendUrl;
this.client = new OkHttpClient();
}

public void handle(FullHttpRequest fullRequest, ChannelHandlerContext ctx) {
Request request = buildRequest(fullRequest);

FullHttpResponse httpResponse = null;
try (Response response = client.newCall(request).execute()) {
ResponseBody body = response.body();

httpResponse = new DefaultFullHttpResponse(HTTP_1_1, OK, Unpooled.wrappedBuffer(body.bytes()));
httpResponse.headers().set("Content-Type", "application/json");
httpResponse.headers().setInt("Content-Length", (int) body.contentLength());
} catch (IOException e) {
e.printStackTrace();
httpResponse = new DefaultFullHttpResponse(HTTP_1_1, NO_CONTENT);
ctx.close();
} finally {
if (!HttpUtil.isKeepAlive(fullRequest)) {
ctx.write(httpResponse).addListener(ChannelFutureListener.CLOSE);
} else {
ctx.write(httpResponse);
}
ctx.flush();
}
}

@NotNull
private Request buildRequest(FullHttpRequest fullRequest) {
String url = this.backendUrl + fullRequest.uri();
Request.Builder builder = new Request.Builder().url(url);
enhanceRequest(builder, fullRequest);
return builder.build();
}

/**
* 请求头处理
* @param builder
* @param fullHttpRequest
*/
protected void enhanceRequest(Request.Builder builder, FullHttpRequest fullHttpRequest) {

}

}