diff --git a/src/main/services/VolcengineService.ts b/src/main/services/VolcengineService.ts index 47f5b80394..ae75d07f9a 100644 --- a/src/main/services/VolcengineService.ts +++ b/src/main/services/VolcengineService.ts @@ -69,11 +69,15 @@ export function _buildCanonicalHeaders(headers: Record): { canonicalHeaders: string signedHeaders: string } { - const sortedKeys = Object.keys(headers) - .map((k) => k.toLowerCase()) - .sort() + // Create a lowercase-keyed map to handle mixed-case input headers + const lowercaseHeaders: Record = {} + for (const [key, value] of Object.entries(headers)) { + lowercaseHeaders[key.toLowerCase()] = value + } - const canonicalHeaders = sortedKeys.map((key) => `${key}:${headers[key]?.trim() || ''}`).join('\n') + '\n' + const sortedKeys = Object.keys(lowercaseHeaders).sort() + + const canonicalHeaders = sortedKeys.map((key) => `${key}:${lowercaseHeaders[key]?.trim() || ''}`).join('\n') + '\n' const signedHeaders = sortedKeys.join(';') diff --git a/src/main/services/__tests__/VolcengineService.test.ts b/src/main/services/__tests__/VolcengineService.test.ts index 789bd93116..955adc0331 100644 --- a/src/main/services/__tests__/VolcengineService.test.ts +++ b/src/main/services/__tests__/VolcengineService.test.ts @@ -292,6 +292,21 @@ describe('VolcengineService', () => { expect(result.canonicalHeaders).toBe('host:example.com\nx-custom:\n') }) + + it('should handle mixed-case header keys', () => { + const headers = { + 'X-Date': '20240101T120000Z', + 'Content-Type': 'application/json', + Host: 'example.com' + } + + const result = _buildCanonicalHeaders(headers) + + expect(result.canonicalHeaders).toBe( + 'content-type:application/json\nhost:example.com\nx-date:20240101T120000Z\n' + ) + expect(result.signedHeaders).toBe('content-type;host;x-date') + }) }) describe('deriveSigningKey', () => {