/*
 * Copyright (c) 京北方信息技术股份有限公司 Corporation 2021 . All rights reserved.
 *
 */
package net.northking.cctp.common.util;

import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.util.StringUtils;

import java.net.InetSocketAddress;

/**
 * Web网络工具类
 *
 * @author : xiusong.xie
 * @version : 1.0
 */
public class WebFluxNetUtils
{

  private WebFluxNetUtils()
  {
  }

  public static String getClientIPAddress(ServerHttpRequest request)
  {
    String ip = "";

    //X-Forwarded-For：Squid 服务代理
    String ipAddresses = request.getHeaders().getFirst("X-Forwarded-For");
    if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses))
    {
      //Proxy-Client-IP：apache 服务代理
      ipAddresses = request.getHeaders().getFirst("Proxy-Client-IP");
    }
    if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses))
    {
      //WL-Proxy-Client-IP：weblogic 服务代理
      ipAddresses = request.getHeaders().getFirst("WL-Proxy-Client-IP");
    }
    if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses))
    {
      //HTTP_CLIENT_IP：有些代理服务器
      ipAddresses = request.getHeaders().getFirst("HTTP_CLIENT_IP");
    }
    if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses))
    {
      //X-Real-IP：nginx服务代理
      ipAddresses = request.getHeaders().getFirst("X-Real-IP");
    }

    //有些网络通过多层代理，那么获取到的ip就会有多个，一般都是通过逗号（,）分割开来，并且第一个ip为客户端的真实IP
    if (ipAddresses != null && ipAddresses.length() != 0)
    {
      ip = ipAddresses;
    }

    //还是不能获取到，最后再通过request.getRemoteAddress();获取
    if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip))
    {
      InetSocketAddress inetSocketAddress = request.getRemoteAddress();
      if (inetSocketAddress != null)
      {
        ip = request.getRemoteAddress().getAddress().getHostAddress();
      }
    }
    return ip.equals("0:0:0:0:0:0:0:1") ? "127.0.0.1" : ip;
  }
}
