Skip to content

Commit 5024429

Browse files
Handle when equals sign shows up in a parameter (microsoft#265737)
ref microsoft#265733
1 parent a7cdefd commit 5024429

File tree

2 files changed

+23
-6
lines changed

2 files changed

+23
-6
lines changed

src/vs/base/common/oauth.ts

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -872,19 +872,27 @@ export function parseWWWAuthenticateHeader(wwwAuthenticateHeaderValue: string):
872872
currentChallenge = { scheme: beforeSpace.trim(), params: {} };
873873

874874
// Parse the parameter part
875-
const [key, value] = afterSpace.split('=').map(s => s.trim().replace(/"/g, ''));
876-
if (key && value !== undefined) {
877-
currentChallenge.params[key] = value;
875+
const equalIndex = afterSpace.indexOf('=');
876+
if (equalIndex > 0) {
877+
const key = afterSpace.substring(0, equalIndex).trim();
878+
const value = afterSpace.substring(equalIndex + 1).trim().replace(/^"|"$/g, '');
879+
if (key && value !== undefined) {
880+
currentChallenge.params[key] = value;
881+
}
878882
}
879883
continue;
880884
}
881885
}
882886

883887
// This is a parameter for the current challenge
884888
if (currentChallenge) {
885-
const [key, value] = token.split('=').map(s => s.trim().replace(/"/g, ''));
886-
if (key && value !== undefined) {
887-
currentChallenge.params[key] = value;
889+
const equalIndex = token.indexOf('=');
890+
if (equalIndex > 0) {
891+
const key = token.substring(0, equalIndex).trim();
892+
const value = token.substring(equalIndex + 1).trim().replace(/^"|"$/g, '');
893+
if (key && value !== undefined) {
894+
currentChallenge.params[key] = value;
895+
}
888896
}
889897
}
890898
}

src/vs/base/test/common/oauth.test.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,15 @@ suite('OAuth', () => {
344344
});
345345
});
346346

347+
test('parseWWWAuthenticateHeader should correctly parse parameters with equal signs', () => {
348+
const result = parseWWWAuthenticateHeader('Bearer resource_metadata="https://example.com/.well-known/oauth-protected-resource?v=1"');
349+
assert.strictEqual(result.length, 1);
350+
assert.strictEqual(result[0].scheme, 'Bearer');
351+
assert.deepStrictEqual(result[0].params, {
352+
resource_metadata: 'https://example.com/.well-known/oauth-protected-resource?v=1'
353+
});
354+
});
355+
347356
test('parseWWWAuthenticateHeader should correctly parse multiple', () => {
348357
const result = parseWWWAuthenticateHeader('Bearer realm="api", error="invalid_token", error_description="The access token expired", Basic realm="hi"');
349358

0 commit comments

Comments
 (0)