@@ -89,29 +89,12 @@ public override async Task SendMessageAsync(
8989 if ( _messageEndpoint == null )
9090 throw new InvalidOperationException ( "Transport not connected" ) ;
9191
92- using var content = new StringContent (
93- JsonSerializer . Serialize ( message , McpJsonUtilities . JsonContext . Default . JsonRpcMessage ) ,
94- Encoding . UTF8 ,
95- "application/json"
96- ) ;
97-
9892 string messageId = "(no id)" ;
9993
10094 if ( message is JsonRpcMessageWithId messageWithId )
10195 {
10296 messageId = messageWithId . Id . ToString ( ) ;
10397 }
104-
105- using var httpRequestMessage = new HttpRequestMessage ( HttpMethod . Post , _messageEndpoint )
106- {
107- Content = content ,
108- } ;
109-
110- // Add authorization headers if needed
111- await _authorizationHandler . AuthenticateRequestAsync ( httpRequestMessage ) . ConfigureAwait ( false ) ;
112-
113- // Copy additional headers
114- CopyAdditionalHeaders ( httpRequestMessage . Headers ) ;
11598
11699 // Send the request, handling potential auth challenges
117100 HttpResponseMessage ? response = null ;
@@ -120,37 +103,32 @@ public override async Task SendMessageAsync(
120103 do
121104 {
122105 authRetry = false ;
123- response = await _httpClient . SendAsync ( httpRequestMessage , cancellationToken ) . ConfigureAwait ( false ) ;
124106
125- // Handle 401 Unauthorized response
107+ // Create a new request for each attempt
108+ using var currentRequest = new HttpRequestMessage ( HttpMethod . Post , _messageEndpoint ) ;
109+ currentRequest . Content = new StringContent (
110+ JsonSerializer . Serialize ( message , McpJsonUtilities . JsonContext . Default . JsonRpcMessage ) ,
111+ Encoding . UTF8 ,
112+ "application/json"
113+ ) ;
114+
115+ // Add authorization headers if needed - the handler will only add headers if auth is required
116+ await _authorizationHandler . AuthenticateRequestAsync ( currentRequest ) . ConfigureAwait ( false ) ;
117+
118+ // Copy additional headers
119+ CopyAdditionalHeaders ( currentRequest . Headers ) ;
120+
121+ // Dispose previous response before making a new request
122+ response ? . Dispose ( ) ;
123+
124+ response = await _httpClient . SendAsync ( currentRequest , cancellationToken ) . ConfigureAwait ( false ) ;
125+
126+ // Handle 401 Unauthorized response - this will only execute if the server requires auth
126127 if ( response . StatusCode == HttpStatusCode . Unauthorized )
127128 {
128129 // Try to handle the unauthorized response
129130 authRetry = await _authorizationHandler . HandleUnauthorizedResponseAsync (
130131 response , _messageEndpoint ) . ConfigureAwait ( false ) ;
131-
132- if ( authRetry )
133- {
134- // Create a new request (we can't reuse the previous one)
135- using var newRequest = new HttpRequestMessage ( HttpMethod . Post , _messageEndpoint )
136- {
137- Content = new StringContent (
138- JsonSerializer . Serialize ( message , McpJsonUtilities . JsonContext . Default . JsonRpcMessage ) ,
139- Encoding . UTF8 ,
140- "application/json"
141- )
142- } ;
143-
144- // Add authorization headers for the new request
145- await _authorizationHandler . AuthenticateRequestAsync ( newRequest ) . ConfigureAwait ( false ) ;
146- CopyAdditionalHeaders ( newRequest . Headers ) ;
147-
148- // Dispose the previous response
149- response . Dispose ( ) ;
150-
151- // Send the new request
152- response = await _httpClient . SendAsync ( newRequest , cancellationToken ) . ConfigureAwait ( false ) ;
153- }
154132 }
155133 } while ( authRetry ) ;
156134
@@ -252,55 +230,39 @@ private async Task ReceiveMessagesAsync(CancellationToken cancellationToken)
252230 {
253231 try
254232 {
255- using var request = new HttpRequestMessage ( HttpMethod . Get , _sseEndpoint ) ;
256- request . Headers . Accept . Add ( new MediaTypeWithQualityHeaderValue ( "text/event-stream" ) ) ;
257-
258- // Add authorization headers if needed
259- await _authorizationHandler . AuthenticateRequestAsync ( request ) . ConfigureAwait ( false ) ;
260-
261- // Copy additional headers
262- CopyAdditionalHeaders ( request . Headers ) ;
263-
264233 // Send the request, handling potential auth challenges
265234 HttpResponseMessage ? response = null ;
266235 bool authRetry = false ;
267236
268237 do
269238 {
270239 authRetry = false ;
240+
241+ // Create a new request for each attempt
242+ using var currentRequest = new HttpRequestMessage ( HttpMethod . Get , _sseEndpoint ) ;
243+ currentRequest . Headers . Accept . Add ( new MediaTypeWithQualityHeaderValue ( "text/event-stream" ) ) ;
244+
245+ // Add authorization headers if needed - the handler will only add headers if auth is required
246+ await _authorizationHandler . AuthenticateRequestAsync ( currentRequest ) . ConfigureAwait ( false ) ;
247+
248+ // Copy additional headers
249+ CopyAdditionalHeaders ( currentRequest . Headers ) ;
250+
251+ // Dispose previous response before making a new request
252+ response ? . Dispose ( ) ;
253+
271254 response = await _httpClient . SendAsync (
272- request ,
255+ currentRequest ,
273256 HttpCompletionOption . ResponseHeadersRead ,
274257 cancellationToken
275258 ) . ConfigureAwait ( false ) ;
276259
277- // Handle 401 Unauthorized response
260+ // Handle 401 Unauthorized response - this will only execute if the server requires auth
278261 if ( response . StatusCode == HttpStatusCode . Unauthorized )
279262 {
280263 // Try to handle the unauthorized response
281264 authRetry = await _authorizationHandler . HandleUnauthorizedResponseAsync (
282265 response , _sseEndpoint ) . ConfigureAwait ( false ) ;
283-
284- if ( authRetry )
285- {
286- // Create a new request (we can't reuse the previous one)
287- using var newRequest = new HttpRequestMessage ( HttpMethod . Get , _sseEndpoint ) ;
288- newRequest . Headers . Accept . Add ( new MediaTypeWithQualityHeaderValue ( "text/event-stream" ) ) ;
289-
290- // Add authorization headers for the new request
291- await _authorizationHandler . AuthenticateRequestAsync ( newRequest ) . ConfigureAwait ( false ) ;
292- CopyAdditionalHeaders ( newRequest . Headers ) ;
293-
294- // Dispose the previous response
295- response . Dispose ( ) ;
296-
297- // Send the new request
298- response = await _httpClient . SendAsync (
299- newRequest ,
300- HttpCompletionOption . ResponseHeadersRead ,
301- cancellationToken
302- ) . ConfigureAwait ( false ) ;
303- }
304266 }
305267 } while ( authRetry ) ;
306268
0 commit comments