
    i&1                        U d dl Z d dlZd dlZd dl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 d dlmZmZmZmZ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 d dlmZ eee e ee e!f         f                  Z"dZ#dZ$dZ% e&ej'                  ej(        ej)        dfgz   Z*e"e+d<   de#fde$fde%ffD ]8\  Z,Z- e.ee,          r'e*/                    ej0         e1ee,          e-f           9g dZ2de3de3fdZ4e G d d                      Z5 G d de          Z6dGdee"         dej7        fdZ8	 dGdee"         dej7        fdZ9 e8            a: e9            a;da<ee"         e+d<   d a=dej7        fd!Z>dej7        fd"Z?dee"         ddfd#Z@dHd$ZAdHd%ZBd&ZCd'ZDeCZEd(ez   ZFd)ee3         de3fd*ZG	 	 	 	 	 dId-e3d)ee3         d.eHd/e d0eej7                 dejI        fd1ZJd d2d3ejI        d4e3d5eHdeejI        ef         fd6ZK	 	 	 dJd-e3d)ee3         d.eHd/e def
d7ZL	 	 	 dJd-e3d)ee3         d.eHd/e def
d8ZM	 	 	 dKd:e3d;e3d)ee3         d<e3d/e defd=ZN	 	 	 dJd-e3d)ee3         d.eHd/e dejI        f
d>ZO	 	 	 dLd-e3de3d)ee3         d/ee          d?ee3         de5fd@ZP G dA dBeQ          ZR G dC dDeR          ZSejT        jU        ZVejT        jW        ZX G dE dFe jY                  ZZdS )M    N)	dataclass)datedatetimetimezone)GzipFile)BytesIO)AnyListOptionalTupleUnion)tzutc)HTTPAdapter)HTTPConnection)Retry)remove_trailing_slash)VERSION<         KEEP_ALIVE_SOCKET_OPTIONSTCP_KEEPIDLETCP_KEEPINTVLTCP_KEEPCNT)i  i  i  i  i  urlreturnc                 .    t          j        dd|           S )zKMask token values in URLs for safe logging, keeping first 10 chars visible.z(token=)([^&]{10})[^&]*z\1\2...)resub)r   s    B/var/www/icac/venv/lib/python3.11/site-packages/posthog/request.py_mask_tokens_in_urlr!   0   s    6,j#>>>    c                   F    e Zd ZU dZeed<   dZee         ed<   dZ	e
ed<   dS )GetResponsez.Response from a GET request with ETag support.dataNetagFnot_modified)__name__
__module____qualname____doc__r	   __annotations__r&   r   strr'   bool r"   r    r$   r$   5   sE         88
IIID(3-L$r"   r$   c                   D     e Zd ZdZdddee         f fdZ fdZ xZS )HTTPAdapterWithSocketOptionsz-HTTPAdapter with configurable socket options.Nsocket_optionsr3   c                H    || _          t                      j        |i | d S N)r3   super__init__)selfr3   argskwargs	__class__s       r    r7   z%HTTPAdapterWithSocketOptions.__init__A   s-    ,$)&)))))r"   c                 \    | j         
| j         |d<    t                      j        |i | d S )Nr3   )r3   r6   init_poolmanager)r8   r9   r:   r;   s      r    r=   z-HTTPAdapterWithSocketOptions.init_poolmanagerE   s<    *'+':F#$  $1&11111r"   )	r(   r)   r*   r+   r   SocketOptionsr7   r=   __classcell__)r;   s   @r    r1   r1   >   su        77HL * * *h}.E * * * * * *2 2 2 2 2 2 2 2 2r"   r1   r3   c                     t          t          ddd          |           }t          j                    }|                    d|           |S )z;Build a session for general requests (batch, decide, etc.).   )totalconnectreadmax_retriesr3   https://)r1   r   requestsSessionmountr3   adaptersessions      r    _build_sessionrN   K   s_    *
 
 

 &  G   GMM*g&&&Nr"   c           
          t          t          ddddt          dg          |           }t          j                    }|                    d|           |S )a8  
    Build a session for feature flag requests with POST retries.

    Feature flag requests are idempotent (read-only), so retrying POST
    requests is safe. This session retries on transient server errors
    (408, 5xx) and network failures with exponential backoff
    (0.5s, 1s delays between retries).
    rA   g      ?POST)rB   rC   rD   backoff_factorstatus_forcelistallowed_methodsrE   rG   )r1   r   RETRY_STATUS_FORCELISTrH   rI   rJ   rK   s      r    _build_flags_sessionrU   Z   sl     +3#H
 
 
 &
 
 
G   GMM*g&&&Nr"   _socket_optionsTc                  F    t           rt          S t          t                    S r5   )_pooling_enabled_sessionrN   rV   r/   r"   r    _get_sessionrZ   {   s     /***r"   c                  F    t           rt          S t          t                    S r5   )rX   _flags_sessionrU   rV   r/   r"   r    _get_flags_sessionr]      s     000r"   c                 `    | t           k    rdS | a t          |           at          |           adS )z
    Configure socket options for all HTTP connections.

    Example:
        from posthog import set_socket_options
        set_socket_options([(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)])
    N)rV   rN   rY   rU   r\   r2   s    r    set_socket_optionsr_      s7     (($On--H).99NNNr"   c                  .    t          t                     dS )zDEnable TCP keepalive to prevent idle connections from being dropped.N)r_   r   r/   r"   r    enable_keep_alivera      s    011111r"   c                  
    da dS )zGDisable connection reuse, creating a fresh connection for each request.FN)rX   r/   r"   r    disable_connection_reuserc      s     r"   zhttps://us.i.posthog.comzhttps://eu.i.posthog.comzposthog-python/hostc                 f    | pt           }t          |          }|dv rt          S |dk    rt          S |S )z"Determines the server host to use.)zhttps://app.posthog.comzhttps://us.posthog.comzhttps://eu.posthog.com)DEFAULT_HOSTr   US_INGESTION_ENDPOINTEU_INGESTION_ENDPOINT)rd   host_or_defaulttrimmed_hosts      r    determine_server_hostrk      sC    *lO(99LLLL$$	1	1	1$$r"   F   api_keygziptimeoutrM   c                    t          j        d          }|}t          j        t	                                                                |d<   t          |pt                    |z   }	| |d<   t          j	        |t                    }
|                    d|
|	           dt          d}|rxd	|d
<   t                      }t          |d          5 }|                    |
                    d                     ddd           n# 1 swxY w Y   |                                }
|pt%                                          |	|
||          }|j        dk    r|                    d           |S )zPost the `kwargs` to the APIposthog)tzsentAtrm   )clszmaking request: %s to url: %szapplication/json)zContent-Type
User-Agentrn   zContent-Encodingw)fileobjmodezutf-8N)r%   headersro      data uploaded successfully)logging	getLoggerr   nowr   	isoformatr   rf   jsondumpsDatetimeSerializerdebug
USER_AGENTr   r   writeencodegetvaluerZ   poststatus_code)rm   rd   pathrn   ro   rM   r:   logbodyr   r%   ry   bufgzress                  r    r   r      s    
I
&
&CD\UWW---7799DN
 4
5
5
<CDO:d 2333DII-tS9991LLG &,"#iic,,, 	+ HHT[[))***	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ ||~~$lnn
*
*$ +  C #		.///Js   )DD	D)return_jsonr   success_messager   c                   t          j        d          }| j        dk    r|                    |           |r|                                 n| }t          |t                    rSd|v rOt          |d         t                    r4d|d         v r*|                    d           t          | j        d          |S d }| j
                            d          }|r	 t          |          }n# t          t          f$ rl 	 dd	lm} t#          d
 ||          t%          j        t(          j                  z
                                            }n# t          t          f$ r Y nw xY wY nw xY w	 |                                 }|                    d|           t/          | j        |d         |          # t0          t          f$ r t/          | j        | j        |          w xY w)Nrq   rz   quotaLimitedfeature_flagsz[FEATURE FLAGS] PostHog feature flags quota limited, resetting feature flag data.  Learn more about billing limits at https://posthog.com/docs/billing/limits-alertszFeature flags quota limitedzRetry-Afterr   )parsedate_to_datetimeg        zreceived response: %sdetail)retry_after)r|   r}   r   r   r   
isinstancedictlistwarningQuotaLimitErrorry   getfloat
ValueError	TypeErroremail.utilsr   maxr   r~   r   utctotal_secondsAPIErrorKeyErrortext)	r   r   r   r   responser   retry_after_headerr   payloads	            r    _process_responser      s    
I
&
&C
#		/"""!,5388:::#
 x&&		R(**8N3T:: +8N#;;;KK w   "#/3PQQQK77 	 233KKI& 	 	 	======!--.@AA",x|445#moo  	*   	K((**		)7333s(9{SSSSj! K K KskJJJJKsD   C& &E#8AE	E#	EE#EE#"E#'AF. ..Gc                 F    t          | |d||fi |}t          |d          S )z+Post the `kwargs to the decide API endpointz/decide/?v=4z"Feature flags decided successfullyr   r   r   rm   rd   rn   ro   r:   r   s         r    decider   	  s5     wndG
F
Fv
F
FCS2VWWWWr"   c                 b    t          | |d||fdt                      i|}t          |d          S )zAPost the kwargs to the flags API endpoint with automatic retries.z/flags/?v=2rM   z$Feature flags evaluated successfullyr   )r   r]   r   r   s         r    flagsr     s`       #$$  C C   r"    personal_api_keyproject_api_keykeyc                 @    t          | d| d| ||          }|j        S )z<Get remote config flag value from remote_config API endpointz%/api/projects/@current/feature_flags/z/remote_config?token=)r   r%   )r   r   rd   r   ro   r   s         r    remote_configr   +  s9     [[[/[[	 H =r"   c                 H    t          | |d||fi |}t          |dd          S )z6Post the `kwargs` to the batch API endpoint for eventsz/batch/r{   F)r   r   r   r   s         r    
batch_postr   <  s@     wiw
A
A&
A
AC9u   r"   r&   c                    t          j        d          }t          |pt                    |z   }d| z  t          d}|r||d<   t                                          |||          }t          |          }	|j        dk    rG|	                    d|	 d           |j
                            d	          }
t          d
|
p|d          S t          |d|	 d          }|j
                            d	          }
t          ||
d          S )a  
    Make a GET request with optional ETag support.

    If an etag is provided, sends If-None-Match header. Returns GetResponse with:
    - not_modified=True and data=None if server returns 304
    - not_modified=False and data=response if server returns 200
    rq   z	Bearer %s)Authorizationru   zIf-None-Match)ry   ro   i0  zGET z returned 304 Not ModifiedETagNT)r%   r&   r'   z completed successfullyr   F)r|   r}   r   rf   r   rZ   r   r!   r   r   ry   r$   r   )rm   r   rd   ro   r&   r   full_urlry   r   
masked_urlresponse_etagr%   s               r    r   r   J  s%    
I
&
&C$T%9\::S@H +g 5ZPPG (#' 
..

Xw

H
HC$X..J #		????@@@//=+@DtTTTT GJGGG  D KOOF++MD}5IIIIr"   c                   H    e Zd Z	 ddeeef         dedee         fdZd Z	dS )r   Nstatusmessager   c                 0    || _         || _        || _        d S r5   )r   r   r   )r8   r   r   r   s       r    r7   zAPIError.__init__r  s      &r"   c                 F    d}|                     | j        | j                  S )Nz[PostHog] {0} ({1}))formatr   r   )r8   msgs     r    __str__zAPIError.__str__y  s    #zz$,444r"   r5   )
r(   r)   r*   r   intr-   r   r   r7   r   r/   r"   r    r   r   q  sc        TX' 'CHo'03'BJ5/' ' ' '5 5 5 5 5r"   r   c                       e Zd ZdS )r   N)r(   r)   r*   r/   r"   r    r   r   ~  s        Dr"   r   c                       e Zd ZdefdZdS )r   objc                     t          |t          t          f          r|                                S t          j                            | |          S r5   )r   r   r   r   r   JSONEncoderdefault)r8   r   s     r    r   zDatetimeSerializer.default  s@    cD(+,, 	#==??"''c222r"   N)r(   r)   r*   r	   r   r/   r"   r    r   r     s/        33 3 3 3 3 3 3r"   r   r5   )r   N)NNFrl   N)NFrl   )Nr   rl   )NNN)[r   r|   r   socketdataclassesr   r   r   r   rn   r   ior   typingr	   r
   r   r   r   rH   dateutil.tzr   requests.adaptersr   urllib3.connectionr   urllib3.util.retryr   posthog.utilsr   posthog.versionr   r   bytesr>   KEEPALIVE_IDLE_SECONDSKEEPALIVE_INTERVAL_SECONDSKEEPALIVE_PROBE_COUNTr   default_socket_options
SOL_SOCKETSO_KEEPALIVEr   r,   attrvaluehasattrappendSOL_TCPgetattrrT   r-   r!   r$   r1   rI   rN   rU   rY   r\   rV   rX   rZ   r]   r_   ra   rc   rg   rh   rf   r   rk   r.   Responser   r   r   r   r   r   r   	Exceptionr   r   
exceptionsTimeoutRequestsTimeoutConnectionErrorRequestsConnectionErrorr   r   r/   r"   r    <module>r      s^     				  ! ! ! ! ! ! - - - - - - - - - -             4 4 4 4 4 4 4 4 4 4 4 4 4 4        ) ) ) ) ) ) - - - - - - $ $ $ $ $ $ / / / / / / # # # # # #U3U3:%6678    ,04), , +Q/, =    +,01)* Y YKD%
 wvt Y!((&.''&$:O:OQV)WXXX 322 ?S ?S ? ? ? ?
        
2 
2 
2 
2 
2; 
2 
2 
2 8M#: hFV      /3 ]+   6 >%%''+/-( / / / +h& + + + +1H, 1 1 1 1:x'> :4 : : : : 2 2 2 2
    3 2 $(
	 	# 	 	 	 	 	*." ""
3-" 	"
 " h&'" " " " "L JN-K -K -K		-K-0-KBF-K
8c!"-K -K -K -Kd 		X 	X	X
3-	X 	X 		X 		X 	X 	X 	X 	 
3-  	 	   2   3- 
	
  	   & 	 
3-  	    " !$J $J$J	$J 3-$J c]	$J
 3-$J $J $J $J $JN
5 
5 
5 
5 
5y 
5 
5 
5	 	 	 	 	h 	 	 	 %-"-= 3 3 3 3 3) 3 3 3 3 3r"   