package rocks.inspectit.agent.java.tracing.core.adapter.http.data.impl;
import java.util.Iterator;
import java.util.Map.Entry;
import rocks.inspectit.agent.java.sdk.opentracing.internal.constants.PropagationConstants;
import rocks.inspectit.agent.java.tracing.core.adapter.http.data.HttpRequest;
import rocks.inspectit.agent.java.util.ReflectionCache;
/**
* The implementation of the {@link HttpClientRequest} that works with the
* {@link org.apache.http.HttpRequest}.
*
* @author Ivan Senic
*
*/
public class ApacheHttpClientV40HttpClientRequest implements HttpRequest {
/**
* FQN of the org.apache.http.HttpMessage.
*/
private static final String ORG_APACHE_HTTP_HTTP_MESSAGE_FQN = "org.apache.http.HttpMessage";
/**
* FQN of the org.apache.http.RequestLine.
*/
private static final String ORG_APACHE_HTTP_REQUEST_LINE_FQN = "org.apache.http.RequestLine";
/**
* FQN of the org.apache.http.HttpRequest.
*/
private static final String ORG_APACHE_HTTP_HTTP_REQUEST_FQN = "org.apache.http.HttpRequest";
/**
* Reflection cache to use for method invocation.
*/
private final ReflectionCache cache;
/**
* Apache http request, instance of org.apache.http.HttpRequest.
*/
private final Object apacheHttpRequest;
/**
* @param apacheHttpRequest
* Apache http request, instance of org.apache.http.HttpRequest.
* @param cache
* reflection cache to use
*/
public ApacheHttpClientV40HttpClientRequest(Object apacheHttpRequest, ReflectionCache cache) {
this.apacheHttpRequest = apacheHttpRequest;
this.cache = cache;
}
/**
* {@inheritDoc}
*/
@Override
public boolean startClientSpan() {
Object containsHeader = cache.invokeMethod(apacheHttpRequest.getClass(), "containsHeader", new Class<?>[] { String.class }, apacheHttpRequest, new Object[] { PropagationConstants.SPAN_ID }, null, ORG_APACHE_HTTP_HTTP_MESSAGE_FQN);
// make sure we return true if the contains key is null
return (null == containsHeader) || Boolean.FALSE.equals(containsHeader);
}
/**
* {@inheritDoc}
*/
@Override
public String getUrl() {
// Apache provides complete URL as the URI (no other option)
Object requestLine = getRequestLine();
if (null != requestLine) {
return (String) cache.invokeMethod(requestLine.getClass(), "getUri", new Class<?>[] {}, requestLine, new Object[] {}, null, ORG_APACHE_HTTP_REQUEST_LINE_FQN);
}
return null;
}
/**
* {@inheritDoc}
*/
@Override
public String getHttpMethod() {
Object requestLine = getRequestLine();
if (null != requestLine) {
return (String) cache.invokeMethod(requestLine.getClass(), "getMethod", new Class<?>[] {}, requestLine, new Object[] {}, null, ORG_APACHE_HTTP_REQUEST_LINE_FQN);
}
return null;
}
/**
* {@inheritDoc}
*/
@Override
public Iterator<Entry<String, String>> iterator() {
throw new UnsupportedOperationException("Client request does not provide baggage iterator.");
}
/**
* {@inheritDoc}
*/
@Override
public void put(String key, String value) {
cache.invokeMethod(apacheHttpRequest.getClass(), "setHeader", new Class<?>[] { String.class, String.class }, apacheHttpRequest, new Object[] { key, value }, null,
ORG_APACHE_HTTP_HTTP_MESSAGE_FQN);
}
/**
* @return Returns the request line from the request.
*/
private Object getRequestLine() {
return cache.invokeMethod(apacheHttpRequest.getClass(), "getRequestLine", new Class<?>[] {}, apacheHttpRequest, new Object[] {}, null, ORG_APACHE_HTTP_HTTP_REQUEST_FQN);
}
}