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