@@ -18,6 +18,11 @@ use crate::{
1818
1919type BoxedSseStream = BoxStream < ' static , Result < Sse , SseError > > ;
2020
21+ #[ derive( Debug ) ]
22+ pub struct AuthRequiredError {
23+ pub www_authenticate_header : String ,
24+ }
25+
2126#[ derive( Error , Debug ) ]
2227pub enum StreamableHttpError < E : std:: error:: Error + Send + Sync + ' static > {
2328 #[ error( "SSE error: {0}" ) ]
@@ -48,6 +53,8 @@ pub enum StreamableHttpError<E: std::error::Error + Send + Sync + 'static> {
4853 #[ cfg_attr( docsrs, doc( cfg( feature = "auth" ) ) ) ]
4954 #[ error( "Auth error: {0}" ) ]
5055 Auth ( #[ from] crate :: transport:: auth:: AuthError ) ,
56+ #[ error( "Auth required" ) ]
57+ AuthRequired ( AuthRequiredError ) ,
5158}
5259
5360#[ derive( Debug , Clone , Error ) ]
@@ -274,8 +281,7 @@ impl<C: StreamableHttpClient> Worker for StreamableHttpClientWorker<C> {
274281 responder,
275282 message : initialize_request,
276283 } = context. recv_from_handler ( ) . await ?;
277- let _ = responder. send ( Ok ( ( ) ) ) ;
278- let ( message, session_id) = self
284+ let ( message, session_id) = match self
279285 . client
280286 . post_message (
281287 config. uri . clone ( ) ,
@@ -284,12 +290,22 @@ impl<C: StreamableHttpClient> Worker for StreamableHttpClientWorker<C> {
284290 self . config . auth_header ,
285291 )
286292 . await
287- . map_err ( WorkerQuitReason :: fatal_context ( "send initialize request" ) ) ?
288- . expect_initialized :: < C :: Error > ( )
289- . await
290- . map_err ( WorkerQuitReason :: fatal_context (
291- "process initialize response" ,
292- ) ) ?;
293+ {
294+ Ok ( res) => {
295+ let _ = responder. send ( Ok ( ( ) ) ) ;
296+ res. expect_initialized :: < C :: Error > ( ) . await . map_err (
297+ WorkerQuitReason :: fatal_context ( "process initialize response" ) ,
298+ ) ?
299+ }
300+ Err ( err) => {
301+ let msg = format ! ( "{:?}" , err) ;
302+ let _ = responder. send ( Err ( err) ) ;
303+ return Err ( WorkerQuitReason :: fatal (
304+ StreamableHttpError :: TransportChannelClosed ,
305+ msg,
306+ ) ) ;
307+ }
308+ } ;
293309 let session_id: Option < Arc < str > > = if let Some ( session_id) = session_id {
294310 Some ( session_id. into ( ) )
295311 } else {
0 commit comments