org.springframework.network.LiteNetworkResolver Maven / Gradle / Ivy
package org.springframework.network;
import java.net.Inet4Address;
import java.net.Inet6Address;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.regex.Pattern;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* @see org.apache.http.conn.util.InetAddressUtils
*/
public class LiteNetworkResolver implements NetworkResolver {
private final Log logger = LogFactory.getLog(getClass());
private Pattern internal = Pattern.compile("10\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}|" + // 10/8
"192\\.168\\.\\d{1,3}\\.\\d{1,3}|" + // 192.168/16
"169\\.254\\.\\d{1,3}\\.\\d{1,3}|" + // 169.254/16
"127\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}|" + // 127/8
"172\\.1[6-9]{1}\\.\\d{1,3}\\.\\d{1,3}|" + "172\\.2[0-9]{1}\\.\\d{1,3}\\.\\d{1,3}|" + "172\\.3[0-1]{1}\\.\\d{1,3}\\.\\d{1,3}|" + // 172.16/12
"0:0:0:0:0:0:0:1|" + "::1|" + //
"[fF][cCdD]" // fc00::/7
);
@Override
public Network resolveNetwork(HttpServletRequest request) {
String remoteAddr = request.getRemoteAddr();
if (internal != null) {
NetworkType networkType = internal.matcher(remoteAddr).matches() ? NetworkType.INTERNAL : NetworkType.EXTERNAL;
InetAddress inetAddress = getInetAddress(remoteAddr);
boolean inet4Address = inetAddress instanceof Inet4Address;
boolean inet6Address = inetAddress instanceof Inet6Address;
if ((inet4Address || inet6Address) && !(inet4Address && inet6Address)) {
if (inet4Address) {
return resolveWithPlatform(networkType, NetworkPlatform.V4);
}
if (inet6Address) {
return resolveWithPlatform(networkType, NetworkPlatform.V6);
}
}
}
return resolveFallback(request);
}
private InetAddress getInetAddress(String remoteAddr) {
try {
return InetAddress.getByName(remoteAddr);
}
catch (UnknownHostException e) {
if (logger.isWarnEnabled()) {
logger.warn(e, e);
}
}
return InetAddress.getLoopbackAddress();
}
protected Network resolveWithPlatform(NetworkType networkType, NetworkPlatform networkPlatform) {
return LiteNetwork.from(networkType, networkPlatform);
}
protected Network resolveFallback(HttpServletRequest request) {
return LiteNetwork.NORMAL_INSTANCE;
}
@Override
public String getInternal() {
if (internal == null) {
return null;
}
return internal.toString();
}
public void setInternal(String internal) {
if (internal == null || internal.length() == 0) {
this.internal = null;
}
else {
this.internal = Pattern.compile(internal);
}
}
}