package ameba.container.server;
import org.apache.commons.lang3.StringUtils;
import org.glassfish.jersey.internal.PropertiesDelegate;
import org.glassfish.jersey.server.ContainerRequest;
import javax.ws.rs.core.SecurityContext;
import java.net.URI;
/**
* <p>Abstract Request class.</p>
*
* @author icode
* @since 0.1.6e
*
*/
public abstract class Request extends ContainerRequest {
/**
* Create new Jersey container request context.
*
* @param baseUri base application URI.
* @param requestUri request URI.
* @param httpMethod request HTTP method name.
* @param securityContext security context of the current request. Must not be {@code null}.
* The {@link javax.ws.rs.core.SecurityContext#getUserPrincipal()} must return
* {@code null} if the current request has not been authenticated
* by the container.
* @param propertiesDelegate custom {@link org.glassfish.jersey.internal.PropertiesDelegate properties delegate}
*/
public Request(URI baseUri, URI requestUri, String httpMethod, SecurityContext securityContext, PropertiesDelegate propertiesDelegate) {
super(baseUri, requestUri, httpMethod, securityContext, propertiesDelegate);
}
/**
* <p>getRemoteAddr.</p>
*
* @return a {@link java.lang.String} object.
*/
public abstract String getRemoteAddr();
/**
* <p>getRemoteHost.</p>
*
* @return a {@link java.lang.String} object.
*/
public abstract String getRemoteHost();
/**
* <p>getRemotePort.</p>
*
* @return a int.
*/
public abstract int getRemotePort();
/**
* <p>getLocalAddr.</p>
*
* @return a {@link java.lang.String} object.
*/
public abstract String getLocalAddr();
/**
* <p>getLocalName.</p>
*
* @return a {@link java.lang.String} object.
*/
public abstract String getLocalName();
/**
* <p>getLocalPort.</p>
*
* @return a int.
*/
public abstract int getLocalPort();
/**
* <p>getRawReqeustUri.</p>
*
* @return a {@link java.net.URI} object.
*/
public abstract URI getRawReqeustUri();
/**
* <p>getProxyRemoteAddr.</p>
*
* @param realIpHeader a {@link java.lang.String} object.
* @return a {@link java.lang.String} object.
*/
public String getProxyRemoteAddr(String realIpHeader) {
String ip = null;
if (realIpHeader != null && realIpHeader.length() != 0) {
ip = getHeaderString(realIpHeader);
}
if (StringUtils.isBlank(ip)) {
ip = getHeaderString("X-Real-IP");
if (StringUtils.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) {
ip = getHeaderString("X-Forwarded-For");
if (StringUtils.isNotBlank(ip) && !"unknown".equalsIgnoreCase(ip)) {
ip = ip.split(",")[0];
}
}
if (StringUtils.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) {
ip = getHeaderString("Proxy-Client-IP");
}
if (StringUtils.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) {
ip = getHeaderString("WL-Proxy-Client-IP");
}
if (StringUtils.isNotBlank(ip)) {
ip = ip.toLowerCase();
}
}
return ip;
}
/**
* <p>getRemoteRealAddr.</p>
*
* @return a {@link java.lang.String} object.
*/
public String getProxyRemoteAddr() {
return getProxyRemoteAddr(null);
}
/**
* <p>getRemoteRealAddr.</p>
*
* @param realIpHeader a {@link java.lang.String} object.
* @return a {@link java.lang.String} object.
*/
public String getRemoteRealAddr(String realIpHeader) {
String host = getProxyRemoteAddr(realIpHeader);
if (host == null || host.equals("unknown")) {
host = getRemoteAddr();
}
return host;
}
/**
* <p>getRemoteRealAddr.</p>
*
* @return a {@link java.lang.String} object.
*/
public String getRemoteRealAddr() {
return getRemoteRealAddr(null);
}
}