Skip to content

Commit e46a446

Browse files
lachmattpellaredCodeBlanch
authored
[api-baggage] fix encoding of space chars in baggage item value (#5303)
Co-authored-by: Robert Pająk <[email protected]> Co-authored-by: Mikel Blanchard <[email protected]>
1 parent dbcc511 commit e46a446

File tree

3 files changed

+21
-8
lines changed

3 files changed

+21
-8
lines changed

src/OpenTelemetry.Api/CHANGELOG.md

+5
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@
22

33
## Unreleased
44

5+
* **Breaking change:** Fix space character encoding from `+` to `%20`
6+
for baggage item values when propagating baggage as defined in
7+
[W3C Baggage propagation format specification](https://www.w3.org/TR/baggage/).
8+
([#5303](https://github.com/open-telemetry/opentelemetry-dotnet/pull/5303))
9+
510
## 1.8.0
611

712
Released 2024-Apr-02

src/OpenTelemetry.Api/Context/Propagation/BaggagePropagator.cs

+3-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
// Copyright The OpenTelemetry Authors
22
// SPDX-License-Identifier: Apache-2.0
33

4-
using System.Net;
54
using System.Text;
65
using OpenTelemetry.Internal;
76

@@ -94,7 +93,7 @@ public override void Inject<T>(PropagationContext context, T carrier, Action<T,
9493
continue;
9594
}
9695

97-
baggage.Append(WebUtility.UrlEncode(item.Key)).Append('=').Append(WebUtility.UrlEncode(item.Value)).Append(',');
96+
baggage.Append(Uri.EscapeDataString(item.Key)).Append('=').Append(Uri.EscapeDataString(item.Value)).Append(',');
9897
}
9998
while (e.MoveNext() && ++itemCount < MaxBaggageItems && baggage.Length < MaxBaggageLength);
10099
baggage.Remove(baggage.Length - 1, 1);
@@ -141,8 +140,8 @@ internal static bool TryExtractBaggage(string[] baggageCollection, out Dictionar
141140
continue;
142141
}
143142

144-
var key = WebUtility.UrlDecode(parts[0]);
145-
var value = WebUtility.UrlDecode(parts[1]);
143+
var key = Uri.UnescapeDataString(parts[0]);
144+
var value = Uri.UnescapeDataString(parts[1]);
146145

147146
if (string.IsNullOrEmpty(key) || string.IsNullOrEmpty(value))
148147
{

test/OpenTelemetry.Api.Tests/Trace/Propagation/BaggagePropagatorTest.cs

+13-4
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,9 @@ public void ValidateSpecialCharsBaggageExtraction()
131131
Assert.Equal("key%28%293", escapedKey);
132132
Assert.Equal("value%28%29%21%26%3B%3A", escapedValue);
133133

134-
var initialBaggage = $"key+1=value+1,{encodedKey}={encodedValue},{escapedKey}={escapedValue}";
134+
var initialBaggage =
135+
$"key%201=value%201,{encodedKey}={encodedValue},{escapedKey}={escapedValue},key4=%20%21%22%23%24%25%26%27%28%29%2A%2B%2C-.%2F0123456789%3A%3B%3C%3D%3E%3F%40ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D~";
136+
135137
var carrier = new List<KeyValuePair<string, string>>
136138
{
137139
new KeyValuePair<string, string>(BaggagePropagator.BaggageHeaderName, initialBaggage),
@@ -142,11 +144,11 @@ public void ValidateSpecialCharsBaggageExtraction()
142144
Assert.False(propagationContext == default);
143145
Assert.True(propagationContext.ActivityContext == default);
144146

145-
Assert.Equal(3, propagationContext.Baggage.Count);
147+
Assert.Equal(4, propagationContext.Baggage.Count);
146148

147149
var actualBaggage = propagationContext.Baggage.GetBaggage();
148150

149-
Assert.Equal(3, actualBaggage.Count);
151+
Assert.Equal(4, actualBaggage.Count);
150152

151153
Assert.True(actualBaggage.ContainsKey("key 1"));
152154
Assert.Equal("value 1", actualBaggage["key 1"]);
@@ -156,6 +158,10 @@ public void ValidateSpecialCharsBaggageExtraction()
156158

157159
Assert.True(actualBaggage.ContainsKey("key()3"));
158160
Assert.Equal("value()!&;:", actualBaggage["key()3"]);
161+
162+
// x20-x7E range
163+
Assert.True(actualBaggage.ContainsKey("key4"));
164+
Assert.Equal(" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~", actualBaggage["key4"]);
159165
}
160166

161167
[Fact]
@@ -195,11 +201,14 @@ public void ValidateSpecialCharsBaggageInjection()
195201
{
196202
{ "key 1", "value 1" },
197203
{ "key2", "!x_x,x-x&x(x\");:" },
204+
205+
// x20-x7E range
206+
{ "key3", " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~" },
198207
}));
199208

200209
this.baggage.Inject(propagationContext, carrier, Setter);
201210

202211
Assert.Single(carrier);
203-
Assert.Equal("key+1=value+1,key2=!x_x%2Cx-x%26x(x%22)%3B%3A", carrier[BaggagePropagator.BaggageHeaderName]);
212+
Assert.Equal("key%201=value%201,key2=%21x_x%2Cx-x%26x%28x%22%29%3B%3A,key3=%20%21%22%23%24%25%26%27%28%29%2A%2B%2C-.%2F0123456789%3A%3B%3C%3D%3E%3F%40ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D~", carrier[BaggagePropagator.BaggageHeaderName]);
204213
}
205214
}

0 commit comments

Comments
 (0)