
    i]                        d Z ddlmZ ddlZddlZddlmZmZ ddlm	Z	m
Z
 ddlZddlmZ ddlmZ ddlmZmZ dd	lmZ dd
lmZ ddlZddlmZ ddlmZ ddlmZmZ ddlm Z  ddl!m"Z"  G d de      Z#y)z-Streamable HTTP transport for FastMCP Client.    )annotationsN)AsyncIteratorCallable)Literalcast)ClientSession)streamable_http_client)McpHttpClientFactorycreate_mcp_http_client)AnyUrl)Unpack)
BearerAuth)OAuth)ClientTransportSessionKwargs)get_http_headers)normalize_timeout_to_timedeltac                      e Zd ZdZ	 	 	 	 d		 	 	 	 	 	 	 	 	 d
dZddZej                  	 	 	 	 dd       ZddZ	d Z
ddZy)StreamableHttpTransportzUTransport implementation that connects to an MCP server via Streamable HTTP Requests.Nc                   t        |t              rt        |      }t        |t              r|j                  d      st	        d      || _        |xs i | _        || _        | j                  |       |6t        j                  j                  rddl}|j                  dt        d       t        |      | _        d| _        y)a  Initialize a Streamable HTTP transport.

        Args:
            url: The MCP server endpoint URL.
            headers: Optional headers to include in requests.
            auth: Authentication method - httpx.Auth, "oauth" for OAuth flow,
                or a bearer token string.
            sse_read_timeout: Deprecated. Use read_timeout_seconds in session_kwargs.
            httpx_client_factory: Optional factory for creating httpx.AsyncClient.
                If provided, must accept keyword arguments: headers, auth,
                follow_redirects, and optionally timeout. Using **kwargs is
                recommended to ensure forward compatibility.
        httpz0Invalid HTTP/S URL provided for Streamable HTTP.Nr   a   The `sse_read_timeout` parameter is deprecated and no longer used. The new streamable_http_client API does not support this parameter. Use `read_timeout_seconds` in session_kwargs or configure timeout on the httpx client via `httpx_client_factory` instead.   )
stacklevel)
isinstancer   str
startswith
ValueErrorurlheadershttpx_client_factory	_set_authfastmcpsettingsdeprecation_warningswarningswarnDeprecationWarningr   sse_read_timeout_get_session_id_cb)selfr   r   authr(   r    r%   s          n/Users/bowang/.openclaw/workspace/ChatDev/.venv/lib/python3.12/site-packages/fastmcp/client/transports/http.py__init__z StreamableHttpTransport.__init__   s    * c6"c(C#s#3>>&+AOPP
 }"$8!t'44K '    !??O PCG    c                "   |dk(  r)t        | j                  | j                        }|| _        y t        |t               r%|j	                  | j                         |}|| _        y t        |t
              rt        |      }|| _        y |}|| _        y )Noauth)r    )r   r   r    r   _bindr   r   r+   )r*   r+   resolveds      r,   r!   z!StreamableHttpTransport._set_authN   s    7?TXXD<U<UVH (0	 e$JJtxx H
 (0		 c"!$'H (0	 H'/	r.   c           	    4  K   t        dh      | j                  z  }d }|j                  d      Nt        t        j
                  |j                  d            }t        j                  d|j                               }| j                  ' | j                  d|| j                  dd|rd|ini }nt        ||| j                  	      }|4 d {    t        | j                  |
      4 d {   }|\  }}}	|	| _        t        ||fi |4 d {   }
|
 d d d       d {    d d d       d {    d d d       d {    y 7 }7 _7 >7 +# 1 d {  7  sw Y   ;xY w7 2# 1 d {  7  sw Y   BxY w7 9# 1 d {  7  sw Y   y xY ww)Nauthorization)includeread_timeout_secondsg      >@)readT)r   r+   follow_redirectstimeout)r   r9   r+   )http_client )r   r   getr   datetime	timedeltahttpxTimeouttotal_secondsr    r+   r   r	   r   r)   r   )r*   session_kwargsr   r9   r6   r:   	transportread_streamwrite_streamget_session_idsessions              r,   connect_sessionz'StreamableHttpTransport.connect_session[   s}     #O+<=L )-45A#'""N$6$67M$N$  mmD/C/Q/Q/STG
 $$03$33 YY!% ,3Iw'	K 1YYK K"488EE8A5K~&4D#$\-;  	 FE KKE    	 FEEE KKKs   CFEFF/E0F3E,E
E,EE,'E(E,,F7E*8F<FFFFE,E,E'EE'#E,*F,E>	2E53E>	:FFF	F
FFc                \    | j                   r	 | j                         S y # t        $ r Y y w xY wN)r)   	Exceptionr*   s    r,   rF   z&StreamableHttpTransport.get_session_id   s8    ""..00   s    	++c                   K   d | _         y wrJ   )r)   rL   s    r,   closezStreamableHttpTransport.close   s     "&s   	c                "    d| j                    dS )Nz<StreamableHttpTransport(url='z')>)r   rL   s    r,   __repr__z StreamableHttpTransport.__repr__   s    /z==r.   )NNNN)
r   zstr | AnyUrlr   zdict[str, str] | Noner+   *httpx.Auth | Literal['oauth'] | str | Noner(   z'datetime.timedelta | float | int | Noner    zMcpHttpClientFactory | None)r+   rQ   )rB   zUnpack[SessionKwargs]returnzAsyncIterator[ClientSession])rR   z
str | None)rR   r   )__name__
__module____qualname____doc__r-   r!   
contextlibasynccontextmanagerrH   rF   rN   rP   r;   r.   r,   r   r      s    _
 *.;?DH<@0H0H '0H 9	0H
 B0H :0Hd0 ##, 5,	%, $,\'>r.   r   )$rV   
__future__r   rW   r=   collections.abcr   r   typingr   r   r?   mcpr   mcp.client.streamable_httpr	   mcp.shared._httpx_utilsr
   r   pydanticr   typing_extensionsr   r"   fastmcp.client.auth.bearerr   fastmcp.client.auth.oauthr   fastmcp.client.transports.baser   r   fastmcp.server.dependenciesr   fastmcp.utilities.timeoutr   r   r;   r.   r,   <module>rf      sI    3 "   3     = P  $  1 + I 8 D~>o ~>r.   