Skip to content

Commit 4bfe27a

Browse files
Merge pull request #1775 from newrelic/1648_HttpResponseFixes
1648 http response fixes
2 parents 97330dc + 54cb21d commit 4bfe27a

File tree

28 files changed

+255
-168
lines changed

28 files changed

+255
-168
lines changed

instrumentation/http-async-client-4/src/main/java/com/nr/agent/instrumentation/httpasyncclient4/InboundWrapper.java

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,18 @@
1212
import org.apache.http.Header;
1313
import org.apache.http.HttpResponse;
1414

15-
import java.util.ArrayList;
15+
import java.util.Arrays;
1616
import java.util.List;
17+
import java.util.stream.Collectors;
1718

1819
/**
1920
* Wraps Apache http async client's inbound response headers for CAT.
2021
*/
2122
public class InboundWrapper extends ExtendedInboundHeaders {
22-
private final HttpResponse response;
23+
private final Header[] headers;
2324

2425
public InboundWrapper(HttpResponse response) {
25-
this.response = response;
26+
this.headers = response == null ? null : response.getAllHeaders();
2627
}
2728

2829
@Override
@@ -32,25 +33,25 @@ public HeaderType getHeaderType() {
3233

3334
@Override
3435
public String getHeader(String name) {
35-
// getHeaders always returns an array of length >= 0
36-
Header[] headers = response.getHeaders(name);
37-
if (headers.length > 0) {
38-
return headers[0].getValue();
39-
}
40-
return null;
36+
if (headers == null || name == null) return null;
37+
38+
return Arrays.stream(headers)
39+
.filter(h -> name.equals(h.getName()))
40+
.map(h -> h.getValue())
41+
.findFirst()
42+
.orElse(null);
4143
}
4244

4345
@Override
4446
public List<String> getHeaders(String name) {
45-
// getHeaders always returns an array of length >= 0
46-
Header[] headers = response.getHeaders(name);
47-
if (headers.length > 0) {
48-
List<String> result = new ArrayList<>(headers.length);
49-
for (Header header : headers) {
50-
result.add(header.getValue());
51-
}
52-
return result;
53-
}
54-
return null;
47+
if (headers == null || name == null) return null;
48+
49+
List<String> result = Arrays.stream(headers)
50+
.filter(h -> name.equals(h.getName()))
51+
.map(h -> h.getValue())
52+
.collect(Collectors.toList());
53+
54+
return result.isEmpty() ? null : result;
5555
}
56+
5657
}

instrumentation/http-async-client-4/src/main/java/org/apache/http/nio/protocol/HttpAsyncResponseConsumer_Instrumentation.java

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,21 @@ public class HttpAsyncResponseConsumer_Instrumentation<T> {
3636
@NewField
3737
private InboundWrapper inboundHeaders;
3838
@NewField
39-
private HttpResponse httpResponse;
39+
private Integer statusCode;
40+
@NewField
41+
private String reasonMessage;
4042

4143
/**
4244
* Invoked when a HTTP response message is received.
4345
*/
4446
public void responseReceived(HttpResponse response) throws IOException, HttpException {
4547
inboundHeaders = new InboundWrapper(response);
46-
httpResponse = response;
48+
49+
if (response != null && response.getStatusLine() != null) {
50+
statusCode = response.getStatusLine().getStatusCode();
51+
reasonMessage = response.getStatusLine().getReasonPhrase();
52+
}
53+
4754
Weaver.callOriginal();
4855
}
4956

@@ -64,6 +71,8 @@ public void responseCompleted(HttpContext context) {
6471
segment = null;
6572
uri = null;
6673
inboundHeaders = null;
74+
statusCode = null;
75+
reasonMessage = null;
6776
Weaver.callOriginal();
6877
}
6978

@@ -90,16 +99,10 @@ public void failed(Exception ex) {
9099
}
91100

92101
private Integer getStatusCode() {
93-
if (httpResponse != null && httpResponse.getStatusLine() != null) {
94-
return httpResponse.getStatusLine().getStatusCode();
95-
}
96-
return null;
102+
return statusCode;
97103
}
98104

99105
private String getReasonMessage() {
100-
if (httpResponse != null && httpResponse.getStatusLine() != null) {
101-
return httpResponse.getStatusLine().getReasonPhrase();
102-
}
103-
return null;
106+
return reasonMessage;
104107
}
105108
}

instrumentation/http4s-blaze-client-2.13_0.23/src/main/scala/com/nr/instrumentation/http4s/InboundResponseWrapper.scala

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
package com.nr.instrumentation.http4s
22

33
import com.newrelic.api.agent.{ExtendedInboundHeaders, HeaderType}
4-
import org.http4s.Response
4+
import org.http4s.Headers
55
import org.typelevel.ci.CIString
66

77
import scala.jdk.CollectionConverters._
88
import java.util
99

10-
class InboundResponseWrapper[F[_]](response: Response[F]) extends ExtendedInboundHeaders {
10+
class InboundResponseWrapper[F[_]](headers: Headers) extends ExtendedInboundHeaders {
1111
/**
1212
* Return the type of header key syntax used for this.
1313
*
@@ -25,8 +25,8 @@ class InboundResponseWrapper[F[_]](response: Response[F]) extends ExtendedInboun
2525
* @since 3.5.0
2626
*/
2727
override def getHeader(name: String): String =
28-
response.headers.headers.find(_.name == CIString(name)).map(_.value).orNull
28+
headers.headers.find(_.name == CIString(name)).map(_.value).orNull
2929

3030
override def getHeaders(name: String): util.List[String] =
31-
response.headers.headers.map(_.name.toString).asJava
31+
headers.headers.map(_.name.toString).asJava
3232
}

instrumentation/http4s-blaze-client-2.13_0.23/src/main/scala/com/nr/instrumentation/http4s/NewrelicClientMiddleware.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ object NewrelicClientMiddleware {
3131
.library("HTTP4S")
3232
.uri(new URI(req.uri.toString()))
3333
.procedure(req.method.toString())
34-
.inboundHeaders(new InboundResponseWrapper(response))
34+
.inboundHeaders(new InboundResponseWrapper(response.headers))
3535
.build())
3636
seg.end()
3737
response

instrumentation/http4s-ember-client-2.13_0.23/src/main/scala/com/nr/instrumentation/http4s/InboundResponseWrapper.scala

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
package com.nr.instrumentation.http4s
22

33
import com.newrelic.api.agent.{ExtendedInboundHeaders, HeaderType}
4-
import org.http4s.Response
4+
import org.http4s.Headers
55
import org.typelevel.ci.CIString
66

77
import scala.jdk.CollectionConverters._
88
import java.util
99

10-
class InboundResponseWrapper[F[_]](response: Response[F]) extends ExtendedInboundHeaders {
10+
class InboundResponseWrapper[F[_]](headers: Headers) extends ExtendedInboundHeaders {
1111
/**
1212
* Return the type of header key syntax used for this.
1313
*
@@ -25,8 +25,8 @@ class InboundResponseWrapper[F[_]](response: Response[F]) extends ExtendedInboun
2525
* @since 3.5.0
2626
*/
2727
override def getHeader(name: String): String =
28-
response.headers.headers.find(_.name == CIString(name)).map(_.value).orNull
28+
headers.headers.find(_.name == CIString(name)).map(_.value).orNull
2929

3030
override def getHeaders(name: String): util.List[String] =
31-
response.headers.headers.map(_.name.toString).asJava
31+
headers.headers.map(_.name.toString).asJava
3232
}

instrumentation/http4s-ember-client-2.13_0.23/src/main/scala/com/nr/instrumentation/http4s/NewrelicClientMiddleware.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ object NewrelicClientMiddleware {
3232
.library("HTTP4S")
3333
.uri(new URI(req.uri.toString()))
3434
.procedure(req.method.toString())
35-
.inboundHeaders(new InboundResponseWrapper(response))
35+
.inboundHeaders(new InboundResponseWrapper(response.headers))
3636
.build())
3737
seg.end()
3838
response

instrumentation/httpclient-3.1/src/main/java/com/nr/agent/instrumentation/httpclient31/InboundWrapper.java

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -12,36 +12,38 @@
1212
import org.apache.commons.httpclient.Header;
1313
import org.apache.commons.httpclient.HttpMethod;
1414

15-
import java.util.ArrayList;
15+
import java.util.Arrays;
1616
import java.util.List;
17+
import java.util.stream.Collectors;
1718

1819
public class InboundWrapper extends ExtendedInboundHeaders {
19-
private final HttpMethod delegate;
20+
private final Header[] headers;
2021

2122
public InboundWrapper(HttpMethod response) {
22-
this.delegate = response;
23+
this.headers = response == null ? null : response.getResponseHeaders();
2324
}
2425

2526
@Override
2627
public String getHeader(String name) {
27-
Header[] headers = delegate.getResponseHeaders(name);
28-
if (headers.length > 0) {
29-
return headers[0].getValue();
30-
}
31-
return null;
28+
if (headers == null || name == null) return null;
29+
30+
return Arrays.stream(headers)
31+
.filter(h -> name.equals(h.getName()))
32+
.map(h -> h.getValue())
33+
.findFirst()
34+
.orElse(null);
3235
}
3336

3437
@Override
3538
public List<String> getHeaders(String name) {
36-
Header[] headers = delegate.getResponseHeaders(name);
37-
if (headers.length > 0) {
38-
List<String> result = new ArrayList<>(headers.length);
39-
for (Header header : headers) {
40-
result.add(header.getValue());
41-
}
42-
return result;
43-
}
44-
return null;
39+
if (headers == null || name == null) return null;
40+
41+
List<String> result = Arrays.stream(headers)
42+
.filter(h -> name.equals(h.getName()))
43+
.map(h -> h.getValue())
44+
.collect(Collectors.toList());
45+
46+
return result.isEmpty() ? null : result;
4547
}
4648

4749
@Override

instrumentation/httpclient-4.0/src/main/java/com/nr/agent/instrumentation/httpclient40/InboundWrapper.java

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -12,36 +12,38 @@
1212
import org.apache.http.Header;
1313
import org.apache.http.HttpResponse;
1414

15-
import java.util.ArrayList;
15+
import java.util.Arrays;
1616
import java.util.List;
17+
import java.util.stream.Collectors;
1718

1819
public class InboundWrapper extends ExtendedInboundHeaders {
19-
private final HttpResponse delegate;
20+
private final Header[] headers;
2021

2122
public InboundWrapper(HttpResponse response) {
22-
this.delegate = response;
23+
this.headers = response == null ? null : response.getAllHeaders();
2324
}
2425

2526
@Override
2627
public String getHeader(String name) {
27-
Header[] headers = delegate.getHeaders(name);
28-
if (headers.length > 0) {
29-
return headers[0].getValue();
30-
}
31-
return null;
28+
if (headers == null || name == null) return null;
29+
30+
return Arrays.stream(headers)
31+
.filter(h -> name.equals(h.getName()))
32+
.map(h -> h.getValue())
33+
.findFirst()
34+
.orElse(null);
3235
}
3336

3437
@Override
3538
public List<String> getHeaders(String name) {
36-
Header[] headers = delegate.getHeaders(name);
37-
if (headers.length > 0) {
38-
List<String> result = new ArrayList<>(headers.length);
39-
for (Header header : headers) {
40-
result.add(header.getValue());
41-
}
42-
return result;
43-
}
44-
return null;
39+
if (headers == null || name == null) return null;
40+
41+
List<String> result = Arrays.stream(headers)
42+
.filter(h -> name.equals(h.getName()))
43+
.map(h -> h.getValue())
44+
.collect(Collectors.toList());
45+
46+
return result.isEmpty() ? null : result;
4547
}
4648

4749
@Override

instrumentation/httpclient-5.0/src/main/java/com/nr/agent/instrumentation/httpclient50/InboundWrapper.java

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -12,36 +12,38 @@
1212
import org.apache.hc.core5.http.Header;
1313
import org.apache.hc.core5.http.HttpResponse;
1414

15-
import java.util.ArrayList;
15+
import java.util.Arrays;
1616
import java.util.List;
17+
import java.util.stream.Collectors;
1718

1819
public class InboundWrapper extends ExtendedInboundHeaders {
19-
private final HttpResponse delegate;
20+
private final Header[] headers;
2021

2122
public InboundWrapper(HttpResponse response) {
22-
this.delegate = response;
23+
this.headers = response == null ? null : response.getHeaders();
2324
}
2425

2526
@Override
2627
public String getHeader(String name) {
27-
Header[] headers = delegate.getHeaders(name);
28-
if (headers.length > 0) {
29-
return headers[0].getValue();
30-
}
31-
return null;
28+
if (headers == null || name == null) return null;
29+
30+
return Arrays.stream(headers)
31+
.filter(h -> name.equals(h.getName()))
32+
.map(h -> h.getValue())
33+
.findFirst()
34+
.orElse(null);
3235
}
3336

3437
@Override
3538
public List<String> getHeaders(String name) {
36-
Header[] headers = delegate.getHeaders(name);
37-
if (headers.length > 0) {
38-
List<String> result = new ArrayList<>(headers.length);
39-
for (Header header : headers) {
40-
result.add(header.getValue());
41-
}
42-
return result;
43-
}
44-
return null;
39+
if (headers == null || name == null) return null;
40+
41+
List<String> result = Arrays.stream(headers)
42+
.filter(h -> name.equals(h.getName()))
43+
.map(h -> h.getValue())
44+
.collect(Collectors.toList());
45+
46+
return result.isEmpty() ? null : result;
4547
}
4648

4749
@Override

instrumentation/httpclient-jdk11/src/main/java/com.nr.agent.instrumentation.httpclient/InboundWrapper.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,15 @@
33
import com.newrelic.api.agent.HeaderType;
44
import com.newrelic.api.agent.InboundHeaders;
55

6+
import java.net.http.HttpHeaders;
67
import java.net.http.HttpResponse;
7-
import java.util.function.Function;
88

99
public class InboundWrapper implements InboundHeaders {
1010

11-
private final HttpResponse delegate;
11+
private final HttpHeaders headers;
1212

1313
public InboundWrapper(HttpResponse response) {
14-
this.delegate = response;
14+
this.headers = response == null ? null : response.headers();
1515
}
1616

1717
@Override
@@ -21,6 +21,6 @@ public HeaderType getHeaderType() {
2121

2222
@Override
2323
public String getHeader(String name) {
24-
return delegate.headers().firstValue(name).map(String::toString).orElse(null);
24+
return headers.firstValue(name).map(String::toString).orElse(null);
2525
}
2626
}

0 commit comments

Comments
 (0)