package ameba.message.filtering;
import javax.annotation.Priority;
import javax.inject.Singleton;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.container.PreMatching;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.UriBuilder;
import java.io.IOException;
import java.util.List;
/**
* <p>LoadBalancerRequestFilter class.</p>
*
* @author icode
*
*/
@PreMatching
@Priority(500)
@Singleton
public class LoadBalancerRequestFilter implements ContainerRequestFilter {
/**
* {@inheritDoc}
*/
@Override
public void filter(ContainerRequestContext ctx) throws IOException {
String scheme = getValue(ctx.getHeaders(), "x-forwarded-proto");
String port = getValue(ctx.getHeaders(), "x-forwarded-port");
if (scheme == null && port == null)
return;
UriBuilder baseBuilder = ctx.getUriInfo().getBaseUriBuilder();
UriBuilder requestBuilder = ctx.getUriInfo().getRequestUriBuilder();
if (scheme != null) {
baseBuilder.scheme(scheme);
requestBuilder.scheme(scheme);
baseBuilder.port(443);
requestBuilder.port(443);
}
if (port != null) {
int nPort = Integer.parseInt(port);
baseBuilder.port(nPort);
requestBuilder.port(nPort);
}
ctx.setRequestUri(baseBuilder.build(), requestBuilder.build());
}
private String getValue(MultivaluedMap<String, String> headers, String header) {
List<String> values = headers.get(header);
if (values == null || values.isEmpty())
return null;
return values.get(0);
}
}