+
    Kit  c                   sZ   R t ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIH	t	 ^ RI
HtHtHtHtHtHt ^ RIt^ RIHtHtHtHt ^ RIHt ^ RIHt ]'       d   ^ RIt^ RIHt ^ RIHt ]! R	4      ;'       g    ^t R
 ]n!         ! R R]"4      t# ! R R]"4      t$ ! R R4      t%RR R llt&R# )zHTTP utilitiesN)CertificateError)TYPE_CHECKINGAny
CollectionDict	GeneratorOptional)PROJECTSITE_URLVERSIONread_setting)system)logger)HTTPResponse)	CookieJarZdefault_http_timeoutc                  sV    \         P                  ! \        P                  ! 4       R 7      # ))Zcafile)sslZcreate_default_contextcertifiZwhere     5/usr/lib/python3.14/site-packages/lutris/util/http.py<lambda>r      s    C,F,Fgmmo,^r   c                   sF   a a ] tR t^t oRtRV3R lV 3R llltRtVtV ;t# )	HTTPErrorz$Exception raised on request failuresc                s&   < V ^8  d   QhRS[ RS[/# )   messagecode)strintformat__classdict__   "r   __annotate__ZHTTPError.__annotate__    s       3 r   c                s2   < \         SV `  V4       W n        R # N)Zsuper__init__r   )selfr   r   	__class__s   &&&r   r!   ZHTTPError.__init__    s    !	r   r   r    )	__name__
__module____qualname____firstlineno____doc__r!   __static_attributes____classdictcell__Z__classcell__)r#   r   s   @@r   r   r      s     .  r   r   c                   s    ] tR t^%tRtRtR# )UnauthorizedAccessErrorz$Exception raised for 401 HTTP errorsr   N)r%   r&   r'   r(   r)   r*   r   r   r   r,   r,   %   s    .r   r,   c                   sH  a  ] tR t^)t o ]RRRR3V 3R lR llt]V 3R lR l4       t]V 3R lR l4       t	]V 3R lR	 l4       t
RV 3R
 lR lltV 3R lR ltRV 3R lR lltRV 3R lR lltRV 3R lR lltV 3R lR lt]V 3R lR l4       t]V 3R lR l4       tRtV tR# )RequestNc                s`   < V ^8  d   QhRS[ RS[RRRS[S[ S[ 3,          RRRS[S[ ,          /# )	r   urltimeoutstop_requestzthreading.Eventheaderscookiesr   redacted_query_parameters)r   r   r   r   r   r   r   r   Request.__annotate__*   sS        (	
 c3h  $.c?r   c                s(   V P                  V4      V n        R V n        RV n        W n        W0n        RV n        R V n        ^ V n        RV P                  /V n
        R V n        R V n        W`n        Vf   / p\        V\        4      '       g   \!        RP#                  V4      4      hV P                  P%                  V4       V'       dF   \&        P(                  P+                  V4      p\&        P(                  P-                  V4      V n        R # R V n        R # )Nr   z
User-Agentz$HTTP headers needs to be a dict ({})i   )
_clean_urlr.   status_codecontentr/   r0   buffer_size
total_sizedownloaded_size
user_agentr1   response_headersinfor3   Z
isinstanceZdictZ	TypeErrorr   ZupdateurllibrequestZHTTPCookieProcessorZbuild_openeropener)r"   r.   r/   r0   r1   r2   r3   Zcookie_processors   &&&&&&& r   r!   ZRequest.__init__*   s     ??3'*.(& $doo6 $	)B&?G'4((BII'RSSG$%~~AA'J ..556FGDKDKr   c                s&   < V ^8  d   QhRS[ RS[ /# )r   r.   returnr   r   r   r   r   r4   K   s        r   c                s*   V '       g   \        R4      hV R8X  d   \        R4      hV P                  R4      '       d
   RV ,           p V P                  R4      '       d%   \        P                  ! RV 4       \        V ,           p V P                  RR	4      p V # )
z<Checks that a given URL is valid and return a usable versionzAn URL is required!ZNonez!You'd better stop that right now.z//zhttps:Z/zStop using relative URLs!: %sZ z%20)
ValueErrorZ
startswithr   errorr   Zreplace)r.      &r   r5   ZRequest._clean_urlJ   s|     233&=@AA>>$S.C>>#LL8#>S.C kk#u%
r   c                    < V ^8  d   QhRS[ /# r   rA   rB   r   r   r   r   r4   \   s     0 0C 0r   c                s6    R P                  \        \        4      # )z{} {})r   r   r	   r"   rE   r   r;   ZRequest.user_agent[   s    ~~gw//r   c                rF   rG   rB   r   r   r   r   r4   `   s      c r   c                s
   V P                   '       d   \        P                  P                  V P                  4      p\        P                  P                  VP                  4      p. pRpV F+  w  rVWPP                   9   d   RpRpVP                  WV34       K-  	  V'       dX   \        V4      p\        P                  P                  V4      V^&   \        V4      p\        P                  P                  V4      # V P                  # )znA version of the ULR with specified query string parameters
replaced with REDACTED for security. We log these.FTZREDACTED)r3   r>   ZparseZurlparser.   Z	parse_qslZqueryZappendZlistZ	urlencodeZtupleZ
urlunparse)r"   ZparsedZquery_itemsZnew_query_itemsZredacted_anyZkeyZvalueZparsed_partss   &       r   redacted_urlZRequest.redacted_url_   s     )))\\**4884F ,,00>K O L)
888#'L&E&&|4	 * #F|"(,,"8"8"IQ|,||..v66xxr   c                s*   < V ^8  d   QhRS[ RS[RR/# )r   methoddatarA   r-   )r   bytesr   r   r   r   r4   v   s"     ! !s !% !9 !r   c                s   \         P                  ! R WP                  4        \        P                  P                  V P                  W P                  VR7      p T P                  '       d(   T P                  P                  Y0P                  R7      pM+\        P                  P                  Y0P                  R7      p TP)                  4       T n        TP-                  4       T n        T P.                  R8  d"   \         P0                  ! RT P.                  4        \3        TP5                  4       P7                  R4      P9                  4       4      T n        RP?                  T PA                  T4      4      T n!        TP5                  4       T n        TPE                  4        T #   \         d$   p\        RT P                  : RT: 24      ThRp?ii ; i  \        P                  P                   dS   pTP                  R8X  d   \!        RT P                  ,          4      Th\        RT,          TP                  R	7      ThRp?i\"         d   p\        RT,          ^ R	7      ThRp?i\$        P                  \        P                  P&                  3 d$   p\        R
T P                  : RT: 24      ThRp?ii ; i  \<         d    ^ T n         ELyi ; i)z%s %s)r.   rK   r1   rJ   z!Failed to create HTTP request to z: N)r/   i  zAccess to %s deniedz%sr$   zUnable to connect to server i+  zRequest responded with code %szContent-Lengthr   )#r   debugrI   r>   r?   r-   r.   r1   rC   r   r@   openr/   ZurlopenrD   r   r,   r    socketZURLErrorZ
getheadersr<   Zgetcoder6   warningr   r=   getZstripr9   ZAttributeErrorZjoin_iter_chunksr7   Zclose)r"   rJ   rK   Zreqexr?   rD   s   &&&    r   _requestZRequest._requestv   s   Wf&7&78	`..((TXXD,,_e(fC	a{{{++**3*E ..00ll0K !( 2 2 4"??,c!NN;T=M=MN	 !',,."4"45E"F"L"L"NODO xx 1 1' :;LLN	;  	`SUVW]__	` ||%% 	FzzS -.Cdhh.NOUZZD5Luzz:E 	=D5Lq1u< 5 56 	aDHHeTU[``	a  	 DO	 sr   6F" G ,&G *G ;J: "G-GGJ72AH??J7J7I""0J7J7J22J7:KKc                s<   < V ^8  d   QhRRRS[ S[RS[3,          /# )r   r?   r   rA   N)r   rL   r   r   r   r   r4      s'      N yeAS7T r   c              #  s|  "    V P                   '       d*   V P                   P                  4       '       d
   RV n        R#  VP                  V P                  4      pT ;P                  \        T4      ,          un	        T'       g   R# Tx  K    \
        P                  \        3 d   p\        R4      ThRp?ii ; i5i)i   r   zRequest timed outN)r0   Zis_setr7   Zreadr8   rO   r/   ZConnectionResetErrorr   r:   Zlen)r"   r?   Zchunkerrs   &&  r   rR   ZRequest._iter_chunks   s        T%6%6%=%=%?%?">T%5%56   CJ. K NN$89 > 34#=>s3   B<B<	B< B 2B<B9(B44B99B<c                $   < V ^8  d   QhRS[ RR/# r   rK   rA   r-   rL   r   r   r   r   r4      s     * * * *r   c                &    V P                  R V4      # )ZGETrT   r"   rK      &&r   rQ   ZRequest.get   s    }}UD))r   c                rV   rW   rX   r   r   r   r   r4      s     + + +) +r   c                rY   )ZPOSTrZ   r[   r\   r   postZRequest.post   s    }}VT**r   c                rV   rW   rX   r   r   r   r   r4      s     - -5 -I -r   c                rY   )ZDELETErZ   r[   r\   r   deleteZRequest.delete   s    }}Xt,,r   c                rV   )r   pathrA   NrB   r   r   r   r   r4      s     
% 
%# 
%$ 
%r   c                s   V P                   p\        P                  ! R V4       V'       g   \        P                  ! R4       R# \        P
                  P                  V4      p\        P                  ! V4      '       g   \        P                  ! V4       \        VR4      ;_uu_ 4       pVP                  V4       RRR4       R#   + '       g   i     R# ; i)zWriting to %szNo content to writeNZwb)r7   r   rM   rP   osr_   dirnamer   path_existsZmakedirsrN   Zwrite)r"   r_   r7   ra   Z	dest_files   &&   r   write_to_fileZRequest.write_to_file   s    ,,_d+NN01''//$'!!'**KK $OOG$ s   )CC	c                rF   rG   )r   r   r   r   r   r4      s      c r   c                s    V P                   pV'       d    \        P                  ! V4      # / #   \        P                  P                   d*   p\        R T P                   RTR,           R24      ThRp?ii ; i)zJSON response from z could not be decoded: ':NiP   NZ'N)textjsonZloadsZdecoderZJSONDecodeErrorrC   r.   )r"   Z	_raw_jsonrU   s   &  r   re   ZRequest.json   st    II	uzz),, 	 <<// u #6txxj@XYbcfYgXhhi!jkqttus   . A6$A11A6c                rF   rG   rB   r   r   r   r   r4      s      c r   c                s^    V P                   '       d   V P                   P                  4       # R # )Z )r7   ZdecoderH   rE   r   rd   ZRequest.text   s!    <<<<<&&((r   )r8   r7   r:   r1   r=   r@   r3   r<   r6   r0   r/   r9   r.   r    )r%   r&   r'   r(   DEFAULT_TIMEOUTr!   Zstaticmethodr5   Zpropertyr;   rI   rT   rR   rQ   r]   r^   rc   re   rd   r*   r+   )r   s   @r   r-   r-   )   s      '*."&#59 @    0 0  ,! !F * *+ +- -
% 
%    r   r-   c                sj    V ^8  d   QhR\         R\         R\        R\        R\        \         ,          /# )r   r.   dest	overwriteraise_errorsrA   )r   Zboolr   )r   s   "r   r   r      s6      s # $ d _ghk_l r   c                s\   \         P                  ! V4      '       d"   V'       d   \        P                  ! V4       MV# V '       g   R#  \	        V 4      P                  4       pTP                  T4       T#   \         d,   pT'       d   h \        P                  ! RY4        Rp?R# Rp?ii ; i)zSave a remote resource locallyNzFailed to get url %s: %s)
r   rb   r`   Zremover-   rQ   r   r   rD   rc   )r.   rg   rh   ri   r?   rS   s   &&&&  r   download_filerj      s    $IIdOK#,""$ $K  /9	s   	A5 5B+  B&&B+)FF)'r)   re   r`   rO   r   Zurllib.errorr>   Zurllib.parseZurllib.requestr    Ztypingr   r   r   r   r   r   r   Zlutris.settingsr   r   r	   r
   Zlutris.utilr   Zlutris.util.logr   Z	threadingZhttp.clientr   Zhttp.cookiejarr   rf   Z_create_default_https_contextZ	Exceptionr   r,   r-   rj   r   r   r   <module>rk      s      	  
      L L  D D  "((56<<"$^ !	 /i /a aH r   