From d7cebccf0c0a6d219aee270b0afa2f49025d99ac Mon Sep 17 00:00:00 2001 From: Robert Hafner Date: Mon, 16 Oct 2017 02:05:16 -0400 Subject: [PATCH] Non-ASCII characters included in X-SPAN-NAME header. (#735) --- .../AbstractTraceHttpRequestInterceptor.java | 4 +++- .../TraceRestTemplateInterceptorTests.java | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/AbstractTraceHttpRequestInterceptor.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/AbstractTraceHttpRequestInterceptor.java index b1f17fcc7..57b267ac4 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/AbstractTraceHttpRequestInterceptor.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/AbstractTraceHttpRequestInterceptor.java @@ -66,7 +66,9 @@ abstract class AbstractTraceHttpRequestInterceptor { } private String getName(URI uri) { - return SpanNameUtil.shorten(uriScheme(uri) + ":" + uri.getPath()); + // The returned name should comply with RFC 882 - Section 3.1.2. + // i.e Header values must composed of printable ASCII values. + return SpanNameUtil.shorten(uriScheme(uri) + ":" + uri.getRawPath()); } private String uriScheme(URI uri) { diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/TraceRestTemplateInterceptorTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/TraceRestTemplateInterceptorTests.java index 9a892246d..f207ebec5 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/TraceRestTemplateInterceptorTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/TraceRestTemplateInterceptorTests.java @@ -22,6 +22,7 @@ import java.util.List; import java.util.Map; import java.util.Random; +import org.apache.commons.lang.StringUtils; import org.junit.After; import org.junit.Assert; import org.junit.Before; @@ -156,6 +157,23 @@ public class TraceRestTemplateInterceptorTests { then(this.testController.span).hasNameEqualTo("http:/"); } + @Test + public void createdSpanNameHasOnlyPrintableAsciiCharactersForNonEncodedURIWithNonAsciiChars() { + this.tracer.continueSpan(Span.builder().traceId(1L).spanId(2L).exportable(false).build()); + + try { + this.template.getForEntity("/cas~fs~划", Map.class).getBody(); + } + catch (Exception e) { + + } + + String spanName = this.spanAccumulator.getSpans().get(0).getName(); + then(this.spanAccumulator.getSpans().get(0).getName()).isEqualTo("http:/cas~fs~%C3%A5%CB%86%E2%80%99"); + then(StringUtils.isAsciiPrintable(spanName)); + then(ExceptionUtils.getLastException()).isNull(); + } + @Test public void willShortenTheNameOfTheSpan() { this.tracer.continueSpan(Span.builder().traceId(1L).spanId(2L).exportable(false).build());