package rocks.inspectit.agent.java.sensor.method.remote.client.http; import java.net.HttpURLConnection; import io.opentracing.propagation.TextMap; import rocks.inspectit.agent.java.config.impl.RegisteredSensorConfig; import rocks.inspectit.agent.java.sensor.method.remote.client.RemoteClientSensor; import rocks.inspectit.agent.java.tracing.core.adapter.ClientAdapterProvider; import rocks.inspectit.agent.java.tracing.core.adapter.ClientRequestAdapter; import rocks.inspectit.agent.java.tracing.core.adapter.ResponseAdapter; import rocks.inspectit.agent.java.tracing.core.adapter.http.HttpClientRequestAdapter; import rocks.inspectit.agent.java.tracing.core.adapter.http.HttpResponseAdapter; import rocks.inspectit.agent.java.tracing.core.adapter.http.data.HttpRequest; import rocks.inspectit.agent.java.tracing.core.adapter.http.data.HttpResponse; import rocks.inspectit.agent.java.tracing.core.adapter.http.data.impl.UrlConnectionHttpClientRequestResponse; /** * Remote client sensor for intercepting HTTP calls made with Java's {@link HttpURLConnection}. * <p> * This sensor provides the {@link ResponseAdapter} only in the * {@code java.net.HttpURLConnection#getInputStream()}. This way request and response handling can * be separated in two different method hooks, as the {@link HttpURLConnection} API provides such * possibility. * <p> * Targeted instrumentation methods: * <ul> * <li>{@code java.net.HttpURLConnection#connect()} * <li>{@code java.net.HttpURLConnection#getOutputStream()} * <li>{@code java.net.HttpURLConnection#getInputStream()} * </ul> * * @author Ivan Senic */ public class UrlConnectionSensor extends RemoteClientSensor implements ClientAdapterProvider { /** * Name of the get input stream method. */ public static final String GET_INPUT_STREAM_METHOD = "getInputStream"; /** * {@inheritDoc} */ @Override public ClientRequestAdapter<TextMap> getClientRequestAdapter(Object object, Object[] parameters, RegisteredSensorConfig rsc) { Object urlConnection = object; if (urlConnection instanceof HttpURLConnection) { HttpRequest request = new UrlConnectionHttpClientRequestResponse((HttpURLConnection) urlConnection); return new HttpClientRequestAdapter(request); } else { return null; } } /** * {@inheritDoc} */ @Override public ResponseAdapter getClientResponseAdapter(Object object, Object[] parameters, Object result, RegisteredSensorConfig rsc) { Object urlConnection = object; if ((urlConnection instanceof HttpURLConnection) && GET_INPUT_STREAM_METHOD.equals(rsc.getTargetMethodName())) { HttpResponse response = new UrlConnectionHttpClientRequestResponse((HttpURLConnection) urlConnection); return new HttpResponseAdapter(response); } else { return null; } } /** * {@inheritDoc} */ @Override protected ClientAdapterProvider getClientAdapterProvider() { return this; } }