From 986f631765b1684b5d20dafc6210b121e00e73b9 Mon Sep 17 00:00:00 2001 From: Ruben Vargas Date: Mon, 27 Jul 2020 19:55:23 -0500 Subject: [PATCH] fix: correlation context propagation extract for a single entry Signed-off-by: Ruben Vargas --- .../propagation/HttpCorrelationContext.ts | 6 ++- .../HttpCorrelationContext.test.ts | 44 ++++++++++++++++--- 2 files changed, 41 insertions(+), 9 deletions(-) diff --git a/packages/opentelemetry-core/src/correlation-context/propagation/HttpCorrelationContext.ts b/packages/opentelemetry-core/src/correlation-context/propagation/HttpCorrelationContext.ts index 0101e901f55..c4fc471bb9a 100644 --- a/packages/opentelemetry-core/src/correlation-context/propagation/HttpCorrelationContext.ts +++ b/packages/opentelemetry-core/src/correlation-context/propagation/HttpCorrelationContext.ts @@ -91,13 +91,15 @@ export class HttpCorrelationContext implements HttpTextPropagator { return context; } const pairs = headerValue.split(ITEMS_SEPARATOR); - if (pairs.length == 1) return context; pairs.forEach(entry => { const keyPair = this._parsePairKeyValue(entry); if (keyPair) { correlationContext[keyPair.key] = { value: keyPair.value }; } }); + if (Object.entries(correlationContext).length <= 0) { + return context; + } return setCorrelationContext(context, correlationContext); } @@ -107,7 +109,7 @@ export class HttpCorrelationContext implements HttpTextPropagator { const keyPairPart = valueProps.shift(); if (!keyPairPart) return; const keyPair = keyPairPart.split(KEY_PAIR_SEPARATOR); - if (keyPair.length <= 1) return; + if (keyPair.length != 2) return; const key = decodeURIComponent(keyPair[0].trim()); let value = decodeURIComponent(keyPair[1].trim()); if (valueProps.length > 0) { diff --git a/packages/opentelemetry-core/test/correlation-context/HttpCorrelationContext.test.ts b/packages/opentelemetry-core/test/correlation-context/HttpCorrelationContext.test.ts index 8d294d83629..981f7a78c78 100644 --- a/packages/opentelemetry-core/test/correlation-context/HttpCorrelationContext.test.ts +++ b/packages/opentelemetry-core/test/correlation-context/HttpCorrelationContext.test.ts @@ -152,19 +152,49 @@ describe('HttpCorrelationContext', () => { }); it('should gracefully handle an invalid header', () => { - const testCases: Record = { - invalidNoKeyValuePair: '289371298nekjh2939299283jbk2b', - invalidDoubleEqual: 'key1==value;key2=value2', - invalidWrongKeyValueFormat: 'key1:value;key2=value2', - invalidDoubleSemicolon: 'key1:value;;key2=value2', + const testCases: Record< + string, + { + header: string; + correlationContext: CorrelationContext | undefined; + } + > = { + invalidNoKeyValuePair: { + header: '289371298nekjh2939299283jbk2b', + correlationContext: undefined, + }, + invalidDoubleEqual: { + header: 'key1==value;key2=value2', + correlationContext: undefined, + }, + invalidWrongKeyValueFormat: { + header: 'key1:value;key2=value2', + correlationContext: undefined, + }, + invalidDoubleSemicolon: { + header: 'key1:value;;key2=value2', + correlationContext: undefined, + }, + mixInvalidAndValidKeys: { + header: 'key1==value,key2=value2', + correlationContext: { + key2: { + value: 'value2', + }, + }, + }, }; Object.getOwnPropertyNames(testCases).forEach(testCase => { - carrier[CORRELATION_CONTEXT_HEADER] = testCases[testCase]; + carrier[CORRELATION_CONTEXT_HEADER] = testCases[testCase].header; const extractedSpanContext = getCorrelationContext( httpTraceContext.extract(Context.ROOT_CONTEXT, carrier, defaultGetter) ); - assert.deepStrictEqual(extractedSpanContext, undefined, testCase); + assert.deepStrictEqual( + extractedSpanContext, + testCases[testCase].correlationContext, + testCase + ); }); }); });