Skip to content

Commit 3f7beaa

Browse files
QuantGeekDevclaude
andcommitted
fix: use shared DEFAULT_CORS_CONFIG in HTTP stream transport
Closes #93 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent c42c4e2 commit 3f7beaa

File tree

2 files changed

+46
-6
lines changed

2 files changed

+46
-6
lines changed

src/transports/http/server.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { AbstractTransport } from '../base.js';
44
import { JSONRPCMessage, isInitializeRequest } from '@modelcontextprotocol/sdk/types.js';
55
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
66
import { HttpStreamTransportConfig } from './types.js';
7+
import { DEFAULT_CORS_CONFIG } from '../sse/types.js';
78
import { logger } from '../../core/Logger.js';
89
import { ProtectedResourceMetadata } from '../../auth/metadata/protected-resource.js';
910
import { handleAuthentication } from '../utils/auth-handler.js';
@@ -224,13 +225,13 @@ export class HttpStreamTransport extends AbstractTransport {
224225
if (!this._config.cors) return;
225226

226227
const cors = this._config.cors;
227-
res.setHeader('Access-Control-Allow-Origin', cors.allowOrigin || '*');
228-
res.setHeader('Access-Control-Allow-Methods', cors.allowMethods || 'GET, POST, OPTIONS');
229-
res.setHeader('Access-Control-Allow-Headers', cors.allowHeaders || 'Content-Type, Authorization, Mcp-Session-Id');
230-
res.setHeader('Access-Control-Expose-Headers', cors.exposeHeaders || 'Content-Type, Authorization, Mcp-Session-Id');
231-
228+
res.setHeader('Access-Control-Allow-Origin', cors.allowOrigin || DEFAULT_CORS_CONFIG.allowOrigin!);
229+
res.setHeader('Access-Control-Allow-Methods', cors.allowMethods || DEFAULT_CORS_CONFIG.allowMethods!);
230+
res.setHeader('Access-Control-Allow-Headers', cors.allowHeaders || DEFAULT_CORS_CONFIG.allowHeaders!);
231+
res.setHeader('Access-Control-Expose-Headers', cors.exposeHeaders || DEFAULT_CORS_CONFIG.exposeHeaders!);
232+
232233
if (includeMaxAge) {
233-
res.setHeader('Access-Control-Max-Age', cors.maxAge || '86400');
234+
res.setHeader('Access-Control-Max-Age', cors.maxAge || DEFAULT_CORS_CONFIG.maxAge!);
234235
}
235236
}
236237

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import { describe, it, expect } from '@jest/globals';
2+
import { DEFAULT_CORS_CONFIG } from '../../../src/transports/sse/types.js';
3+
4+
describe('CORS header consistency between transports', () => {
5+
it('DEFAULT_CORS_CONFIG should include all necessary headers', () => {
6+
expect(DEFAULT_CORS_CONFIG.allowHeaders).toContain('Content-Type');
7+
expect(DEFAULT_CORS_CONFIG.allowHeaders).toContain('Authorization');
8+
expect(DEFAULT_CORS_CONFIG.allowHeaders).toContain('Mcp-Session-Id');
9+
expect(DEFAULT_CORS_CONFIG.allowHeaders).toContain('Last-Event-ID');
10+
expect(DEFAULT_CORS_CONFIG.allowHeaders).toContain('x-api-key');
11+
expect(DEFAULT_CORS_CONFIG.allowHeaders).toContain('Accept');
12+
});
13+
14+
it('DEFAULT_CORS_CONFIG should expose necessary headers', () => {
15+
expect(DEFAULT_CORS_CONFIG.exposeHeaders).toContain('Content-Type');
16+
expect(DEFAULT_CORS_CONFIG.exposeHeaders).toContain('Authorization');
17+
expect(DEFAULT_CORS_CONFIG.exposeHeaders).toContain('Mcp-Session-Id');
18+
});
19+
20+
it('DEFAULT_CORS_CONFIG should allow DELETE method for session termination', () => {
21+
expect(DEFAULT_CORS_CONFIG.allowMethods).toContain('DELETE');
22+
});
23+
24+
it('HTTP stream transport should use DEFAULT_CORS_CONFIG as fallback', async () => {
25+
const { readFileSync } = await import('fs');
26+
const httpSource = readFileSync('src/transports/http/server.ts', 'utf-8');
27+
28+
// Should import DEFAULT_CORS_CONFIG
29+
expect(httpSource).toContain('DEFAULT_CORS_CONFIG');
30+
31+
// Should NOT contain hardcoded restrictive headers
32+
expect(httpSource).not.toContain("'Content-Type, Authorization, Mcp-Session-Id'");
33+
});
34+
35+
it('DEFAULT_CORS_CONFIG should have maxAge set', () => {
36+
expect(DEFAULT_CORS_CONFIG.maxAge).toBeDefined();
37+
expect(DEFAULT_CORS_CONFIG.maxAge).toBe('86400');
38+
});
39+
});

0 commit comments

Comments
 (0)