package com.github.kristofa.brave.servlet.internal;
import com.github.kristofa.brave.Brave;
import com.github.kristofa.brave.ServerResponseInterceptor;
import com.github.kristofa.brave.internal.MaybeAddClientAddress;
import javax.servlet.http.HttpServletRequest;
import zipkin.Constants;
/**
* Parses the {@link Constants#CLIENT_ADDR client address}, by looking at "X-Forwarded-For", then
* the remote address of the request. This performs no DNS lookups.
*
* <p>This is a hack as {@link ServerResponseInterceptor} doesn't yet support client addresses.
*/
public final class MaybeAddClientAddressFromRequest
extends MaybeAddClientAddress<HttpServletRequest> {
public static MaybeAddClientAddressFromRequest create(Brave brave) {
return new MaybeAddClientAddressFromRequest(brave);
}
MaybeAddClientAddressFromRequest(Brave brave) { // intentionally hidden
super(brave);
}
@Override protected byte[] parseAddressBytes(HttpServletRequest input) {
byte[] addressBytes = ipStringToBytes(input.getHeader("X-Forwarded-For"));
if (addressBytes == null) addressBytes = ipStringToBytes(input.getRemoteAddr());
return addressBytes;
}
@Override protected int parsePort(HttpServletRequest input) {
return input.getRemotePort();
}
}