§
    öŽ’jK  ã                  óh  — U d Z ddlmZ ddl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ZddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZmZmZmZmZ ddlmZmZm Z  ddl!m"Z# ddl$m%Z%m&Z&m'Z' ddl(m)Z) ddl*m+Z+m,Z,m-Z-  ej.        e/¦  «        Z0dZ1de2d<   	  G d„ d¦  «        Z3 G d„ d¦  «        Z4dS )z/StreamableHTTP Session Manager for MCP servers.é    )ÚannotationsN)Údeque)ÚAsyncIterator)ÚAnyÚFinal)Úuuid4)Ú
TaskStatus)ÚHeaders)ÚRequest)ÚResponse)ÚASGIAppÚMessageÚReceiveÚScopeÚSend)ÚAuthenticatedUserÚAuthorizationContextÚauthorization_context)ÚServer)ÚMCP_SESSION_ID_HEADERÚ
EventStoreÚStreamableHTTPServerTransport)ÚTransportSecuritySettings)ÚINVALID_REQUESTÚ	ErrorDataÚJSONRPCErrori  @ r   ÚDEFAULT_MAX_REQUEST_BODY_SIZEc                  ól   — e Zd ZdZddddddefd"d„Zej        d#d„¦   «         Zd$d„Z	d$d„Z
d$d „Zd$d!„ZdS )%ÚStreamableHTTPSessionManagera^  
    Manages StreamableHTTP sessions with optional resumability via event store.

    This class abstracts away the complexity of session management, event storage,
    and request handling for StreamableHTTP transports. It handles:

    1. Session tracking for clients
    2. Resumability via an optional event store
    3. Connection management and lifecycle
    4. Request handling and transport setup
    5. Idle session cleanup via optional timeout

    Important: Only one StreamableHTTPSessionManager instance should be created
    per application. The instance cannot be reused after its run() context has
    completed. If you need to restart the manager, create a new instance.

    Args:
        app: The MCP server instance
        event_store: Optional event store for resumability support. If provided, enables resumable connections
            where clients can reconnect and receive missed events. If None, sessions are still tracked but not
            resumable.
        json_response: Whether to use JSON responses instead of SSE streams
        stateless: If True, creates a completely fresh transport for each request with no session tracking or
            state persistence between requests.
        security_settings: Optional transport security settings.
        retry_interval: Retry interval in milliseconds to suggest to clients in SSE retry field. Used for SSE
            polling behavior.
        session_idle_timeout: Optional idle timeout in seconds for stateful sessions. If set, sessions that
            receive no HTTP requests for this duration will be automatically terminated and removed. When
            retry_interval is also configured, ensure the idle timeout comfortably exceeds the retry interval to
            avoid reaping sessions during normal SSE polling gaps. Default is None (no timeout). A value of 1800
            (30 minutes) is recommended for most deployments.
        max_request_body_size: Maximum size in bytes for Streamable HTTP POST request bodies. Requests that
            exceed this limit receive a 413 response before parsing or session creation. Defaults to 4 MiB.
    NFÚappúMCPServer[Any, Any]Úevent_storeúEventStore | NoneÚjson_responseÚboolÚ	statelessÚsecurity_settingsú TransportSecuritySettings | NoneÚretry_intervalú
int | NoneÚsession_idle_timeoutúfloat | NoneÚmax_request_body_sizeÚintc	                óÀ  — |�|dk    rt          d¦  «        ‚|r|�t          d¦  «        ‚|dk    rt          d¦  «        ‚|| _        || _        || _        || _        || _        || _        || _        || _	        t          | j        |¦  «        | _        t          j        ¦   «         | _        i | _        i | _        d | _        t          j        ¦   «         | _        d| _        d S )Nr   z9session_idle_timeout must be a positive number of secondsz7session_idle_timeout is not supported in stateless modez8max_request_body_size must be a positive number of bytesF)Ú
ValueErrorÚRuntimeErrorr    r"   r$   r&   r'   r)   r+   r-   ÚRequestBodyLimitMiddlewareÚ_handle_requestÚasgi_appÚanyioÚLockÚ_session_creation_lockÚ_server_instancesÚ_session_ownersÚ_task_groupÚ	_run_lockÚ_has_started)	Úselfr    r"   r$   r&   r'   r)   r+   r-   s	            úPC:\Projects\DSCons\.venv\Lib\site-packages\mcp\server\streamable_http_manager.pyÚ__init__z%StreamableHTTPSessionManager.__init__H   sø   € ð  Ð+Ð0DÈÒ0IÐ0IÝÐXÑYÔYÐYØð 	ZÐ-Ð9ÝÐXÑYÔYÐYØ  AÒ%Ð%ÝÐWÑXÔXÐXàˆŒØ&ˆÔØ*ˆÔØ"ˆŒØ!2ˆÔØ,ˆÔØ$8ˆÔ!Ø%:ˆÔ"Ý2°4Ô3GÐI^Ñ_Ô_ˆŒõ ',¤j¡l¤lˆÔ#ØKMˆÔð ACˆÔð  ˆÔåœ™œˆŒØ!ˆÔÐÐó    ÚreturnúAsyncIterator[None]c               ó.  K  — | j         4 ƒd{V —† | j        rt          d¦  «        ‚d| _        ddd¦  «        ƒd{V —† n# 1 ƒd{V —†swxY w Y   t          j        ¦   «         4 ƒd{V —†}|| _        t                               d¦  «         	 dW V — t                               d¦  «         |j         	                    ¦   «          d| _        | j
                             ¦   «          | j                             ¦   «          nq# t                               d¦  «         |j         	                    ¦   «          d| _        | j
                             ¦   «          | j                             ¦   «          w xY w	 ddd¦  «        ƒd{V —† dS # 1 ƒd{V —†swxY w Y   dS )aw  
        Run the session manager with proper lifecycle management.

        This creates and manages the task group for all session operations.

        Important: This method can only be called once per instance. The same
        StreamableHTTPSessionManager instance cannot be reused after this
        context manager exits. Create a new instance if you need to restart.

        Use this in the lifespan context manager of your Starlette app:

        @contextlib.asynccontextmanager
        async def lifespan(app: Starlette) -> AsyncIterator[None]:
            async with session_manager.run():
                yield
        NzyStreamableHTTPSessionManager .run() can only be called once per instance. Create a new instance if you need to run again.Tz&StreamableHTTP session manager startedz,StreamableHTTP session manager shutting down)r;   r<   r1   r5   Úcreate_task_groupr:   ÚloggerÚinfoÚcancel_scopeÚcancelr8   Úclearr9   )r=   Útgs     r>   Úrunz StreamableHTTPSessionManager.runq   s¤  è è € ð& ”>ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ØÔ ð Ý"ðYñô ð ð !%ˆDÔð	%ð 	%ð 	%ñ 	%ô 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%øøøð 	%ð 	%ð 	%ð 	%õ Ô*Ñ,Ô,ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-°à!ˆDÔÝ�KŠKÐ@ÑAÔAÐAð	-Ø����å—’ÐJÑKÔKÐKà”×&Ò&Ñ(Ô(Ð(Ø#'�Ô àÔ&×,Ò,Ñ.Ô.Ð.ØÔ$×*Ò*Ñ,Ô,Ð,Ð,øõ —’ÐJÑKÔKÐKà”×&Ò&Ñ(Ô(Ð(Ø#'�Ô àÔ&×,Ò,Ñ.Ô.Ð.ØÔ$×*Ò*Ñ,Ô,Ð,Ð,øøøÐ,ð	-ð 	-ð 	-ñ 	-ô 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-øøøð 	-ð 	-ð 	-ð 	-ð 	-ð 	-s=   �A Á 
A
ÁA
Á*"FÂC?ÂA-FÃ?A.E-Å-FÆ
FÆFÚscoper   Úreceiver   Úsendr   ÚNonec              ƒ  óD   K  — |                       |||¦  «        ƒ d{V —† dS )a  
        Process ASGI request with proper session handling and transport setup.

        Dispatches to the appropriate handler based on stateless mode.

        Args:
            scope: ASGI scope
            receive: ASGI receive function
            send: ASGI send function
        N)r4   ©r=   rL   rM   rN   s       r>   Úhandle_requestz+StreamableHTTPSessionManager.handle_request›   s6   è è € ð  �mŠm˜E 7¨DÑ1Ô1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1r@   c              ƒ  ó¼   K  — | j         €t          d¦  «        ‚| j        r|                      |||¦  «        ƒ d {V —† d S |                      |||¦  «        ƒ d {V —† d S )Nz6Task group is not initialized. Make sure to use run().)r:   r1   r&   Ú_handle_stateless_requestÚ_handle_stateful_requestrQ   s       r>   r3   z,StreamableHTTPSessionManager._handle_request­   s�   è è € ð ÔÐ#ÝÐWÑXÔXÐXð Œ>ð 	FØ×0Ò0°¸ÀÑFÔFÐFÐFÐFÐFÐFÐFÐFÐFÐFà×/Ò/°°wÀÑEÔEÐEÐEÐEÐEÐEÐEÐEÐEÐEr@   c              ƒ  ód  ‡ ‡K  — t                                d¦  «         t          d‰ j        d‰ j        ¬¦  «        Št
          j        dœdˆˆ fd„}‰ j        €J ‚‰ j                             |¦  «        ƒ d{V —† ‰ 	                    |||¦  «        ƒ d{V —† ‰ 
                    ¦   «         ƒ d{V —† dS )	zÝ
        Process request in stateless mode - creating a new transport for each request.

        Args:
            scope: ASGI scope
            receive: ASGI receive function
            send: ASGI send function
        z7Stateless mode: Creating new transport for this requestN)Úmcp_session_idÚis_json_response_enabledr"   r'   ©Útask_statusrZ   úTaskStatus[None]c              “  óŠ  •K  — ‰                      ¦   «         4 ƒd {V —†}|\  }}|                      ¦   «          	 ‰j                             ||‰j                             ¦   «         d¬¦  «        ƒ d {V —† n*# t
          $ r t                               d¦  «         Y nw xY wd d d ¦  «        ƒd {V —† d S # 1 ƒd {V —†swxY w Y   d S )NT©r&   zStateless session crashed)ÚconnectÚstartedr    rK   Úcreate_initialization_optionsÚ	ExceptionrE   Ú	exception)rZ   ÚstreamsÚread_streamÚwrite_streamÚhttp_transportr=   s       €€r>   Úrun_stateless_serverzTStreamableHTTPSessionManager._handle_stateless_request.<locals>.run_stateless_serverÔ   s±  øè è € Ø%×-Ò-Ñ/Ô/ð Bð Bð Bð Bð Bð Bð B°7Ø,3Ñ)�˜\Ø×#Ò#Ñ%Ô%Ð%ðBØœ(Ÿ,š,Ø#Ø$Øœ×>Ò>Ñ@Ô@Ø"&ð	 'ñ ô ð ð ð ð ð ð ð ð øõ !ð Bð Bð BÝ×$Ò$Ð%@ÑAÔAÐAÐAÐAðBøøøðBð Bð Bñ Bô Bð Bð Bð Bð Bð Bð Bð Bð Bð Bð Bð Bð Bð Bð Bð Bð Bð Bð Bð Bøøøð Bð Bð Bð Bð Bð Bs4   žB2¹;A5Á4B2Á5$BÂB2ÂBÂB2Â2
B<Â?B<)rZ   r[   )rE   Údebugr   r$   r'   r5   ÚTASK_STATUS_IGNOREDr:   ÚstartrR   Ú	terminate)r=   rL   rM   rN   rg   rf   s   `    @r>   rT   z6StreamableHTTPSessionManager._handle_stateless_request¼   s  øøè è € õ 	�ŠÐNÑOÔOÐOå6ØØ%)Ô%7ØØ"Ô4ð	
ñ 
ô 
ˆõ KPÔJcð 	Bð 	Bð 	Bð 	Bð 	Bð 	Bð 	Bð 	Bð 	Bð ÔÐ+Ð+Ð+àÔ×$Ò$Ð%9Ñ:Ô:Ð:Ð:Ð:Ð:Ð:Ð:Ð:ð ×+Ò+¨E°7¸DÑAÔAÐAÐAÐAÐAÐAÐAÐAð ×&Ò&Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ð(r@   c              ƒ  óL  ‡ ‡K  — t          ||¦  «        }|j                             t          ¦  «        }|                     d¦  «        }t	          |t
          ¦  «        rt          |¦  «        nd}|��&|‰ j        v �r‰ j        |         }|‰ j                             |¦  «        k    r…t           
                    d|dd…         ¦  «         t          ddt          t          d¬¦  «        ¬	¦  «        }	t          |	                     d
d
¬¦  «        dd¬¦  «        }
 |
|||¦  «        ƒ d{V —† dS t                               d¦  «         |j        �,‰ j        �%t'          j        ¦   «         ‰ j        z   |j        _        |                     |||¦  «        ƒ d{V —† dS |�€)t                               d¦  «         ‰ j        4 ƒd{V —† t1          ¦   «         j        }t5          |‰ j        ‰ j        ‰ j        ‰ j        ¬¦  «        Š‰j        €J ‚|�|‰ j        ‰j        <   ‰‰ j        ‰j        <   t                                d|› �¦  «         t&          j!        dœdˆˆ fd„}‰ j"        €J ‚‰ j"         #                    |¦  «        ƒ d{V —† ‰                     |||¦  «        ƒ d{V —† ddd¦  «        ƒd{V —† dS # 1 ƒd{V —†swxY w Y   dS t          ddt          t          d¬¦  «        ¬	¦  «        }	t          |	                     d
d
¬¦  «        dd¬¦  «        }
 |
|||¦  «        ƒ d{V —† dS )zÝ
        Process request in stateful mode - maintaining session state between requests.

        Args:
            scope: ASGI scope
            receive: ASGI receive function
            send: ASGI send function
        ÚuserNz\Rejecting request for session %s: credential does not match the one that created the sessioné@   z2.0zserver-errorzSession not found)ÚcodeÚmessage)ÚjsonrpcÚidÚerrorT)Úby_aliasÚexclude_nonei”  zapplication/json)Ústatus_codeÚ
media_typez1Session already exists, handling request directlyzCreating new transport)rW   rX   r"   r'   r)   z'Created new transport with session ID: rY   rZ   r[   rA   rO   c              “  ó.  •K  — ‰                      ¦   «         4 ƒd {V —†}|\  }}|                      ¦   «          	 t          j        ¦   «         }‰j        �'t          j        ¦   «         ‰j        z   |_        |‰_        |5  ‰j         	                    ||‰j         
                    ¦   «         d¬¦  «        ƒ d {V —† d d d ¦  «         n# 1 swxY w Y   |j        r†‰j        €J ‚t                               d‰j        › d�¦  «         ‰j                             ‰j        d ¦  «         ‰j                             ‰j        d ¦  «         ‰                     ¦   «         ƒ d {V —† n3# t&          $ r& t                               d‰j        › d�¦  «         Y nw xY w‰j        re‰j        ‰j        v rW‰j        sPt                               d‰j        › d�¦  «         ‰j        ‰j        = ‰j                             ‰j        d ¦  «         nt# ‰j        rf‰j        ‰j        v rY‰j        sSt                               d‰j        › d�¦  «         ‰j        ‰j        = ‰j                             ‰j        d ¦  «         w w w w xY wd d d ¦  «        ƒd {V —† d S # 1 ƒd {V —†swxY w Y   d S )NFr]   zSession z idle timeoutz crashedzCleaning up crashed session z from active instances.)r^   r_   r5   ÚCancelScoper+   Úcurrent_timeÚdeadlineÚ
idle_scoper    rK   r`   Úcancelled_caughtrW   rE   rF   r8   Úpopr9   rk   ra   rb   Úis_terminated)rZ   rc   rd   re   r|   rf   r=   s        €€r>   Ú
run_serverzIStreamableHTTPSessionManager._handle_stateful_request.<locals>.run_server0  s  øè è € Ø-×5Ò5Ñ7Ô7ð )^ð )^ð )^ð )^ð )^ð )^ð )^¸7Ø4;Ñ1˜ \Ø#×+Ò+Ñ-Ô-Ð-ð&^õ
 */Ô):Ñ)<Ô)<˜JØ#Ô8ÐDÝ6;Ô6HÑ6JÔ6JÈTÔMfÑ6f 
Ô 3Ø<F Ô 9à!+ð "ð "Ø&*¤h§l¢lØ$/Ø$0Ø$(¤H×$JÒ$JÑ$LÔ$LØ.3ð	 '3ñ '"ô '"ð !"ð !"ð !"ð !"ð !"ð !"ð !"ð"ð "ð "ñ "ô "ð "ð "ð "ð "ð "ð "øøøð "ð "ð "ð "ð  *Ô:ð AØ'5Ô'DÐ'PÐ'PÐ'PÝ &§¢Ð,c°~Ô7TÐ,cÐ,cÐ,cÑ dÔ dÐ dØ $Ô 6× :Ò :¸>Ô;XÐZ^Ñ _Ô _Ð _Ø $Ô 4× 8Ò 8¸Ô9VÐX\Ñ ]Ô ]Ð ]Ø&4×&>Ò&>Ñ&@Ô&@Ð @Ð @Ð @Ð @Ð @Ð @Ð @øøÝ(ð að að aÝ"×,Ò,Ð-_¸Ô8UÐ-_Ð-_Ð-_Ñ`Ô`Ð`Ð`Ð`ðaøøøð !/Ô =ð^à$2Ô$AÀTÔE[Ð$[Ð$[Ø(6Ô(Dð %\õ !'§¢ð%8Ø'5Ô'Dð%8ð %8ð %8ñ!"ô !"ð !"ð
 %)Ô$:¸>Ô;XÐ$YØ $Ô 4× 8Ò 8¸Ô9VÐX\Ñ ]Ô ]Ð ]øøð !/Ô =ð^à$2Ô$AÀTÔE[Ð$[Ð$[Ø(6Ô(Dð %\õ !'§¢ð%8Ø'5Ô'Dð%8ð %8ð %8ñ!"ô !"ð !"ð
 %)Ô$:¸>Ô;XÐ$YØ $Ô 4× 8Ò 8¸Ô9VÐX\Ñ ]Ô ]Ð ]Ð ]ð^à$[Ð$[øøøðA)^ð )^ð )^ñ )^ô )^ð )^ð )^ð )^ð )^ð )^ð )^ð )^ð )^ð )^ð )^ð )^ð )^ð )^ð )^ð )^ð )^ð )^ð )^ð )^øøøð )^ð )^ð )^ð )^ð )^ð )^sn   žJ¹AEÁ<<CÂ8EÃC	ÃEÃC	ÃBEÅG=Å-FÆ
G=ÆFÆG=ÆA-JÇ=A1I.É.JÊ
JÊJ)rZ   r[   rA   rO   )$r   ÚheadersÚgetr   Ú
isinstancer   r   r8   r9   rE   Úwarningr   r   r   r   Úmodel_dump_jsonrh   r|   r+   r5   rz   r{   rR   r7   r   Úhexr   r$   r"   r'   r)   rW   rF   ri   r:   rj   )r=   rL   rM   rN   ÚrequestÚrequest_mcp_session_idrm   Ú	requestorÚ	transportÚbodyÚresponseÚnew_session_idr€   rf   s   `            @r>   rU   z5StreamableHTTPSessionManager._handle_stateful_requestí   s²  øøè è € õ ˜% Ñ)Ô)ˆØ!(¤×!4Ò!4Õ5JÑ!KÔ!KÐà�yŠy˜Ñ Ô ˆÝ3=¸dÕDUÑ3VÔ3VÐ`Õ)¨$Ñ/Ô/Ð/Ð\`ˆ	ð "Ñ-Ð2HÈDÔLbÐ2bÑ2bØÔ.Ð/EÔFˆIØ˜DÔ0×4Ò4Ð5KÑLÔLÒLÐLõ —’ØrØ*¨3¨B¨3Ô/ñô ð õ $Ø! n½IÍ?ÐdwÐ<xÑ<xÔ<xðñ ô �õ $Ø×(Ò(°$ÀTÐ(ÑJÔJØ #Ø1ðñ ô �ð
 �h˜u g¨tÑ4Ô4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ø�Ý�LŠLÐLÑMÔMÐMàÔ#Ð/°DÔ4MÐ4YÝ05Ô0BÑ0DÔ0DÀtÔG`Ñ0`�	Ô$Ô-Ø×*Ò*¨5°'¸4Ñ@Ô@Ð@Ð@Ð@Ð@Ð@Ð@Ð@ØˆFà!Ñ)å�LŠLÐ1Ñ2Ô2Ð2ØÔ2ð CJð CJð CJð CJð CJð CJð CJð CJÝ!&¡¤¤�Ý!>Ø#1Ø-1Ô-?Ø $Ô 0Ø&*Ô&<Ø#'Ô#6ð"ñ "ô "�ð &Ô4Ð@Ð@Ð@ØÐ(ØJS�DÔ(¨Ô)FÑGØHV�Ô& ~Ô'DÑEÝ—’ÐVÀnÐVÐVÑWÔWÐWõ INÔHað *^ð *^ð *^ð *^ð *^ð *^ð *^ð *^ð *^ðZ Ô'Ð3Ð3Ð3àÔ&×,Ò,¨ZÑ8Ô8Ð8Ð8Ð8Ð8Ð8Ð8Ð8ð %×3Ò3°E¸7ÀDÑIÔIÐIÐIÐIÐIÐIÐIÐIðGCJð CJð CJñ CJô CJð CJð CJð CJð CJð CJð CJð CJð CJð CJð CJð CJð CJð CJð CJð CJð CJð CJð CJð CJøøøð CJð CJð CJð CJð CJð CJõL  Ø .½	ÅÐ`sÐ8tÑ8tÔ8tðñ ô ˆDõ  Ø×$Ò$¨dÀÐ$ÑFÔFÐTWÐdvðñ ô ˆHð �(˜5 '¨4Ñ0Ô0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0s   ÇCJ1Ê1
J;Ê>J;)r    r!   r"   r#   r$   r%   r&   r%   r'   r(   r)   r*   r+   r,   r-   r.   )rA   rB   ©rL   r   rM   r   rN   r   rA   rO   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r?   Ú
contextlibÚasynccontextmanagerrK   rR   r3   rT   rU   © r@   r>   r   r   #   sÐ   € € € € € ð"ð "ðN *.Ø#ØØ>BØ%)Ø-1Ø%Bð'"ð '"ð '"ð '"ð '"ðR Ô#ð'-ð '-ð '-ñ $Ô#ð'-ðR2ð 2ð 2ð 2ð$Fð Fð Fð Fð/)ð /)ð /)ð /)ðb~1ð ~1ð ~1ð ~1ð ~1ð ~1r@   r   c                  ó"   — e Zd ZdZdd„Zdd„ZdS )r2   zIReject oversized HTTP request bodies before invoking an ASGI application.r    r   Úmax_body_sizer.   rA   rO   c                ó"   — || _         || _        d S ©N)r    r—   )r=   r    r—   s      r>   r?   z#RequestBodyLimitMiddleware.__init__q  s   € ØˆŒØ*ˆÔÐÐr@   rL   r   rM   r   rN   r   c              ƒ  óÜ  ‡‡K  — |d         dk    s|d         dk    r|                       |‰|¦  «        ƒ d {V —† d S t          |¬¦  «        }|                     d¦  «        }|�P	 t          |¦  «        }|| j        k    r$t          dd¬	¦  «        } ||‰|¦  «        ƒ d {V —†S n# t          $ r Y nw xY wt          ¦   «         }d
}	d
}
d }	  ‰¦   «         ƒ d {V —†}|d         dk    r|}n“d}	|                     dd¦  «        }t          |¦  «        t          |¦  «        z   | j        k    r$t          dd¬	¦  «        } ||‰|¦  «        ƒ d {V —†S | 	                    |¦  «         |                     dd
¦  «        sd}
nŒ²t          ¦   «         Š|	r'‰                     dt          |¦  «        |
 dœ¦  «         |�‰                     |¦  «         dˆˆfd„}|                       |||¦  «        ƒ d {V —† d S )NÚtypeÚhttpÚmethodÚPOST)rL   zcontent-lengthzRequest body too largei�  )rv   FTzhttp.requestr‹   r@   Ú	more_body)r›   r‹   rŸ   rA   r   c               “  óT   •K  — ‰ r‰                       ¦   «         S  ‰¦   «         ƒ d {V —†S r™   )Úpopleft)Úcached_messagesrM   s   €€r>   Úreplayz3RequestBodyLimitMiddleware.__call__.<locals>.replay¢  s9   øè è € Øð 1Ø&×.Ò.Ñ0Ô0Ð0Ø ˜™œ�?�?�?�?�?�?Ð"r@   )rA   r   )r    r
   r‚   r.   r—   r   r0   Ú	bytearrayÚlenÚextendr   ÚappendÚbytes)r=   rL   rM   rN   r�   Úcontent_lengthÚdeclared_sizerŒ   Úreceived_bodyÚreceived_requestÚbody_completeÚtrailing_messagerp   r‹   r£   r¢   s     `            @r>   Ú__call__z#RequestBodyLimitMiddleware.__call__u  s«  øøè è € Ø�Œ=˜FÒ"Ð" e¨H¤o¸Ò&?Ð&?Ø—(’(˜5 '¨4Ñ0Ô0Ð0Ð0Ð0Ð0Ð0Ð0Ð0ØˆFå Ð&Ñ&Ô&ˆØ ŸšÐ%5Ñ6Ô6ˆØÐ%ð@Ý # NÑ 3Ô 3�ð ! 4Ô#5Ò5Ð5Ý'Ð(@ÈcÐRÑRÔR�HØ!) ¨%°¸$Ñ!?Ô!?Ð?Ð?Ð?Ð?Ð?Ð?Ð?ð 6øõ ð ð ð Ø�ðøøøõ "™œˆØ ÐØˆØ+/Ðð	Ø#˜G™IœI�o�o�o�o�o�oˆGØ�vŒ .Ò0Ð0Ø#*Ð Øà#ÐØ—;’;˜v sÑ+Ô+ˆDÝ�=Ñ!Ô!¥C¨¡I¤IÑ-°Ô0BÒBÐBÝ#Ð$<È#ÐNÑNÔN�Ø%˜X e¨W°dÑ;Ô;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ø× Ò  Ñ&Ô&Ð&Ø—;’;˜{¨EÑ2Ô2ð Ø $�Øð	õ  +0©'¬'ˆØð 	Ø×"Ò"Ø'µ°}Ñ1EÔ1EÐXeÐTeÐfÐfñô ð ð Ð'Ø×"Ò"Ð#3Ñ4Ô4Ð4ð	#ð 	#ð 	#ð 	#ð 	#ð 	#ð 	#ð
 �hŠh�u˜f dÑ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+s   Á$B# Â#
B0Â/B0N)r    r   r—   r.   rA   rO   rŽ   )r�   r�   r‘   r’   r?   r¯   r•   r@   r>   r2   r2   n  sB   € € € € € ØSÐSð+ð +ð +ð +ð2,ð 2,ð 2,ð 2,ð 2,ð 2,r@   r2   )5r’   Ú
__future__r   r“   ÚloggingÚcollectionsr   Úcollections.abcr   Útypingr   r   Úuuidr   r5   Ú	anyio.abcr	   Ústarlette.datastructuresr
   Ústarlette.requestsr   Ústarlette.responsesr   Ústarlette.typesr   r   r   r   r   Ú&mcp.server.auth.middleware.bearer_authr   r   r   Úmcp.server.lowlevel.serverr   Ú	MCPServerÚmcp.server.streamable_httpr   r   r   Úmcp.server.transport_securityr   Ú	mcp.typesr   r   r   Ú	getLoggerr�   rE   r   Ú__annotations__r   r2   r•   r@   r>   ú<module>rÃ      s  ðØ 5Ð 5Ð 5à "Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð Ø €€€Ø Ð Ð Ð Ð Ð Ø )Ð )Ð )Ð )Ð )Ð )Ø Ð Ð Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à €€€Ø  Ð  Ð  Ð  Ð  Ð  Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø &Ð &Ð &Ð &Ð &Ð &Ø (Ð (Ð (Ð (Ð (Ð (Ø BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ Bà qÐ qÐ qÐ qÐ qÐ qÐ qÐ qÐ qÐ qØ :Ð :Ð :Ð :Ð :Ð :ðð ð ð ð ð ð ð ð ð ð
 DÐ CÐ CÐ CÐ CÐ CØ >Ð >Ð >Ð >Ð >Ð >Ð >Ð >Ð >Ð >à	ˆÔ	˜8Ñ	$Ô	$€à'6Ð Ð 6Ð 6Ð 6Ñ 6Ø IðH1ð H1ð H1ð H1ð H1ñ H1ô H1ð H1ðV
9,ð 9,ð 9,ð 9,ð 9,ñ 9,ô 9,ð 9,ð 9,ð 9,r@   