
    iX                    t   d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z
d dlZd dlmZmZmZmZmZmZmZ  G d d          Z G d dej                  Zd;dZd<dZd=dZd>d Zd?d#Zd@d(ZdAd*Z	 dBdCd/Z	 dBdCd0ZdDd2Z dEd3Z!dFd4Z" G d5 d6          Z# G d7 d8          Z$ G d9 d:          Z%dS )G    )annotationsN)	async_lib
config_libconsterrors
server_lib
transformstypesc                  P    e Zd ZdZdddd
ZdddddZdddddZddZddZdS )AuthenticatedHTTPClientz
    HTTP client that:
    - Is thread-safe
    - Works in both async and sync contexts
    - Handles auth (opt in)
    - Handles branch environments
    N)request_timeoutenv
str | Noner   int | datetime.timedelta | Nonesigning_keysigning_key_fallbackc                  t                                                      | _        t          j                    | _        | j        j        | _        || _        || _	        || _
        t          |t                    r|dz  | _        d S t          |t          j                  r|                                | _        d S d| _        d S )N  g      >@)ThreadAwareAsyncHTTPClient
initialize_http_clienthttpxClient_http_client_syncbuild_requestbuild_httpx_request_env_signing_key_signing_key_fallback
isinstanceint_default_timeoutdatetime	timedeltatotal_seconds)selfr   r   r   r   s        R/root/projects/qq-shell/venv/lib/python3.11/site-packages/inngest/_internal/net.py__init__z AuthenticatedHTTPClient.__init__"   s     788CCEE!&
 $(#9#G 	'%9"os++ 	)$3d$:D!!!);<< 	)$3$A$A$C$CD!!!$(D!!!    F)authheadersurlstrr*   boolr+   dict[str, str] | Nonereturn types.MaybeError[httpx.Response]c          
       K   |                      d|i t          | j        dd          |pi           }|r/t          | j        | j        || j        | j                   d{V }n!t          | j        | j        |           d{V }t          |t                    r|S |j        dk    rt          d|j         d|j                   S |S )	a  
        Perform an async HTTP GET request.

        Args:
        ----
            url: Request URL
            auth: Include the Authorization header. Never set to True if the request is not to an Inngest server
            headers: Additional request headers
        GETNr   	frameworkserver_kindr+   r   r     HTTP error:  )r   create_headersr   fetch_with_auth_fallbackr   r   r   r   fetch_with_thready_safetyr    	Exceptionstatus_codetextr&   r,   r*   r+   reqress         r'   getzAuthenticatedHTTPClient.get=   sB     " &&	 	" $  	 =b	 ' 
 
  	0!& -%)%?        CC 2!&       C
 c9%% 	J?c!!HCOHHchHHIII
r)   c          
     l   |                      d|i t          | j        dd          |pi           }|r#t          | j        || j        | j                  }n| j                            |          }t          |t                    r|S |j
        dk    rt          d|j
         d|j                   S |S )	a  
        Perform a sync HTTP GET request.

        Args:
        ----
            url: Request URL
            auth: Include the Authorization header. Never set to True if the request is not to an Inngest server
            headers: Additional request headers
        r3   Nr4   r7   r8   r9   r:   r;   )r   r<   r   fetch_with_auth_fallback_syncr   r   r   sendr    r?   r@   rA   rB   s         r'   get_syncz AuthenticatedHTTPClient.get_syncs   s    " &&	 	" $  	 =b	 ' 
 
  	3/& -%)%?	  CC (--c22Cc9%% 	J?c!!HCOHHchHHIII
r)   bodyobjectc           	     P  K   |                      d|t          | j        dd          || j                  }t	          | j        | j        || j        | j                   d{V }t          |t                    r|S |j        dk    rt          d|j         d|j                   S |S )	a  
        Perform an asynchronous HTTP POST request. Handles authn

        Args:
        ----
            url: The pathname to the endpoint, including query string
            body: The body of the request

        Returns:
        -------
            A httpx.Response object
        POSTNr4   r+   jsontimeoutr8   r9   r:   r;   )r   r<   r   r"   r=   r   r   r   r   r    r?   r@   rA   r&   r,   rJ   rC   rD   s        r'   postzAuthenticatedHTTPClient.post   s       &&"I   
 ) ' 

 

 -")!%!;
 
 
 
 
 
 
 
 
 c9%% 	J?c!!HCOHHchHHIII
r)   c           	     4   |                      d|t          | j        dd          || j                  }t	          | j        || j        | j                  }t          |t                    r|S |j
        dk    rt          d|j
         d|j                   S |S )	a  
        Perform a synchronous HTTP POST request. Handles authn

        Args:
        ----
            url: The pathname to the endpoint, including query string
            body: The body of the request

        Returns:
        -------
            A httpx.Response object
        rM   Nr4   rN   r8   r9   r:   r;   )r   r<   r   r"   rG   r   r   r   r    r?   r@   rA   rQ   s        r'   	post_syncz!AuthenticatedHTTPClient.post_sync   s     &&"I   
 ) ' 

 

 ,")!%!;	
 
 
 c9%% 	J?c!!HCOHHchHHIII
r)   )r   r   r   r   r   r   r   r   )r,   r-   r*   r.   r+   r/   r0   r1   )r,   r-   rJ   rK   r0   r1   )	__name__
__module____qualname____doc__r(   rE   rI   rR   rT    r)   r'   r   r      s          <@	) ) ) ) ) )> )-4 4 4 4 4 4t )-0 0 0 0 0 0d( ( ( (T' ' ' ' ' 'r)   r   c                  2    e Zd ZU dZdZded<   d	dZd
dZdS )r   z
    Thin wrapper around httpx.AsyncClient. It keeps track of the thread it was
    created in, which is critical since asyncio is not thread safe: calling an
    async method in a different thread will raise an exception
    N
int | None_creation_thread_idr0   r.   c                j    | j         t          d          t          j                    }| j         |k    S )Nz-did not initialize ThreadAwareAsyncHTTPClient)r\   r?   	threading	get_ident)r&   current_thread_ids     r'   is_same_threadz)ThreadAwareAsyncHTTPClient.is_same_thread  s8    #+KLLL%/11'+<<<r)   c                6    t          j                    | _        | S N)r^   r_   r\   r&   s    r'   r   z%ThreadAwareAsyncHTTPClient.initialize	  s    #,#6#8#8 r)   )r0   r.   )r0   r   )rU   rV   rW   rX   r\   __annotations__ra   r   rY   r)   r'   r   r      s\           '+****= = = =     r)   r   r   r   r5   server_lib.Framework | Noner6   server_lib.ServerKind | Noner0   dict[str, str]c                   t           j        j        j        dt           j        j        j        dt
          j         dt
          j         t           j        j        j        t           j	        t           j        j
        j        dt
          j         dt
          j         i}| | |t           j        j        j        <   ||j        |t           j        j        j        <   ||j        |t           j        j        j        <   |S )z[
    Create standard headers that should exist on every possible outgoing
    request.
    zapplication/jsonzinngest-z:v)r   	HeaderKeyCONTENT_TYPEvalueSDKr   LANGUAGEVERSIONREQUEST_VERSIONPREFERRED_EXECUTION_VERSION
USER_AGENTENV	FRAMEWORKEXPECTED_SERVER_KIND)r   r5   r6   r+   s       r'   r<   r<     s     	)/1C &(T5>(T(TU](T(T,2J4Z'-/[%./[/[EM/[/[	G 25
$(./8A
$.45 	
$9?@ Nr)   public_pathrequest_urlr-   serve_origin
serve_pathc                   t          j        |          }t          j        |          }t          j                            |          }|j        }|j        }|j        }|<d|v }|r2t          j                            |          }	|	j        p|}|	j        p|}nd}|}||}| | }t          j        	                    |||dddf          S )a  
    Create the serve URL, which is the URL that the Executor will use to reach
    the SDK.

    Args:
    ----
        public_path: User-specified override for the public path.
        request_url: The URL that the Executor is using to reach the SDK.
        serve_origin: User-specified override for the serve origin.
        serve_path: User-specified override for the serve path.
    Nz://https )
r   get_serve_originget_serve_pathurllibparseurlparseschemenetlocpath
urlunparse)
rv   rw   rx   ry   
parsed_url
new_scheme
new_netlocnew_path
has_schemeparsed_origins
             r'   create_serve_urlr   ,  s    ( .|<<L*:66J&&{33J"J"JHl*
 	&"L11,??M&-;J&-;JJ J%J <""	Z2r26  r)   clientclient_synchttpx.Clientrequesthttpx.Requestr   r   r1   c                 K   |3dt          j        |           |j        t          j        j        j        <   	 t          | ||           d{V }|j        t          j
        j        t          j
        j        fv rL|Jdt          j        |           |j        t          j        j        j        <   t          | ||           d{V }|S # t          $ r-}t          d|j         d|           }||_        |cY d}~S d}~ww xY w)z
    Send an HTTP request with the given signing key. If the response is a 401 or
    403, then try again with the fallback signing key
    NBearer Failed request to : )r	   hash_signing_keyr+   r   rj   AUTHORIZATIONrl   r>   r@   http
HTTPStatus	FORBIDDENUNAUTHORIZEDr?   r,   	__cause__)r   r   r   r   r   rD   errnew_errs           r'   r=   r=   a  sc      @j1+>>@@ 	
,:@A-
 
 
 
 
 
 
 
 O)4?+GHI I$0 N*56JKKMM OJ0>DE 2       C 
   EEEEEFFs   BC 
C>"C93C>9C>c                  |3dt          j        |           |j        t          j        j        j        <   	 |                     |          }|j        t          j
        j        t          j
        j        fv rJ|Hdt          j        |           |j        t          j        j        j        <   |                     |          }|S # t          $ r-}t          d|j         d|           }||_        |cY d}~S d}~ww xY w)z
    Send an HTTP request with the given signing key. If the response is a 401 or
    403, then try again with the fallback signing key. Returns an error when
    receiving a non-OK response
    Nr   r   r   )r	   r   r+   r   rj   r   rl   rH   r@   r   r   r   r   r?   r,   r   )r   r   r   r   rD   r   r   s          r'   rG   rG     s    @j1+>>@@ 	
,:@Akk'""O)4?+GHI I$0 N*56JKKMM OJ0>DE ++g&&C
   EEEEEFFs   B	C 
C8"C3-C83C8r+   %dict[str, str] | dict[str, list[str]]c                    i }|                                  D ]?\  }}|                                }t          |t                    r|d         ||<   :|||<   @|S )z>
    Ensure that known headers are in the correct casing.
    r   )itemslowerr    list)r+   new_headerskvs       r'   normalize_headersr     sc     K  1GGIIa 	qTKNNKNNr)   r,   modeserver_lib.ServerKindtypes.MaybeError[str]c                   d| vr9d|                      d                               d          vrt          d          S |                     d          du r|t          j        j        u rd|  } nd|  } 	 t          j                            |           }|j	        dk    rt          d	          S |
                                S # t          $ r}|cY d }~S d }~ww xY w)
N.:zhttp://zhttps://zinvalid URL: no domain or portr   Fr|   zinvalid URL)stripr?   
startswithr   
ServerKindCLOUDr   r   r   r   geturl)r,   r   parsedr   s       r'   	parse_urlr     s    
#~~#SYYy%9%9%?%?
%K%KKK9:::
~~f&&:(..."S""CC!C//C&&s++=B]+++}}   





s$   48C -C 
CCCChttpx.Responsec                   K   |                                  du r|                                d{V S t          j                    }|                              S |                    dfd           d{V S )zg
    Safely handles the situation where the async HTTP client is called in a
    different thread.
    TNc                 .                                    S rc   )rH   )r   r   s   r'   <lambda>z+fetch_with_thready_safety.<locals>.<lambda>  s      )) r)   )ra   rH   r   get_event_looprun_in_executor)r   r   r   loops    `` r'   r>   r>     s       $&& [[)))))))))#%%D|(((%%)))))        r)   rJ   bytesunix_msr[   c                   | t          t          j                              }t          j        |           }t	          |t
                    r|t          j        t          j        |          	                    d          |t          j                  }|                    t          |          	                    d                     |                                }d| d| S )z
    Sign an HTTP request in the same way an Inngest server would. This is only
    needed for tests that mimic Inngest server behavior.
    Nutf-8t=&s=)roundtimer	   canonicalizer    r?   hmacnewremove_signing_key_prefixencodehashlibsha256updater-   	hexdigest)rJ   r   r   canonicalizedmacsigs         r'   sign_requestr     s     	$$+D11M-++ 
(,[99@@II C
 JJs7||""7++,,,
--//C "!!C!!!r)   c                r   | t          t          j                              }t          j        t	          j        |                              d          | t          j                  }|	                    t          |                              d                     |                                }d| d| S )z 
    Sign an HTTP response.
    Nr   r   r   )r   r   r   r   r	   r   r   r   r   r   r-   r   )rJ   r   r   r   r   s        r'   sign_responser     s     	$$
(,[99@@II C
 JJs7||""7++,,,
--//C "!!C!!!r)   types.MaybeError[str | None]c                r   |t           j        j        k    rd S d }d }|                    t           j        j        j                  }|,t          j        dt           j        j        j         d          S t          j
                            |          }d|v rt          |d         d                   }d|v r|d         d         }|t          j        d          S |&t          t           j        j        j         d          S t          j        t#          j        |                              d          | t(          j                  }|r5|                    t/          |                              d                     t          j        ||                                          st          j                    S |S )	Nz7cannot validate signature in production mode without a z headertr   szBcannot validate signature in production mode without a signing keyz header is malformedr   )r   r   
DEV_SERVERrE   rj   	SIGNATURErl   r   HeaderMissingErrorr   r   parse_qsr!   SigningKeyMissingErrorr?   r   r   r	   r   r   r   r   r   r-   compare_digestr   SigVerificationFailedError)	rJ   r+   r   r   	timestamp	signature
sig_headerr   r   s	            r'   _validate_sigr   ,  s    z$///tIIZ1;ABBJ(sjFZFdFjsss
 
 	
 &&z22&==F3KN++I&==sAI,P
 
 	
 #-3III
 
 	
 (,[99@@II C  3

3y>>((11222y#--//:: 30222r)   c                    t          j        |           }t          |t                    r|S t	          ||||          }t          |t                    r|t	          ||||          }|S )a[  
    Validate the request signature. Falls back to the fallback signing key if
    signature validation fails with the primary signing key.

    Args:
    ----
        body: Request body.
        headers: Request headers.
        mode: Server mode.
        signing_key: Primary signing key.
        signing_key_fallback: Fallback signing key.
    rJ   r+   r   r   )r	   r   r    r?   r   )rJ   r+   r   r   r   r   r   s          r'   validate_request_sigr   ]  s    * +D11M-++ 
	  C #y!! 	
&:&F ,	
 
 
 Jr)   c                (    t          | |||          S )a3  
    Validate an HTTP response signature in the same way an Inngest server would.
    This is only needed for tests that mimic Inngest server behavior.

    Args:
    ----
        body: Request body.
        headers: Request headers.
        mode: Server mode.
        signing_key: Primary signing key.
    r   )r   r   s       r'   validate_response_sigr     s'    & 	   r)   c                  .    e Zd ZddZddZdd	Zdd
ZdS )ServerTimingnamer-   r0   Nonec                0    || _         d | _        d | _        d S rc   )_name_start_counter_end_counterr&   r   s     r'   r(   zServerTiming.__init__  s    
,0*.r)   c                D    | j         t          j                    | _         | S rc   )r   r   perf_counterrd   s    r'   	__enter__zServerTiming.__enter__  s!    &"&"3"5"5Dr)   argsrK   c                H    | j         t          j                    | _         d S d S rc   )r   r   r   r&   r   s     r'   __exit__zServerTiming.__exit__  s*    $ $ 1 3 3D %$r)   c                x    | j         | j        dS t          | j        | j         z
  dz            }| j         d| S Nr|   r   z;dur=)r   r   r!   r   r&   durs     r'   	to_headerzServerTiming.to_header  sK    &$*;*C24$t'::dBCC*((3(((r)   Nr   r-   r0   r   )r0   r   r   rK   r0   r   r0   r-   )rU   rV   rW   r(   r   r   r   rY   r)   r'   r   r     sd        / / / /
   
4 4 4 4) ) ) ) ) )r)   r   c                  :    e Zd ZdZddZddZdd
ZddZddZdS )_AsyncBlockServerTimingzN
    Special server timing that tracks how long the event loop is blocked
    r   r-   r0   r   c                >    d| _         || _        d | _        d | _        d S Nr   )
_block_durr   r   _tracker_taskr   s     r'   r(   z _AsyncBlockServerTiming.__init__  s&    !"
,08<r)   c                    | j         t          j                    | _         | j        +t	          j        |                                           | _        | S rc   )r   r   r   r  asynciocreate_task_trackerrd   s    r'   r   z!_AsyncBlockServerTiming.__enter__  sE    &"&"3"5"5D%!(!4T]]__!E!EDr)   r   rK   c                J    | j         | j                                          d S d S rc   )r  cancelr   s     r'   r   z _AsyncBlockServerTiming.__exit__  s.    )%%''''' *)r)   c                  K   t          j                    }t          j        d           d {V  d}	 t          j                    }| xj        t          ||z
  |z
  d          z  c_        |}t          j        |           d {V  T)Nr   g?)r   r   r  sleepr  max)r&   lastintervalnows       r'   r	  z _AsyncBlockServerTiming._tracker  s       "" mA	*#%%COOs3:#8!<<<OOD-)))))))))		*r)   c                Z    | j         dS t          | j        dz            }| j         d| S r   )r  r!   r  r   r   s     r'   r   z!_AsyncBlockServerTiming.to_header  s:    %24?d*++*((3(((r)   Nr   )r0   r  r   r0   r   r   )	rU   rV   rW   rX   r(   r   r   r	  r   rY   r)   r'   r  r    s         = = = =   ( ( ( (* * * *) ) ) ) ) )r)   r  c                      e Zd ZddZddZdS )	ServerTimingsr0   r   c                    t          d          | _        t          d          | _        t          d          | _        t          d          | _        t          d          | _        t          d          | _        d S )Nasync_blockcomm_handlerfunctionzmw.transform_inputzmw.transform_outputuse_api)r  r  r   r  r  mw_transform_inputmw_transform_outputr  rd   s    r'   r(   zServerTimings.__init__  sl    2=AA )88 %Z00"./C"D"D#/0E#F#F  $I..r)   r-   c                    | j         | j        | j        | j        | j        | j        g}t          |d           }d |D             }d |D             }d                    |          S )zN
        Convert the server timings to the Server-Timing header value
        c                    | j         pdS r  )r   )xs    r'   r   z)ServerTimings.to_header.<locals>.<lambda>  s    !*/a r)   )keyc                6    g | ]}|                                 S rY   )r   ).0timings     r'   
<listcomp>z+ServerTimings.to_header.<locals>.<listcomp>  s$    FFFFV--//FFFr)   c                    g | ]
}|d k    |S )r|   rY   )r"  r   s     r'   r$  z+ServerTimings.to_header.<locals>.<listcomp>  s    ///qBww!wwwr)   z, )r  r  r  r  r  r  sortedjoin)r&   timingsvaluess      r'   r   zServerTimings.to_header  s     M#$LA
 //
 
 

 GFgFFF 0/V///yy   r)   Nr  r   )rU   rV   rW   r(   r   rY   r)   r'   r  r    s<        / / / /$! ! ! ! ! !r)   r  )r   r   r5   rf   r6   rg   r0   rh   )
rv   r   rw   r-   rx   r   ry   r   r0   r-   )r   r   r   r   r   r   r   r   r   r   r0   r1   )
r   r   r   r   r   r   r   r   r0   r1   )r+   r   r0   rh   )r,   r-   r   r   r0   r   )r   r   r   r   r   r   r0   r   rc   )rJ   r   r   r-   r   r[   r0   r   )
rJ   r   r+   rh   r   r   r   r   r0   r   )rJ   r   r+   rh   r   r   r   r   r   r   r0   r   )
rJ   r   r+   rh   r   r   r   r-   r0   r   )&
__future__r   r  r#   r   r   r   r^   r   urllib.parser   r   inngest._internalr   r   r   r   r   r	   r
   r   AsyncClientr   r<   r   r=   rG   r   r   r>   r   r   r   r   r   r   r  r  rY   r)   r'   <module>r.     s   " " " " " "                                ] ] ] ] ] ] ] ]@    !2   *   <2 2 2 2j, , , ,^" " " "J   (   (   : " " " " "@ " " " " "0. . . .b* * * *Z   6) ) ) ) ) ) ) ).)) )) )) )) )) )) )) ))X,! ,! ,! ,! ,! ,! ,! ,! ,! ,!r)   