
    'jQ                        U d dl mZ d dlmZmZmZmZmZmZm	Z	m
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mZmZ 	 d dlZn# e$ r d dlZY nw xY w	 d dlmZ n# e$ r	 d dlmZ Y nw xY w	 d	Zd
ZdZdZ dZ!dddddZ"dddddZ#e
e	e$df         ee$         e$f         Z%ee&d<   e G d d                      Z'e G d d                      Z( G d d          Z)dS )    )	dataclass)AnyDictIterableListLiteralOptionalTupleUnion)BayesianNetworkget_possible_values)get_header_networkget_headers_orderget_browser_helper_fileget_input_network   )get_browserget_user_agentpascalize_headerstuplifyN)	TypeAlias)chromefirefoxsafariedge)windowsmacoslinuxandroidios)desktopmobile)12z*MISSING_VALUE*z	same-sitenavigatez?1document)zSec-Fetch-ModezSec-Fetch-DestzSec-Fetch-SitezSec-Fetch-User)zsec-fetch-modezsec-fetch-destzsec-fetch-sitezsec-fetch-user.ListOrStringc                   v    e Zd ZU dZeed<   dZee         ed<   dZ	ee         ed<   dZ
eeef         ed<   d ZdS )	BrowserzORepresents a browser specification with name, min/max version, and HTTP versionnameNmin_versionmax_versionr$   http_versionc                 <   t          | j        t                    rt          | j                  | _        t          | j        t                    rJt          | j        t                    r2| j        | j        k    r$t          d| j         d| j         d          d S d S d S )Nz Browser min version constraint (z) cannot exceed max version ())
isinstancer-   intstrr+   r,   
ValueErrorselfs    b/home/ice/.hermes/hermes-agent/venv/lib/python3.11/site-packages/browserforge/headers/generator.py__post_init__zBrowser.__post_init__7   s    d'-- 	7 #D$5 6 6D t'--	4+S11	  4#333u43Cuubfbruuu  	 	 	 	 43    )__name__
__module____qualname____doc__r2   __annotations__r+   r	   r1   r,   r-   r   r7    r8   r6   r)   r)   .   st         YY
III!%K#%%%!%K#%%%$'L%S/'''    r8   r)   c                   n    e Zd ZU dZee         ed<   eedf         ed<   eed<   eed<   e	d             Z
dS )	HttpBrowserObjectzWRepresents an HTTP browser object with name, version, complete string, and HTTP versionr*   .versioncomplete_stringr-   c                     | j         dk    S )Nr$   )r-   r4   s    r6   is_http2zHttpBrowserObject.is_http2O   s     C''r8   N)r9   r:   r;   r<   r	   r2   r=   r
   r1   propertyrD   r>   r8   r6   r@   r@   F   sq         aa
3-38_( ( X( ( (r8   r@   c                   j   e Zd ZU dZdZeedf         ed<    e e	                      Z
 e e                      Zeeedddfdeeee         f         d	ed
ededed         defdZddddddddddeeeeef                           d	ee         d
ee         dee         deed                  dee         dee         deeeef                  fdZ	 	 d/deeeef                  deee                  dedeeef         fdZdeeef         fdZdeeeef                  dedee         fdZdee         dee         fdZdeeef         deeef         fdZ deeef         deeee         f         fdZ!de"defd Z#d!edefd"Z$deeee         f         fd#Z%dee"         fd$Z&d%eeee         f         d&eeef         d'eeef         deeee         f         fd(Z'e(d)ed&eeef         d'eeef         defd*            Z)e(d)ed&eeef         d'eeef         d+edef
d,            Z*d-ede"fd.Z+dS )0HeaderGeneratorz4Generates HTTP headers based on a set of constraints)localesdevicesoperatingSystemsbrowsers.relaxation_orderzen-US   Fbrowserosdevicelocaler-   )r   rM   strictc                 4   t          |          }|                     t          |          |          t          |          t          |          t          |          ||d| _        |                                 | _        |                                 | _        dS )a  
        Initializes the HeaderGenerator with the given options.

        Parameters:
            browser (Union[ListOrString, Iterable[Browser]], optional): Browser(s) or Browser object(s).
            os (ListOrString, optional): Operating system(s) to generate headers for.
            device (ListOrString, optional): Device(s) to generate the headers for.
            locale (ListOrString, optional): List of at most 10 languages for the Accept-Language header. Default is 'en-US'.
            http_version (Literal[1, 2], optional): Http version to be used to generate headers. Defaults to 2.
            strict (bool, optional): Throws an error if it cannot generate headers based on the input. Defaults to False.
        )rK   rO   rI   rH   r-   rR   N)r2   _prepare_browsers_configr   options_load_unique_browsersunique_browsers_load_headers_orderheaders_order)r5   rN   rO   rP   rQ   r-   rR   http_vers           r6   __init__zHeaderGenerator.__init__]   s    ( L)) 55gg6F6FQQ"++vv$
 
  $99;;!5577r8   N)rN   rO   rP   rQ   r-   
user_agentrR   request_dependent_headersr\   r]   c          	      b   t          |          t          |          t          |          t          |          |rt          |          nd|t          |          |d}	 | j        di d |	                                D             }
|	d         p| j        d         dk    rt          |
          S |
S )a  
        Generates headers using the default options and their possible overrides.

        Parameters:
            browser (Optional[Iterable[Union[str, Browser]]], optional): Browser(s) to generate the headers for.
            os (Optional[ListOrString], optional): Operating system(s) to generate the headers for.
            device (Optional[ListOrString], optional): Device(s) to generate the headers for.
            locale (Optional[ListOrString], optional): Language(s) to include in the Accept-Language header.
            http_version (Optional[Literal[1, 2]], optional): HTTP version to be used to generate headers.
            user_agent (Optional[ListOrString], optional): User-Agent(s) to use.
            request_dependent_headers (Optional[Dict[str, str]], optional): Known values of request-dependent headers.
            strict (Optional[bool], optional): If true, throws an error if it cannot generate headers based on the input.
        N)rK   rO   rI   rH   r-   rR   r\   r]   c                     i | ]
\  }}|||S Nr>   .0kvs      r6   
<dictcomp>z,HeaderGenerator.generate.<locals>.<dictcomp>   s    AAA11=q!===r8   r-   r$   r>   )r   r2   _get_headersitemsrU   r   )r5   rN   rO   rP   rQ   r-   r\   rR   r]   rU   	generateds              r6   generatezHeaderGenerator.generate   s    6  (("++vv1=GC---4!*--)B	
 	
 %6D$5 %
 %
AAAAA%
 %
	 N#Ct|N'CKK$Y///r8   rU   returnc                     |i }dv sdv r,d         | j         d         k    r|                                i | j         }|                     |          }|rZt          |t          t
          f          st	          |          }t          | j        d|i          t          | j        d|i          }}ni i }}|                     |||          }| j	        
                    |          }	|	s|d         dk    r5 | j        ||fi ddi}
|                     t          |
                    S t          fdt          | j                  D             d	          }|d
         s|d	k    rt#          d          i }|| j        |         =  | j        ||fi |S | j                            |	          }|                     |d                   }|j        rdnd}|                     |d                   ||<   |                     |          r<|j        r|                    t0                     n|                    t2                     d |                                D             }|                     i ||          S )a  
        Generates HTTP headers based on the given constraints.

        Parameters:
            request_dependent_headers (Dict[str, str], optional): Dictionary of request-dependent headers.
            user_agent (Iterable[str], optional): User-Agent value(s).
            **options (Any): Additional options for header generation.

        Returns:
            Dict[str, str]: Dictionary of generated HTTP headers.
        NrK   r-   z
User-Agentz
user-agentr#   r$   c              3   *   K   | ]\  }}|v 	|V  d S r`   r>   )rb   ikeyrU   s      r6   	<genexpr>z/HeaderGenerator._get_headers.<locals>.<genexpr>   s+      TTvq#SG^^^^^^TTr8   rR   zoNo headers based on this input can be generated. Please relax or change some of the requirements you specified.*BROWSER_HTTPzaccept-languagezAccept-LanguagerH   c                     i | ]F\  }}|                                 d k    r|dk    s#|                    d          s|t          k    C||GS )
connectionclose*)lower
startswithMISSING_VALUE_DATASET_TOKENra   s      r6   re   z0HeaderGenerator._get_headers.<locals>.<dictcomp>  sf     	
 	
 	
1		\))LL<<$$ !333 q 433r8   )rU   _update_http_version_get_possible_attribute_valuesr0   tuplelistr   header_generator_network_prepare_constraintsinput_generator_network(generate_consistent_sample_when_possiblerf   order_headersr   next	enumeraterL   r3   generate_sample_prepare_http_browser_objectrD   _get_accept_language_header_should_add_sec_fetchupdateHTTP2_SEC_FETCH_ATTRIBUTESHTTP1_SEC_FETCH_ATTRIBUTESrg   )r5   r]   r\   rU   header_optionspossible_attribute_valueshttp1_valueshttp2_valuesconstraintsinput_sampleheaders2relaxation_indexrelaxed_optionsgenerated_samplegenerated_http_and_browseraccept_language_field_names      `            r6   rf   zHeaderGenerator._get_headers   sE   " %,(*%   g%%'4<+GGG%%g...4DL4G4$($G$G$W$W! 		0j5$-88 /":..
#D$ALR\C]^^#D$ALR\C]^^ 'LL
 *,R,L//%|\
 
 3\\
 
  	_n-44,4,-z =D SV   ))*;H*E*EFFF#TTTT4+@!A!ATTTVX    h' +;r+A+A  F   *kO 56F GH$4$%>
^^o^^^8HHVV%)%F%F_-&
 &
" "<!D[J[ 	# 8<7W7W9%8
 8
34
 %%&@AA 	D)2 D ''(BCCCC ''(BCCC	
 	
(..00	
 	
 	
 !!"S%5"S9R"STTTr8   c                     d|v r	|d         n| j         d         d|v r!|                     |d                   |d<   dS fd| j         d         D             |d<   dS )z
        Prepares options when a `browsers` or `http_version` kwarg is passed to .generate.

        Parameters:
            options (Dict[str, Any]): Other arguments.
        r-   rK   c                     g | ]J}t          |t                    r"t          |j        |j        |j                   nt          |          KS ))r*   r+   r,   r-   r*   r-   )r0   r)   r*   r+   r,   )rb   brwsrr-   s     r6   
<listcomp>z8HeaderGenerator._update_http_version.<locals>.<listcomp>$  sw     # # #  "%11HG"Z$)$5$)$5%1	    !e,GGG# # #r8   N)rU   rT   )r5   rU   r-   s     @r6   ry   z$HeaderGenerator._update_http_version  s     W$$">2LL<7L  "&"?"?
@SUa"b"bGJ# # # # "\*5# # #GJr8   rK   c                      fd|D             S )aU  
        Prepares the browser configuration based on the given browsers and HTTP version.

        Parameters:
            browsers (Iterable[Union[str, Browser]]): Supported browsers or Browser objects.
            http_version (str): HTTP version ('1' or '2').

        Returns:
            List[Browser]: List of Browser objects.
        c                 `    g | ]*}t          |t                    rt          |           n|+S )r   )r0   r2   r)   )rb   rN   r-   s     r6   r   z<HeaderGenerator._prepare_browsers_config.<locals>.<listcomp>?  sO     
 
 
  gs++W<@@@@	
 
 
r8   r>   )r5   rK   r-   s     `r6   rT   z(HeaderGenerator._prepare_browsers_config2  s0    
 
 
 
 $
 
 
 	
r8   c                        fd|D             S )a  
        Retrieves the browser HTTP options based on the given browser specifications.

        Parameters:
            browsers (Iterable[Browser]): Iterable of Browser objects.

        Returns:
            List[str]: List of browser HTTP options.
        c                     g | ]t}j         D ]j}|j        |j        k    rX|j        r|j        |j        d          k    r;|j        r|j        |j        d          k    r|j        r|j        |j        k    c|j        kuS )r   )rW   r*   r+   rA   r,   r-   rB   )rb   rN   browser_optionr5   s      r6   r   z=HeaderGenerator._get_browser_http_options.<locals>.<listcomp>R  s     
 
 
"&"6
 
 |~222( 3,3,?>CYZ[C\,\,\( -],3,?>CYZ[C\,\,\) -]-4-A^E`-`-` * .a-`-`-`r8   r>   )r5   rK   s   ` r6   _get_browser_http_optionsz)HeaderGenerator._get_browser_http_optionsH  s.    
 
 
 
#
 
 
 	
r8   headersc                     t                    }|t          d          t          |          }|t          d          | j                            |          }|rfd|D             nS )z
        Orders the headers based on the browser-specific header order.

        Parameters:
            headers (Dict[str, str]): Dictionary of headers.

        Returns:
            Dict[str, str]: Ordered dictionary of headers.
        Nz/Failed to find User-Agent in generated responsez$Failed to find browser in User-Agentc                 *    i | ]}|v ||         S r>   r>   )rb   rn   r   s     r6   re   z1HeaderGenerator.order_headers.<locals>.<dictcomp>q  s$    III3#..S'#,...r8   )r   r3   r   rY   get)r5   r   r\   browser_nameheader_orders    `   r6   r   zHeaderGenerator.order_headers\  s     $G,,
NOOO":..CDDD)--l;; IIII,IIII	
r8   r   c                    |                      |                    dd          |                    dd                    }|                     |          }||                    dt                    d}d|v r|d         |d<   |S )	a  
        Retrieves the possible attribute values based on the given header options.

        Parameters:
            header_options (Dict[str, Any]): Dictionary of header options.

        Returns:
            Dict[str, List[str]]: Dictionary of possible attribute values.
        rK   r>   r-   r$   rO   )rq   z*OPERATING_SYSTEMrI   z*DEVICE)rT   r   r   SUPPORTED_OPERATING_SYSTEMS)r5   r   rK   browser_http_optionsr   s        r6   rz   z.HeaderGenerator._get_possible_attribute_valuesv  s     00z2..~s33
 
  $==hGG 2!/!3!3D:U!V!V%
 %
! &&3A)3L%i0((r8   c                     |j         dk    r|j        d         dk    rdS |j         dk    r|j        d         dk    rdS |j         dk    r|j        d         dk    rdS d	S )
a  
        Determines whether Sec-Fetch headers should be added based on the user agent.

        Parameters:
            browser (HttpBrowserObject): Browser object.

        Returns:
            bool: True if Sec-Fetch headers should be added, False otherwise.
        r   r   L   Tr   Z   r   O   F)r*   rA   )r5   rN   s     r6   r   z%HeaderGenerator._should_add_sec_fetch  sr     <8##(:b(@(@4<9$$);r)A)A4<6!!goa&8B&>&>4ur8   rH   c                 Z    d                     d t          |          D                       S )z
        Generates the Accept-Language header based on the given locales.

        Parameters:
            locales (ListOrString): Locale(s).

        Returns:
            str: Accept-Language header string.
        z, c              3   8   K   | ]\  }}| d d|dz  z
  dV  dS )z;q=g      ?g?z.1fNr>   )rb   indexrQ   s      r6   ro   z>HeaderGenerator._get_accept_language_header.<locals>.<genexpr>  sQ       
 
6CeVv11#+111
 
 
 
 
 
r8   )joinr   )r5   rH   s     r6   r   z+HeaderGenerator._get_accept_language_header  s?     yy 
 
GPQXGYGY
 
 
 
 
 	
r8   c                 f    t          j        t                                                                S )z
        Loads the headers order from the headers-order.json file.

        Returns:
            Dict[str, List[str]]: Dictionary of headers order for each browser.
        )jsonloadsr   
read_bytesr4   s    r6   rX   z#HeaderGenerator._load_headers_order  s'     z+--88::;;;r8   c                      t          j        t                                                                } fd|D             S )z
        Loads the unique browsers from the browser-helper-file.json file.

        Returns:
            List[HttpBrowserObject]: List of HttpBrowserObject instances.
        c                 P    g | ]"}|t           k                        |          #S r>   )rx   r   )rb   browser_strr5   s     r6   r   z9HeaderGenerator._load_unique_browsers.<locals>.<listcomp>  s=     
 
 
999 --k::999r8   )r   r   r   r   )r5   unique_browser_stringss   ` r6   rV   z%HeaderGenerator._load_unique_browsers  sS     "&,C,E,E,P,P,R,R!S!S
 
 
 
5
 
 
 	
r8   r   r   r   c                 L      fd|                                 D             S )a  
        Prepares the constraints for generating consistent samples.

        Parameters:
            possible_attribute_values (Dict[str, List[str]]): Dictionary of possible attribute values.
            http1_values (Dict[str, Any]): Dictionary of HTTP/1 values.
            http2_values (Dict[str, Any]): Dictionary of HTTP/2 values.

        Returns:
            Dict[str, Iterable[str]]: Dictionary of constraints for each attribute.
        c                 `    i | ])\  }t          t          fd |                    *S )c                 n    dk    r                     |           n                    |           S )Nrq   )filter_browser_httpfilter_other_values)xr   r   rn   r5   s    r6   <lambda>zAHeaderGenerator._prepare_constraints.<locals>.<dictcomp>.<lambda>  sE    /11 00L,OOO!55a|UXYY r8   )r{   filter)rb   valuesrn   r   r   r5   s     @r6   re   z8HeaderGenerator._prepare_constraints.<locals>.<dictcomp>  sq     
 
 
 V       
  	 	
 
 
r8   )rg   )r5   r   r   r   s   ` ``r6   r~   z$HeaderGenerator._prepare_constraints  sH    "
 
 
 
 
 
  9>>@@
 
 
 	
r8   valuec                     |                      d          \  }}|dk    r| p||                    dd          v n| p||                    dd          v S )a  
        Filters the browser HTTP value based on the HTTP/1 and HTTP/2 values.

        Parameters:
            value (str): Browser HTTP value.
            http1_values (Dict[str, Any]): Dictionary of HTTP/1 values.
            http2_values (Dict[str, Any]): Dictionary of HTTP/2 values.

        Returns:
            bool: True if the value should be included, False otherwise.
        |r#   z*BROWSERr>   )splitr   )r   r   r   r   r-   s        r6   r   z#HeaderGenerator.filter_browser_http  sp     &+[[%5%5"l s"" Q1A1A*b1Q1Q!Q""Vll6F6FzSU6V6V&V	
r8   rn   c                 n    |s|r0| |                     |d          v p| |                     |d          v S dS )a  
        Filters the other attribute values based on the HTTP/1 and HTTP/2 values.

        Parameters:
            value (str): Attribute value.
            http1_values (Dict[str, Any]): Dictionary of HTTP/1 values.
            http2_values (Dict[str, Any]): Dictionary of HTTP/2 values.
            key (str): Attribute key.

        Returns:
            bool: True if the value should be included, False otherwise.
        r>   T)r   )r   r   r   rn   s       r6   r   z#HeaderGenerator.filter_other_values  sQ       	\< 	\L,,S"555[,BRBRSVXZB[B[9[[tr8   http_browser_stringc                 *   |                     d          \  }}|t          k    rt          ddt          d          S |                     d          \  }}|                     d          }t          d |D                       }t          ||||          S )	z
        Extracts structured information about a browser and HTTP version from a string.

        Parameters:
            http_browser_string (str): HTTP browser string.

        Returns:
            HttpBrowserObject: HttpBrowserObject instance.
        r   Nr>    )r*   rA   rB   r-   /.c              3   4   K   | ]}t          |          V  d S r`   )r1   )rb   parts     r6   ro   z?HeaderGenerator._prepare_http_browser_object.<locals>.<genexpr>#  s(      <<dD		<<<<<<r8   )r   rx   r@   r{   )r5   r   browser_stringr-   r   version_stringversion_partsrA   s           r6   r   z,HeaderGenerator._prepare_http_browser_object  s     (;'@'@'E'E$888$27Rac    (6';';C'@'@$n&,,S11<<m<<<<< /%	
 
 
 	
r8   )NN),r9   r:   r;   r<   rL   r
   r2   r=   r   r   r   r   r}   SUPPORTED_BROWSERSr   SUPPORTED_DEVICESr   r'   r   r)   r   boolr[   r	   r   ri   r   rf   ry   r   rT   r   r   rz   r@   r   r   rX   rV   r~   staticmethodr   r   r   r>   r8   r6   rG   rG   T   s        >>(^eCHo^^^ .o.?.?.A.ABB./A/A/C/CDD ;M60&&' 8  8|Xg%667 8  8 	 8
  8 dm 8  8  8  8  8J <@%))-)-04-1!%>B) ) ) (5g#678) \"	)
 &) &) wt}-) \*) ) $,DcN#;) ) ) )Z ?C.2eU eU#+DcN#;eU Xc]+eU 	eU
 
c3heU eU eU eUNc3h   B
 sG|!45
EH
	g
 
 
 
,
(72C 
S	 
 
 
 
(
T#s(^ 
S#X 
 
 
 
4)"38n)	c49n	) ) ) )6-> 4    $
< 
C 
 
 
 
<T#tCy.%9 < < < <
t,='> 
 
 
 

#'T#Y#7
 38n
 38n	

 
c8C= 	!
 
 
 
> 

"&sCx.
@DS#X
	
 
 
 \
* "&sCx.@DS#XUX	   \&
 
HY 
 
 
 
 
 
r8   rG   )*dataclassesr   typingr   r   r   r   r   r	   r
   r   browserforge.bayesian_networkr   r   apify_fingerprint_datapointsr   r   r   r   utilsr   r   r   r   orjsonr   ImportErrorr   typing_extensionsr   r   r   SUPPORTED_HTTP_VERSIONSrx   r   r   r2   r'   r=   r)   r@   rG   r>   r8   r6   <module>r      s   ! ! ! ! ! ! ! M M M M M M M M M M M M M M M M M M M M N N N N N N N N            K J J J J J J J J J J J   KKKKK,        , , ,++++++++, < M ) $ / !  	   "  	    c3hcC ?@i @ @ @        . 
( 
( 
( 
( 
( 
( 
( 
(U
 U
 U
 U
 U
 U
 U
 U
 U
 U
s#   A 	AAA A'&A'