mirror of
https://gitee.com/arthas/arthas.git
synced 2024-11-29 18:58:37 +08:00
tunnel server support X-Real-IP/X-Real-Port. #1558
This commit is contained in:
parent
84ebb8959f
commit
8e156956c0
@ -11,7 +11,6 @@ import java.util.List;
|
|||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
import io.netty.handler.codec.http.websocketx.CloseWebSocketFrame;
|
|
||||||
import org.apache.commons.lang3.RandomStringUtils;
|
import org.apache.commons.lang3.RandomStringUtils;
|
||||||
import org.apache.tomcat.util.codec.binary.Base64;
|
import org.apache.tomcat.util.codec.binary.Base64;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
@ -26,7 +25,9 @@ import com.alibaba.arthas.tunnel.common.URIConstans;
|
|||||||
import io.netty.channel.Channel;
|
import io.netty.channel.Channel;
|
||||||
import io.netty.channel.ChannelHandlerContext;
|
import io.netty.channel.ChannelHandlerContext;
|
||||||
import io.netty.channel.SimpleChannelInboundHandler;
|
import io.netty.channel.SimpleChannelInboundHandler;
|
||||||
|
import io.netty.handler.codec.http.HttpHeaders;
|
||||||
import io.netty.handler.codec.http.QueryStringDecoder;
|
import io.netty.handler.codec.http.QueryStringDecoder;
|
||||||
|
import io.netty.handler.codec.http.websocketx.CloseWebSocketFrame;
|
||||||
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
|
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
|
||||||
import io.netty.handler.codec.http.websocketx.WebSocketFrame;
|
import io.netty.handler.codec.http.websocketx.WebSocketFrame;
|
||||||
import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler.HandshakeComplete;
|
import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler.HandshakeComplete;
|
||||||
@ -65,7 +66,7 @@ public class TunnelSocketFrameHandler extends SimpleChannelInboundHandler<WebSoc
|
|||||||
if (MethodConstants.CONNECT_ARTHAS.equals(method)) { // form browser
|
if (MethodConstants.CONNECT_ARTHAS.equals(method)) { // form browser
|
||||||
connectArthas(ctx, parameters);
|
connectArthas(ctx, parameters);
|
||||||
} else if (MethodConstants.AGENT_REGISTER.equals(method)) { // form arthas agent, register
|
} else if (MethodConstants.AGENT_REGISTER.equals(method)) { // form arthas agent, register
|
||||||
agentRegister(ctx, uri);
|
agentRegister(ctx, handshake, uri);
|
||||||
}
|
}
|
||||||
if (MethodConstants.OPEN_TUNNEL.equals(method)) { // from arthas agent open tunnel
|
if (MethodConstants.OPEN_TUNNEL.equals(method)) { // from arthas agent open tunnel
|
||||||
String clientConnectionId = parameters.getFirst("clientConnectionId");
|
String clientConnectionId = parameters.getFirst("clientConnectionId");
|
||||||
@ -204,7 +205,7 @@ public class TunnelSocketFrameHandler extends SimpleChannelInboundHandler<WebSoc
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void agentRegister(ChannelHandlerContext ctx, String requestUri) throws URISyntaxException {
|
private void agentRegister(ChannelHandlerContext ctx, HandshakeComplete handshake, String requestUri) throws URISyntaxException {
|
||||||
// generate a random agent id
|
// generate a random agent id
|
||||||
String id = RandomStringUtils.random(20, true, true).toUpperCase();
|
String id = RandomStringUtils.random(20, true, true).toUpperCase();
|
||||||
|
|
||||||
@ -228,12 +229,31 @@ public class TunnelSocketFrameHandler extends SimpleChannelInboundHandler<WebSoc
|
|||||||
.encode().toUri();
|
.encode().toUri();
|
||||||
|
|
||||||
AgentInfo info = new AgentInfo();
|
AgentInfo info = new AgentInfo();
|
||||||
SocketAddress remoteAddress = ctx.channel().remoteAddress();
|
|
||||||
if (remoteAddress instanceof InetSocketAddress) {
|
// 前面可能有nginx代理
|
||||||
InetSocketAddress inetSocketAddress = (InetSocketAddress) remoteAddress;
|
HttpHeaders headers = handshake.requestHeaders();
|
||||||
info.setHost(inetSocketAddress.getHostString());
|
String host = headers.get("X-Real-IP");
|
||||||
info.setPort(inetSocketAddress.getPort());
|
String portStr = headers.get("X-Real-Port");
|
||||||
|
|
||||||
|
if (host == null) {
|
||||||
|
SocketAddress remoteAddress = ctx.channel().remoteAddress();
|
||||||
|
if (remoteAddress instanceof InetSocketAddress) {
|
||||||
|
InetSocketAddress inetSocketAddress = (InetSocketAddress) remoteAddress;
|
||||||
|
info.setHost(inetSocketAddress.getHostString());
|
||||||
|
info.setPort(inetSocketAddress.getPort());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
info.setHost(host);
|
||||||
|
try {
|
||||||
|
if (portStr != null) {
|
||||||
|
int port = Integer.parseInt(portStr);
|
||||||
|
info.setPort(port);
|
||||||
|
}
|
||||||
|
} catch (Throwable e) {
|
||||||
|
// ignore
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
info.setChannelHandlerContext(ctx);
|
info.setChannelHandlerContext(ctx);
|
||||||
if (arthasVersion != null) {
|
if (arthasVersion != null) {
|
||||||
info.setArthasVersion(arthasVersion);
|
info.setArthasVersion(arthasVersion);
|
||||||
|
Loading…
Reference in New Issue
Block a user