Skip to content

Commit

Permalink
Merge pull request dropwizard#961 from phearnot/feature/uri-extraction
Browse files Browse the repository at this point in the history
Improve hostname extraction for wrapped HTTP requests
  • Loading branch information
ryantenney authored Jun 20, 2016
2 parents 637369e + a994a39 commit a30d112
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 6 deletions.
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
package com.codahale.metrics.httpclient;

import org.apache.http.HttpRequest;
import org.apache.http.RequestLine;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpRequestWrapper;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.utils.URIBuilder;

import java.net.URI;
Expand All @@ -26,11 +27,9 @@ public String getNameFor(String name, HttpRequest request) {
new HttpClientMetricNameStrategy() {
@Override
public String getNameFor(String name, HttpRequest request) {
final RequestLine requestLine = request.getRequestLine();
final URI uri = URI.create(requestLine.getUri());
return name(HttpClient.class,
name,
uri.getHost(),
requestURI(request).getHost(),
methodNameString(request));
}
};
Expand All @@ -40,8 +39,7 @@ public String getNameFor(String name, HttpRequest request) {
@Override
public String getNameFor(String name, HttpRequest request) {
try {
final RequestLine requestLine = request.getRequestLine();
final URIBuilder url = new URIBuilder(requestLine.getUri());
final URIBuilder url = new URIBuilder(requestURI(request));
return name(HttpClient.class,
name,
url.removeQuery().build().toString(),
Expand All @@ -55,4 +53,13 @@ public String getNameFor(String name, HttpRequest request) {
private static String methodNameString(HttpRequest request) {
return request.getRequestLine().getMethod().toLowerCase() + "-requests";
}

private static URI requestURI(HttpRequest request) {
if (request instanceof HttpRequestWrapper)
return requestURI(((HttpRequestWrapper) request).getOriginal());

return (request instanceof HttpUriRequest) ?
((HttpUriRequest) request).getURI() :
URI.create(request.getRequestLine().getUri());
}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,16 @@
package com.codahale.metrics.httpclient;

import org.apache.http.HttpRequest;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.client.methods.HttpRequestWrapper;
import org.apache.http.client.utils.URIUtils;
import org.junit.Test;

import java.net.URI;
import java.net.URISyntaxException;

import static com.codahale.metrics.httpclient.HttpClientMetricNameStrategies.*;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
Expand Down Expand Up @@ -35,11 +41,44 @@ public void hostAndMethodWithoutName() {
is("org.apache.http.client.HttpClient.my.host.com.post-requests"));
}

@Test
public void hostAndMethodWithNameInWrappedRequest() throws URISyntaxException {
HttpRequest request = rewriteRequestURI(new HttpPost("http://my.host.com/whatever"));

assertThat(HOST_AND_METHOD.getNameFor("some-service", request),
is("org.apache.http.client.HttpClient.some-service.my.host.com.post-requests"));
}

@Test
public void hostAndMethodWithoutNameInWrappedRequest() throws URISyntaxException {
HttpRequest request = rewriteRequestURI(new HttpPost("http://my.host.com/whatever"));

assertThat(HOST_AND_METHOD.getNameFor(null, request),
is("org.apache.http.client.HttpClient.my.host.com.post-requests"));
}

@Test
public void querylessUrlAndMethodWithName() {
assertThat(QUERYLESS_URL_AND_METHOD.getNameFor(
"some-service",
new HttpPut("https://thing.com:8090/my/path?ignore=this&and=this")),
is("org.apache.http.client.HttpClient.some-service.https://thing.com:8090/my/path.put-requests"));
}

@Test
public void querylessUrlAndMethodWithNameInWrappedRequest() throws URISyntaxException {
HttpRequest request = rewriteRequestURI(new HttpPut("https://thing.com:8090/my/path?ignore=this&and=this"));
assertThat(QUERYLESS_URL_AND_METHOD.getNameFor(
"some-service",
request),
is("org.apache.http.client.HttpClient.some-service.https://thing.com:8090/my/path.put-requests"));
}

private static HttpRequest rewriteRequestURI(HttpRequest request) throws URISyntaxException {
HttpRequestWrapper wrapper = HttpRequestWrapper.wrap(request);
URI uri = URIUtils.rewriteURI(wrapper.getURI(), null, true);
wrapper.setURI(uri);

return wrapper;
}
}

0 comments on commit a30d112

Please sign in to comment.