@@ -41,6 +41,44 @@ const { values } = parseArgs({
41
41
} ,
42
42
} ) ;
43
43
44
+ // Function to get HTTP headers.
45
+ // Supports only "sse" and "streamable-http" transport types.
46
+ const getHttpHeaders = (
47
+ req : express . Request ,
48
+ transportType : string ,
49
+ ) : HeadersInit => {
50
+ const headers : HeadersInit = {
51
+ Accept :
52
+ transportType === "sse"
53
+ ? "text/event-stream"
54
+ : "text/event-stream, application/json" ,
55
+ } ;
56
+ const defaultHeaders =
57
+ transportType === "sse"
58
+ ? SSE_HEADERS_PASSTHROUGH
59
+ : STREAMABLE_HTTP_HEADERS_PASSTHROUGH ;
60
+
61
+ for ( const key of defaultHeaders ) {
62
+ if ( req . headers [ key ] === undefined ) {
63
+ continue ;
64
+ }
65
+
66
+ const value = req . headers [ key ] ;
67
+ headers [ key ] = Array . isArray ( value ) ? value [ value . length - 1 ] : value ;
68
+ }
69
+
70
+ // If the header "x-custom-auth-header" is present, use its value as the custom header name.
71
+ if ( req . headers [ "x-custom-auth-header" ] !== undefined ) {
72
+ const customHeaderName = req . headers [ "x-custom-auth-header" ] as string ;
73
+ const lowerCaseHeaderName = customHeaderName . toLowerCase ( ) ;
74
+ if ( req . headers [ lowerCaseHeaderName ] !== undefined ) {
75
+ const value = req . headers [ lowerCaseHeaderName ] ;
76
+ headers [ customHeaderName ] = value as string ;
77
+ }
78
+ }
79
+ return headers ;
80
+ } ;
81
+
44
82
const app = express ( ) ;
45
83
app . use ( cors ( ) ) ;
46
84
app . use ( ( req , res , next ) => {
@@ -80,18 +118,8 @@ const createTransport = async (req: express.Request): Promise<Transport> => {
80
118
return transport ;
81
119
} else if ( transportType === "sse" ) {
82
120
const url = query . url as string ;
83
- const headers : HeadersInit = {
84
- Accept : "text/event-stream" ,
85
- } ;
86
121
87
- for ( const key of SSE_HEADERS_PASSTHROUGH ) {
88
- if ( req . headers [ key ] === undefined ) {
89
- continue ;
90
- }
91
-
92
- const value = req . headers [ key ] ;
93
- headers [ key ] = Array . isArray ( value ) ? value [ value . length - 1 ] : value ;
94
- }
122
+ const headers = getHttpHeaders ( req , transportType ) ;
95
123
96
124
console . log ( `SSE transport: url=${ url } , headers=${ Object . keys ( headers ) } ` ) ;
97
125
@@ -108,18 +136,7 @@ const createTransport = async (req: express.Request): Promise<Transport> => {
108
136
console . log ( "Connected to SSE transport" ) ;
109
137
return transport ;
110
138
} else if ( transportType === "streamable-http" ) {
111
- const headers : HeadersInit = {
112
- Accept : "text/event-stream, application/json" ,
113
- } ;
114
-
115
- for ( const key of STREAMABLE_HTTP_HEADERS_PASSTHROUGH ) {
116
- if ( req . headers [ key ] === undefined ) {
117
- continue ;
118
- }
119
-
120
- const value = req . headers [ key ] ;
121
- headers [ key ] = Array . isArray ( value ) ? value [ value . length - 1 ] : value ;
122
- }
139
+ const headers = getHttpHeaders ( req , transportType ) ;
123
140
124
141
const transport = new StreamableHTTPClientTransport (
125
142
new URL ( query . url as string ) ,
0 commit comments