
    0j>                     |   d Z ddlZddlZddlZddlmZmZ ddlmZm	Z	m
Z
mZmZmZ ddlZddlmZmZ ddlmZmZmZmZ ddlmZmZ dd	lmZmZmZ  ej        e          Z d
ee!e!f         dee!e!f         dee!e!f         fdZ"dej        ddfdZ# ed           G d d                      Z$ G d d          Z%dS )z[
Copyright (c) Microsoft Corporation. All rights reserved.
Licensed under the MIT License.
    N)	dataclassfield)Any	AwaitableCallableDictListOptional)RequestResponse)QueryParamTypesRequestContentRequestDataRequestFiles   )Tokenresolve_token)InterceptorInterceptorRequestContextInterceptorResponseContextbase	overridesreturnc                 (   t          |           }|                                D ]m\  }}|                                dk    rKt          d |D             d          }|)||         }||                                vr
| d| ||<   b||d<   h|||<   n|S )a  
    Merge two header dicts, concatenating User-Agent values when both sides define it.

    For User-Agent headers (case-insensitive key match), the values are merged by
    concatenating with a space, skipping tokens that are already present. All other
    headers from overrides take precedence over base headers.

    Args:
        base: The base headers dict.
        overrides: Headers to merge in (may override base headers).

    Returns:
        Merged headers dict.
    
user-agentc              3   J   K   | ]}|                                 d k    |V  dS )r   N)lower).0ks     j/home/rurouni/.hermes/hermes-agent/venv/lib/python3.11/site-packages/microsoft_teams/common/http/client.py	<genexpr>z!_merge_headers.<locals>.<genexpr>(   s4      OOaQWWYY,5N5N5N5N5N5NOO    N z
User-Agent)dictitemsr   nextsplit)r   r   resultkeyvaluebase_ua_keyexistings          r    _merge_headersr-      s     $ZZFoo'' 
  
 
U99;;,&&OO6OOOQUVVK&!+. 0 000-5*?*?*?*?F;'',|$$F3KKMr"   responsec                 P      j         dt          dt          f fd}| _         dS )z
    Wrap the response.json method to handle JSONDecodeError gracefully.

    Args:
        response: The httpx.Response object to wrap.
        logger: Logger instance for warning messages.
    kwargsr   c                      	  di | S # t           j        $ r;}|j        dk    r*t                              dj         d           i cY d }~S  d }~ww xY w)Nr   z$Failed to decode JSON response from z. Returning empty dict. )jsonJSONDecodeErrorposloggerdebugurl)r0   eoriginal_jsonr.   s     r    	safe_jsonz&_wrap_response_json.<locals>.safe_json>   s}    	 =**6***# 	 	 	uzziHLiiijjj							s     A/A	AAAN)r3   r   )r.   r;   r:   s   ` @r    _wrap_response_jsonr<   4   sK     MMC C        HMMMr"   T)frozenc                       e Zd ZU dZdZee         ed<    ee	eef                   Z
eeef         ed<   dZee         ed<   dZee         ed<    eee                   Zeee                  ed<   dS )	ClientOptionsa  
    Configuration options for the HTTP Client.

    Attributes:
        base_url: The base URL for all requests.
        headers: Default headers to include with every request.
        timeout: Default request timeout in seconds.
        token: Default authorization token (string, string-like, or callable).
        interceptors: List of interceptors for request/response middleware.
    Nbase_url)default_factoryheaderstimeouttokeninterceptors)__name__
__module____qualname____doc__r@   r
   str__annotations__r   r$   rB   r   rC   floatrD   r   listr   rE   r	   r2   r"   r    r?   r?   K   s         	 	 #Hhsm"""#eDcNCCCGT#s(^CCC#GXe_###!E8E?!!!05d;FW0X0X0XL(4,-XXXXXr"   r?   c                   j   e Zd ZdZd dee         fdZdeeeef                  dee	         deeef         fdZ
dddd	d
edeeeef                  dee	         dee         dedej        fdZddddddddd
edee         dee         dee         dee         dee         deeeef                  dee	         dedej        fdZddddddddd
edee         dee         dee         dee         dee         deeeef                  dee	         dedej        fdZddddddddd
edee         dee         dee         dee         dee         deeeef                  dee	         dedej        fdZdddd	d
edeeeef                  dee	         dee         dedej        fdZddddddddded
edee         deeeef                  dee	         dee         dee         dee         dee         dedej        fdZdee	         dee         fdZdeddfdZd!dZd dee         dd fdZdS )"Clientz
    HTTP Client abstraction for making requests with configurable options.

    Args:
        options: ClientOptions dataclass with configuration for the client.
    Noptionsc                    |t                      }|| _        |j        | _        t	          j        d          }|                    t          j                   t          |j
        pg           | _        t          j        |j        rt          j        |j                  nd|j        |j                  | _        |                                  dS )z
        Initialize the HTTP Client.

        Args:
            options: Optional ClientOptions dataclass with configuration for the client.
        Nhttpx )r@   rB   rC   )r?   _optionsrD   _tokenlogging	getLoggersetLevelr6   levelrM   rE   _interceptorsrR   AsyncClientr@   URLrB   rC   http_update_event_hooks)selfrP   httpx_loggers      r    __init__zClient.__init__g   s     ?#ooGm(11fl+++ "'"6"<"==%4;4DLUYw/000"OO
 
 
	
 	  """""r"   rB   rD   r   c                 x   K   i | j         j        |pi }|                     |           d{V }|rd| |d<   |S )a%  
        Merge default and per-request headers, resolve token, and inject Authorization header if needed.

        Args:
            headers: Optional per-request headers.
            token: Optional per-request token.

        Returns:
            Final headers dict for the request.
        NzBearer Authorization)rT   rB   _resolve_token)r_   rB   rD   req_headersresolved_tokens        r    _prepare_headerszClient._prepare_headers   sg       C.B7=bB#22599999999 	F+E^+E+EK(r"   )rB   rD   paramsr8   rh   r0   c                   K   |                      ||           d{V } | j        j        |f||d| d{V }|                                 t	          |           |S )as  
        Send a GET request.

        Args:
            url: The URL path or full URL.
            headers: Optional per-request headers.
            params: Optional query parameters.
            token: Optional per-request token (overrides default).
            **kwargs: Additional httpx.AsyncClient.get arguments.

        Returns:
            httpx.Response
        NrB   rh   )rg   r]   getraise_for_statusr<   r_   r8   rB   rD   rh   r0   re   r.   s           r    rk   z
Client.get   s      , !11'5AAAAAAAA&sYKYYRXYYYYYYYY!!###H%%%r"   )contentdatafilesr3   rh   rB   rD   rn   ro   rp   r3   c          
         K   |                      ||           d{V }
 | j        j        |f||||||
d|	 d{V }|                                 t	          |           |S )a  
        Send a POST request.

        Args:
            url: The URL path or full URL.
            data: The request body.
            headers: Optional per-request headers.
            params: Optional query parameters.
            content: The request body.
            files: The request files.
            json: The request JSON body.
            token: Optional per-request token (overrides default).
            **kwargs: Additional httpx.AsyncClient.post arguments.

        Returns:
            httpx.Response
        Nro   rp   r3   rn   rh   rB   )rg   r]   postrl   r<   r_   r8   rn   ro   rp   r3   rh   rB   rD   r0   re   r.   s               r    rs   zClient.post   s      < !11'5AAAAAAAA'	
	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	!!###H%%%r"   c          
         K   |                      ||           d{V }
 | j        j        |f||||||
d|	 d{V }|                                 t	          |           |S )a  
        Send a PUT request.

        Args:
            url: The URL path or full URL.
            data: The request body.
            headers: Optional per-request headers.
            params: Optional query parameters.
            content: The request body.
            files: The request files.
            json: The request JSON body.
            token: Optional per-request token (overrides default).
            **kwargs: Additional httpx.AsyncClient.put arguments.

        Returns:
            httpx.Response
        Nrr   )rg   r]   putrl   r<   rt   s               r    rv   z
Client.put   s      < !11'5AAAAAAAA&	
	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	!!###H%%%r"   c          
         K   |                      ||           d{V }
 | j        j        |f||||||
d|	 d{V }|                                 t	          |           |S )a  
        Send a PATCH request.

        Args:
            url: The URL path or full URL.
            data: The request body.
            headers: Optional per-request headers.
            params: Optional query parameters.
            content: The request body.
            files: The request files.
            json: The request JSON body.
            token: Optional per-request token (overrides default).
            **kwargs: Additional httpx.AsyncClient.patch arguments.

        Returns:
            httpx.Response
        Nrr   )rg   r]   patchrl   r<   rt   s               r    rx   zClient.patch  s      < !11'5AAAAAAAA(	
	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	!!###H%%%r"   c                   K   |                      ||           d{V } | j        j        |f||d| d{V }|                                 t	          |           |S )ay  
        Send a DELETE request.

        Args:
            url: The URL path or full URL.
            headers: Optional per-request headers.
            params: Optional query parameters.
            token: Optional per-request token (overrides default).
            **kwargs: Additional httpx.AsyncClient.delete arguments.

        Returns:
            httpx.Response
        Nrj   )rg   r]   deleterl   r<   rm   s           r    rz   zClient.delete4  s      , !11'5AAAAAAAA))#\{6\\U[\\\\\\\\!!###H%%%r"   )rh   rB   rD   rn   ro   rp   r3   methodc          
         K   |                      ||           d{V } | j        j        ||f||||||	d|
 d{V }|                                 t	          |           |S )aK  
        Send a custom HTTP request.

        Args:
            method: HTTP method (GET, POST, etc).
            url: The URL path or full URL.
            headers: Optional per-request headers.
            params: Optional query parameters.
            content: The request body.
            data: The request body.
            files: The request files.
            json: The request JSON body.
            token: Optional per-request token (overrides default).
            **kwargs: Additional httpx.AsyncClient.request arguments.

        Returns:
            httpx.Response
        N)rB   rh   rn   ro   rp   r3   )rg   r]   requestrl   r<   )r_   r{   r8   rh   rB   rD   rn   ro   rp   r3   r0   re   r.   s                r    r}   zClient.requestP  s      @ !11'5AAAAAAAA**

  

 

 

 

 

 

 

 

 

 

 	!!###H%%%r"   c                 N   K   ||n| j         }|dS t          |           d{V S )z
        Resolve the token to a string, using per-request or default token.

        Args:
            token: Per-request token or None.

        Returns:
            The resolved token string or None.
        N)rU   r   )r_   rD   	use_tokens      r    rd   zClient._resolve_token  sC       #.EEDK	4"9---------r"   interceptorc                 b    | j                             |           |                                  dS )z
        Register an interceptor for request/response middleware.

        Args:
            interceptor: An object with optional request/response methods.
        N)rZ   appendr^   )r_   r   s     r    use_interceptorzClient.use_interceptor  s3     	!!+...  """""r"   c                    i }| j         D ]}t          |d          r]dt          dt          t          gt
          d         f         fd}|                    dg                                ||                     t          |d          r]dt          dt          t          gt
          d         f         fd}|                    dg                                ||                     || j	        _
        dS )zc
        Internal: Update the httpx.AsyncClient event_hooks to match current interceptors.
        r}   hr   Nc                 &     dt           dd f fd}|S )Nr}   r   c                    K   t          |           }                    |          }t          j        |          r
| d {V  d S d S N)r   r}   inspectisawaitable)r}   ctxr(   r   s      r    wrapperzJClient._update_event_hooks.<locals>._make_request_wrapper.<locals>.wrapper  sU      7@@!"3".v66 )"(LLLLLLLLL) )r"   )r   r   r   s   ` r    _make_request_wrapperz9Client._update_event_hooks.<locals>._make_request_wrapper  s6    )w )4 ) ) ) ) ) ) #Nr"   r.   c                 &     dt           dd f fd}|S )Nr.   r   c                    K   t          |           }                    |          }t          j        |          r
| d {V  d S d S r   )r   r.   r   r   )r.   r   r(   r   s      r    r   zKClient._update_event_hooks.<locals>._make_response_wrapper.<locals>.wrapper  sU      8BB!"C".v66 )"(LLLLLLLLL) )r"   )r   r   s   ` r    _make_response_wrapperz:Client._update_event_hooks.<locals>._make_response_wrapper  s6    ) )T ) ) ) ) ) ) #Nr"   )rZ   hasattrr   r   r   r   
setdefaultr   r   r]   event_hooks)r_   event_hooks_dicthookr   r   s        r    r^   zClient._update_event_hooks  s'    CE& 	a 	aDtY'' _#[ #XwiQZ[_Q`F`=a # # # # !++Ir::AABWBWX\B]B]^^^tZ(( a#k #hzS\]aSbGb>c # # # # !++J;;BBCYCYZ^C_C_``` 0	r"   r   c           	         |pt                      }t          |j        |j        n| j        j        t          | j        j        |j        pi           |j        |j        n| j        j        |j        |j        n| j        j        |j        t          |j                  nt          | j	                            }t          |          S )a  
        Create a new Client instance with merged configuration.

        Args:
            overrides: Optional ClientOptions object to override fields.

        Returns:
            A new Client instance with merged options and a cloned interceptor list.
        N)r@   rB   rC   rD   rE   )r?   r@   rT   r-   rB   rC   rD   rE   rM   rZ   rO   )r_   r   merged_optionss      r    clonezClient.clone  s     0	&+4+=+IY''t}Oe"4=#8):K:QrRR)2):)FI%%DMLa%._%@)//dmFY%1 i4555d())
 
 
 n%%%r"   r   )r   N)rF   rG   rH   rI   r
   r?   ra   r   rJ   r   rg   r   r   rR   r   rk   r   r   r   rs   rv   rx   rz   r}   rd   r   r   r^   r   r2   r"   r    rO   rO   _   s&        # # 7 # # # #2htCH~.F xX] cghkmphpcq    * -1!%,0   $sCx.)	
  )  
   @ -1&*(,",0,0!%+ + ++ .)	+
 {#+ %+ sm+ )+ $sCx.)+ + + 
+ + + +b -1&*(,",0,0!%+ + ++ .)	+
 {#+ %+ sm+ )+ $sCx.)+ + + 
+ + + +b -1&*(,",0,0!%+ + ++ .)	+
 {#+ %+ sm+ )+ $sCx.)+ + + 
+ + + +b -1!%,0   $sCx.)	
  )  
   B -1,0!%,0&*(,". . .. .
 ). $sCx.). . .). {#. %. sm. . 
. . . .`.(5/ .hsm . . . .#; #4 # # # #1 1 1 1@& &x6 &( & & & & & &r"   rO   )&rI   r   r3   rV   dataclassesr   r   typingr   r   r   r   r	   r
   rR   httpx._modelsr   r   httpx._typesr   r   r   r   client_tokenr   r   r   r   r   r   rW   rF   r6   rJ   r-   r<   r?   rO   r2   r"   r    <module>r      s   
    ( ( ( ( ( ( ( ( A A A A A A A A A A A A A A A A  + + + + + + + + S S S S S S S S S S S S . . . . . . . . [ [ [ [ [ [ [ [ [ [		8	$	$c3h DcN tCQTH~    <%. T    . $Y Y Y Y Y Y Y Y&n& n& n& n& n& n& n& n& n& n&r"   