
    otlj                     z    d dl Z d dlmZmZ d dlmZ h dZdZddZd Zde	d	e	fd
Z
ddeded	e	fdZdefdZd Zy)    N)datetimetimezone)Request>   	x-api-keyproxy-authorizationcookieauthorizationi   c                 4    	  |        S # t         $ r |cY S w xY w)z8Run fn(), swallow any exception, return default instead.)	Exception)fndefaults     7/var/www/html/ls-ibe-bot-apis/app/utils/capture_meta.py_safer   	   s"    t s   	 c                 f    	 ddl }|j                  |        | S # t        $ r t        |       cY S w xY w)z<Best-effort convert anything to something JSON-serializable.r   N)jsondumpsr   str)valuer   s     r   
_json_safer      s4    

5 5zs    00headersreturnc                 |    i }| j                         D ]&  \  }}|j                         t        v rd||<   "|||<   ( |S )Nz***REDACTED***)itemslowerSENSITIVE_HEADERS)r   redactedkvs       r   _redact_headersr      sC    H1779))*HQKHQK	  
 O    request	read_bodyc                    K   t         fdi       }t         fdi       }t         fdi       }t         fdi       }i dt        t        j                               dt	        j
                  t        j                        j                         dt         fd      t         fd	      d
dt         fd      dt         fd      dt         fd      dt         fd      dt         fd      dt         fd      dt         fd      dt         fd      dt         fd      d|d|dt        |      d t        |      d!|j                  d"      |j                  d#      |j                  d$      |j                  d%      |j                  d&      |j                  d'      |j                  d(      |j                  d)      |j                  d*      |j                  d+      |j                  d,      |j                  d-      |j                  d.      |j                  d/      d0t         fd1      t         fd2      t         fd3      t         fd4      t         fd5      t         fd6      d7d8}|rRt                d9{   }|=t        |      |d:<   |d9t         t        fd;      |d<<   t        |      t        kD  |d=<   t        |      S 7 Nw)>u   
    Capture as much forensic metadata about an inbound request as possible,
    without ever raising — designed for logging/monitoring a public API.
    c                  .    t         j                        S N)dictr   r!   s   r   <lambda>z*capture_request_metadata.<locals>.<lambda>+       D1r    c                  .    t         j                        S r%   )r&   query_paramsr'   s   r   r(   z*capture_request_metadata.<locals>.<lambda>,   s    g&:&:!;r    c                  .    t         j                        S r%   )r&   path_paramsr'   s   r   r(   z*capture_request_metadata.<locals>.<lambda>-   s    W%8%8 9r    c                  .    t         j                        S r%   )r&   cookiesr'   s   r   r(   z*capture_request_metadata.<locals>.<lambda>.   r)   r    
request_id	timestampclientc                  L     j                   r j                   j                  S d S r%   )r2   hostr'   s   r   r(   z*capture_request_metadata.<locals>.<lambda>6       '.."5"5"QT"Qr    c                  L     j                   r j                   j                  S d S r%   )r2   portr'   s   r   r(   z*capture_request_metadata.<locals>.<lambda>7   r5   r    )r4   r7   methodc                       j                   S r%   )r8   r'   s   r   r(   z*capture_request_metadata.<locals>.<lambda>;   s	    r    urlc                  .    t         j                        S r%   )r   r:   r'   s   r   r(   z*capture_request_metadata.<locals>.<lambda><   s    S-r    base_urlc                  .    t         j                        S r%   )r   r<   r'   s   r   r(   z*capture_request_metadata.<locals>.<lambda>=   s    #g&6&6"7r    pathc                  0     j                   j                  S r%   )r:   r>   r'   s   r   r(   z*capture_request_metadata.<locals>.<lambda>>   s    gkk..r    query_stringc                  0     j                   j                  S r%   )r:   queryr'   s   r   r(   z*capture_request_metadata.<locals>.<lambda>?   s    gkk&7&7r    schemec                  0     j                   j                  S r%   )r:   rC   r'   s   r   r(   z*capture_request_metadata.<locals>.<lambda>@   s     2 2r    http_versionc                  :     j                   j                  d      S NrE   scopegetr'   s   r   r(   z*capture_request_metadata.<locals>.<lambda>C   s    gmm&7&7&Gr    serverc                  :     j                   j                  d      S NrK   rH   r'   s   r   r(   z*capture_request_metadata.<locals>.<lambda>D   s     1 1( ;r    	root_pathc                  :     j                   j                  d      S NrN   rH   r'   s   r   r(   z*capture_request_metadata.<locals>.<lambda>E   s    7==#4#4[#Ar    r-   r+   r/   r   
user_agentz
user-agentrefereroriginzaccept-languagezaccept-encodingzcontent-typezcontent-lengthzx-forwarded-forz	x-real-ip	forwardedzcf-connecting-ipzcf-ipcountryzcf-rayztrue-client-ip)x_forwarded_for	x_real_iprT   cf_connecting_ipcf_ipcountrycf_raytrue_client_ipc                  :     j                   j                  d      S )NtyperH   r'   s   r   r(   z*capture_request_metadata.<locals>.<lambda>d   s    '--"3"3F";r    c                  :     j                   j                  d      S )NrC   rH   r'   s   r   r(   z*capture_request_metadata.<locals>.<lambda>e       GMM$5$5h$?r    c                  :     j                   j                  d      S rG   rH   r'   s   r   r(   z*capture_request_metadata.<locals>.<lambda>f   s    '--*;*;N*Kr    c                  :     j                   j                  d      S rM   rH   r'   s   r   r(   z*capture_request_metadata.<locals>.<lambda>g   r^   r    c                  :     j                   j                  d      S )Nr2   rH   r'   s   r   r(   z*capture_request_metadata.<locals>.<lambda>h   r^   r    c                  :     j                   j                  d      S rP   rH   r'   s   r   r(   z*capture_request_metadata.<locals>.<lambda>i   s    w}}'8'8'Er    )r\   rC   rE   rK   r2   rN   )rR   rS   accept_languageaccept_encodingcontent_typecontent_lengthrT   rI   Nbody_size_bytesc                  *     j                  dd      S )Nzutf-8replace)errors)decode)	truncateds   r   r(   z*capture_request_metadata.<locals>.<lambda>v   s    	(((Cr    body_previewbody_truncated)r   r   uuiduuid4r   nowr   utc	isoformatr   rJ   _safe_read_bodylenMAX_BODY_LOG_BYTES_json_safe_dict)	r!   r"   r   r+   r-   r/   metadata
body_bytesrl   s	   `       @r   capture_request_metadatarz   %   s     126G;R@L92>K126G=c$**,'=X\\(,,/99;=
 	QRQR
= 	%./= 	u-.= 	E78= 	./= 	78=  	%23!=& 	GH'=( 	%;<)=* 	UAB+=. 	{/=0 	1=2 	?7+3=8 	?7+9=> 	gkk,/?=@ ;;y)++h'";;'89";;'89N3!++&67  '{{+<= [1 [1 ',> ?#KK7kk(+%kk*:;
 ;<?@!"KL?@?@EF	
g=H@ *733
!*-j/H&'"#6$67I',C(H^$ *-Z;M)MH%& 8$$ 4s   JK.K,AK.c                 ^   K   	 | j                          d {   S 7 # t        $ r Y y w xY wwr%   )bodyr   r'   s    r   rt   rt   ~   s.     \\^### s(   -  - 	*-*-c                     t        | t              r-| j                         D ci c]  \  }}|t        |       c}}S t        | t              r| D cg c]  }t        |       c}S t        |       S c c}}w c c}w r%   )
isinstancer&   r   rw   listr   )dr   r   s      r   rw   rw      sk    !T23'')<)$!Q?1%%)<<!T,-.Aq"A..a= =.s   A2A8r%   )F)ro   r   r   fastapir   r   rv   r   r   r&   r   boolrz   rt   rw    r    r   <module>r      sh     ' S  T d V%G V% V%QU V%r7 r    