From 7530fd7d9f3cafcdb3744b891b050ad75fc5237e Mon Sep 17 00:00:00 2001 From: aoshiguchen <1052045476@qq.com> Date: Sat, 9 Dec 2023 23:27:46 +0800 Subject: [PATCH] =?UTF-8?q?http=E5=9F=9F=E5=90=8D=E8=AE=BF=E9=97=AE?= =?UTF-8?q?=E6=97=B6=EF=BC=8C=E5=AE=89=E5=85=A8=E7=BB=84=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E7=9C=9F=E5=AE=9Eip=E9=80=BB=E8=BE=91=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../neutrinoproxy/core/util/HttpUtil.java | 60 +++++++++++++++++++ .../neutrinoproxy/core/util/IpUtil.java | 24 ++------ .../enhance/HttpVisitorChannelHandler.java | 22 +------ 3 files changed, 68 insertions(+), 38 deletions(-) create mode 100644 neutrino-proxy-core/src/main/java/org/dromara/neutrinoproxy/core/util/HttpUtil.java diff --git a/neutrino-proxy-core/src/main/java/org/dromara/neutrinoproxy/core/util/HttpUtil.java b/neutrino-proxy-core/src/main/java/org/dromara/neutrinoproxy/core/util/HttpUtil.java new file mode 100644 index 00000000..38f098d8 --- /dev/null +++ b/neutrino-proxy-core/src/main/java/org/dromara/neutrinoproxy/core/util/HttpUtil.java @@ -0,0 +1,60 @@ +package org.dromara.neutrinoproxy.core.util; + + +import org.apache.commons.lang3.StringUtils; + +/** + * @author: wen.y + * @date: 2023/12/9 + */ +public class HttpUtil { + + /** + * 获取请求头 Host 忽略端口号 + * @param httpContent + * @return + */ + public static String getHostIgnorePort(String httpContent) { + String host = getHost(httpContent); + if (StringUtils.isEmpty(host) || !host.contains(":")) { + return host; + } + return host.replaceAll(":.*", ""); + } + + /** + * 获取请求头 Host + * @param httpContent + * @return + */ + public static String getHost(String httpContent) { + return getHeaderValue(httpContent, "Host"); + } + + /** + * 获取请求头 + * @param httpContent + * @return + */ + public static String getHeaderValue(String httpContent, String header) { + String headerContent = httpContent.split("\r\n\r\n")[0]; + String[] lines = headerContent.split("\r\n"); + String firstLine = lines[0]; + if (!(firstLine.endsWith("HTTP/1.1") || firstLine.endsWith("HTTP/1.0"))) { + return null; + } + for (int i = 1; i < lines.length; i++) { + String line = lines[i]; + if (!line.startsWith(header + ":")) { + continue; + } + if (line.length() > header.length() + 1) { + return line.substring(header.length() + 1).trim(); + } else { + return ""; + } + } + return null; + } + +} diff --git a/neutrino-proxy-core/src/main/java/org/dromara/neutrinoproxy/core/util/IpUtil.java b/neutrino-proxy-core/src/main/java/org/dromara/neutrinoproxy/core/util/IpUtil.java index 571a7d63..4f93feb6 100644 --- a/neutrino-proxy-core/src/main/java/org/dromara/neutrinoproxy/core/util/IpUtil.java +++ b/neutrino-proxy-core/src/main/java/org/dromara/neutrinoproxy/core/util/IpUtil.java @@ -2,6 +2,7 @@ package org.dromara.neutrinoproxy.core.util; import cn.hutool.core.net.Ipv4Util; import io.netty.channel.ChannelHandlerContext; +import org.apache.commons.lang3.StringUtils; import java.net.InetSocketAddress; @@ -22,27 +23,14 @@ public class IpUtil extends org.noear.solon.core.util.IpUtil { * @return 返回找到的第一个公网地址 */ public static String getRealRemoteIp(String httpContent) { - String headerContent = httpContent.split("\r\n\r\n")[0]; - String[] lines = headerContent.split("\r\n"); - String firstLine = lines[0]; - if (!(firstLine.endsWith("HTTP/1.1") || firstLine.endsWith("HTTP/1.0"))) { - return null; + String ip = HttpUtil.getHeaderValue(httpContent, "X-Forwarded-For"); + if (StringUtils.isEmpty(ip)) { + ip = HttpUtil.getHeaderValue(httpContent, "X-Real-IP"); } - for (int i = 1; i < lines.length; i++) { - String line = lines[i]; - // 匹配有ipv4地址格式的header - if (!line.matches(".*(\\d+\\.){3}\\d+")) { - continue; - } - // 截取IP地址 - String ip = line.substring(line.charAt(':')); - if (!Ipv4Util.isInnerIP(ip)) { - return ip; - } + if (StringUtils.isNotEmpty(ip) && !Ipv4Util.isInnerIP(ip)) { + return ip; } return null; } - - } diff --git a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/proxy/enhance/HttpVisitorChannelHandler.java b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/proxy/enhance/HttpVisitorChannelHandler.java index 42e0f747..6b07f8d9 100644 --- a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/proxy/enhance/HttpVisitorChannelHandler.java +++ b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/proxy/enhance/HttpVisitorChannelHandler.java @@ -10,6 +10,7 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.dromara.neutrinoproxy.core.Constants; import org.dromara.neutrinoproxy.core.ProxyMessage; +import org.dromara.neutrinoproxy.core.util.HttpUtil; import org.dromara.neutrinoproxy.core.util.IpUtil; import org.dromara.neutrinoproxy.server.constant.NetworkProtocolEnum; import org.dromara.neutrinoproxy.server.proxy.domain.ProxyAttachment; @@ -78,7 +79,7 @@ public class HttpVisitorChannelHandler extends SimpleChannelInboundHandler