
    h%                     H   S SK J r Jr  S SKrS SKrS SKrS SKrS SKrS SKrS SK	J
r
  S SKJrJrJrJrJr  S SKrS SKrS SKrS SKJrJr  S SKJr  SSKJr  \" S	5       " S
 S\5      5       r\R8                  \l        \" S5       " S S\5      5       r\R8                  \l        g)    )datetimetimezoneN)Path)IterableOptionalTupleUnionCallable)Clientregister_client_class)FileCacheMode   )HttpPathhttpc                     ^  \ rS rSrSS\R
                  SSSS4S\\\\	4      S\\\\
R                  4      S\\   S\\R                  R                     S\\\/\\   4      S	\\\/\4      S
\\   4U 4S jjjrS\S\4S jrS\S\\   4S jrS\S\\\
R                  4   S\4S jrS\S\4S jrS&S\S\S\S\4S jjrS&S\S\SS4S jjrS\S\S\\\\4      4S jrS\\\
R                  4   S\S\4S jrS\S\4S jrS'S\S\ S\4S jjr!S\S \S\\\\4      4S! jr"S"\S#\S\\#RH                  RJ                  \&4   4S$ jrS%r'U =r($ )(
HttpClient   NPUTfile_cache_modelocal_cache_dircontent_type_methodauthcustom_list_page_parsercustom_dir_matcherwrite_file_http_methodc                 "  > [         TU ]  XU5        X@l        U R                  c$  [        R                  R                  5       U l        O.[        R                  R                  U R                  5      U l        XPl        Ub  UOS U l        Xpl	        g)a  Class constructor. Creates an HTTP client that can be used to interact with HTTP servers
    using the cloudpathlib library.

Args:
    file_cache_mode (Optional[Union[str, FileCacheMode]]): How often to clear the file cache; see
        [the caching docs](https://cloudpathlib.drivendata.org/stable/caching/) for more information
        about the options in cloudpathlib.eums.FileCacheMode.
    local_cache_dir (Optional[Union[str, os.PathLike]]): Path to directory to use as cache
        for downloaded files. If None, will use a temporary directory. Default can be set with
        the `CLOUDPATHLIB_LOCAL_CACHE_DIR` environment variable.
    content_type_method (Optional[Callable]): Function to call to guess media type (mimetype) when
        uploading files. Defaults to `mimetypes.guess_type`.
    auth (Optional[urllib.request.BaseHandler]): Authentication handler to use for the client. Defaults to None, which will use the default handler.
    custom_list_page_parser (Optional[Callable[[str], Iterable[str]]]): Function to call to parse pages that list directories. Defaults to looking for `<a>` tags with `href`.
    custom_dir_matcher (Optional[Callable[[str], bool]]): Function to call to identify a url that is a directory. Defaults to a lambda that checks if the path ends with a `/`.
    write_file_http_method (Optional[str]): HTTP method to use when writing files. Defaults to "PUT", but some servers may want "POST".
Nc                 $    U R                  S5      $ )N/)endswith)xs    V/home/james-whalen/.local/lib/python3.13/site-packages/cloudpathlib/http/httpclient.py<lambda>%HttpClient.__init__.<locals>.<lambda><   s    PQPZPZ[^P_    )
super__init__r   urllibrequestbuild_openeropenerr   dir_matcherr   )	selfr   r   r   r   r   r   r   	__class__s	           r!   r&   HttpClient.__init__   sv    6 	;NO	99 ..557DK ..55dii@DK'>$ #5"@F_ 	 '=#r$   
cloud_pathreturnc                    U R                   R                  UR                  5       5       nUR                  R	                  SS 5      nUb4  [
        R                  " US5      nUR                  [        R                  S9n[        UR                  R	                  SS5      5      UUR                  R	                  SS 5      S.sS S S 5        $ ! , (       d  f       g = f)NzLast-Modifiedz%a, %d %b %Y %H:%M:%S %Z)tzinfozContent-Lengthr   Content-Type)sizelast_modifiedcontent_type)r*   openas_urlheadersgetr   strptimereplacer   utcint)r,   r/   responser5   s       r!   _get_metadataHttpClient._get_metadataA   s    [[j//12h$,,00$GM( ( 1 1-A[ \ !. 5 5X\\ 5 J H,,001A1EF!. ( 0 0 4 4^T J 322s   BC


Cc                 N    U R                  UR                  5       5      (       a  gg)Ndirfile)r+   r8   r,   r/   s     r!   _is_file_or_dirHttpClient._is_file_or_dirR   s"    J--/00r$   
local_pathc                 Z   [        U5      nU R                  R                  UR                  5       5       nUR                  R                  SSS9  UR                  S5       n[        R                  " X45        S S S 5        S S S 5        U$ ! , (       d  f       N= f! , (       d  f       U$ = f)NT)parentsexist_okwb)r   r*   r7   r8   parentmkdirshutilcopyfileobj)r,   r/   rH   r?   out_files        r!   _download_fileHttpClient._download_fileX   s    *%
[[j//12h##D4#@&(""86 ' 3
  '& 32
 s#   ,B!B
8B

B	B
B*c                    [         R                  R                  UR                  5       SS9n U R                  R                  U5       nUR                  S:H  sS S S 5        $ ! , (       d  f       g = f! [         R                  R                  [         R                  R                  4 aD  n[        U[         R                  R                  5      (       d  UR                  S:X  a   S nAge S nAff = f)NHEADmethod     F)r'   r(   Requestr8   r*   r7   statuserror	HTTPErrorURLError
isinstancecode)r,   r/   r(   r?   es        r!   _existsHttpClient._existsa   s    ..(():):)<V(L	!!'*h#- +**&&(=(=> 	!V\\2233qvv}	s;   A3 	A"	A3 "
A0,A3 0A3 38C/+9C*)C**C/srcdst
remove_srcc           	          U R                  UR                  U5        U(       a   U R                  U5        U$ U$ ! [         a*  n[        R
                  " SU SU SU 3[        5        e S nAff = f)Nz"File was successfully uploaded to z but failed to remove original z: )_upload_filefspath_remove	ExceptionwarningswarnUserWarning)r,   rd   re   rf   ra   s        r!   
_move_fileHttpClient._move_filek   sw    #**c*S! 
s
  8=\]`\aacdecfg s   : 
A.%A))A.
missing_okc                    [         R                  R                  UR                  5       SS9n U R                  R                  U5       nUR                  S:w  a  [        SU S35      e S S S 5        g ! , (       d  f       g = f! [         R                  R                   a0  nUR                  S:X  a  U(       a   S nAg [        SU S35      eS nAff = f)NDELETErV      zFailed to delete .rY   )r'   r(   rZ   r8   r*   r7   r[   rk   r\   r]   r`   FileNotFoundError)r,   r/   rq   r(   r?   ra   s         r!   rj   HttpClient._removey   s    ..(():):)<X(N	K!!'*h??c)#&7
|1$EFF * +** ||%% 	Kvv}'*;J<q(IJJ		Ks;   B 	 A3*B 3
B=B B C"C>CC	recursivec              #     #     U R                   R                  UR                  5       5       nU R                  UR	                  5       R                  5       [        U5      S9 H4  u  pEXE4v   U(       d  M  U(       d  M  U R                  USS9 S h  vN   M6     S S S 5        g  N! , (       d  f       g = f! [         a  n[        SU 35      eS nAff = f7f)N)base_urlT)rx   z{Unable to parse response as a listing of files; please provide a custom parser as `custom_list_page_parser`. Error raised: )
r*   r7   r8   _parse_list_dir_responsereaddecodestr	_list_dirrk   NotImplementedError)r,   r/   rx   r?   pathis_dirra   s          r!   r   HttpClient._list_dir   s     	!!*"3"3"56($($A$AMMO**,s: %B %LD ,& !yVV#'>>$$>#GGG% 76 H 76  	% N  OP  NQ  R 	sj   C)B7 AB&6B&?B&B$B&B7 #C$B&&
B40B7 3C4B7 7
CCCCc           	      (   [        U5      nU R                  b  U R                  U5      u  p4SW=(       d    S0nUR                  S5       n[        R                  R                  UR                  5       UR                  5       U R                  US9nU R                  R                  U5       nUR                  S:w  a"  UR                  S:w  a  [        SU SU S	35      eS S S 5        S S S 5        U$ ! , (       d  f       N= f! , (       d  f       U$ = f)
Nr3   zapplication/octet-streamrb)datarW   r9      rX   zFailed to upload z to ru   )r   r   r7   r'   r(   rZ   r8   r|   r   r*   r[   rk   )	r,   rH   r/   r6   _r9   	file_datar(   r?   s	            r!   rh   HttpClient._upload_file   s    *%
##/"66zBOL!<#M3MN__T"inn,,!!#^^%22	 - G !!'*h??c)hoo.D#&7
|4
|ST$UVV + #  +* #" s%   
A"D,3C1D1
C?	;D
Dc                 "    UR                  5       $ N)r8   rE   s     r!   _get_public_urlHttpClient._get_public_url   s      ""r$   expire_secondsc                     [        S5      e)Nz.Presigned URLs are not supported using urllib.)r   )r,   r/   r   s      r!   _generate_presigned_url"HttpClient._generate_presigned_url   s    !"RSSr$   r?   rz   c              #      ^ ^#    TR                  S5      (       d  TS-  mS[        S[        [           4S jnT R                  b  T R                  OUnUU 4S jU" U5       5        S h  vN   g  N7f)Nr   htmlr0   c                 0    [         R                  " SU 5      $ )Nz<a\s+href="([^"]+)")refindall)r   s    r!   _simple_links:HttpClient._parse_list_dir_response.<locals>._simple_links   s    ::4d;;r$   c              3      >#    U  HE  nTR                  [        R                  R                  TU5      5      TR	                  U5      4v   MG     g 7fr   )	CloudPathr'   parseurljoinr+   ).0matchrz   r,   s     r!   	<genexpr>6HttpClient._parse_list_dir_response.<locals>.<genexpr>   sC      
) ^^V\\11(EBDdFVFVW\F]^)s   AA)r   r~   r   r   )r,   r?   rz   r   parsers   ` `  r!   r{   #HttpClient._parse_list_dir_response   sv        %%OH	< 	< 	<
 ++7 (( 	
)
 	
 	
s   A%A1)A/*A1urlrW   c                     [         R                  R                  " UR                  5       4SU0UD6nU R                  R                  U5       nXUR                  5       4sS S S 5        $ ! , (       d  f       g = f)NrW   )r'   r(   rZ   r8   r*   r7   r|   )r,   r   rW   kwargsr(   r?   s         r!   r(   HttpClient.request   sV     ..((OfOO[[g&( ]]_, '&&s   A((
A6)r   r   r+   r*   r   )T)i  ))__name__
__module____qualname____firstlineno__	mimetypes
guess_typer   r	   r~   r   osPathLiker
   r'   r(   BaseHandlerr   boolr&   r   dictr@   rF   r   rR   rb   ro   rj   r   r   rh   r   r>   r   r{   r   clientHTTPResponsebytes__static_attributes____classcell__)r-   s   @r!   r   r      s]    @D=A2;2F2F59LP>B05)=!%](:";<)= "%R[[(8"9:)= &h/	)=
 v~~112)= "*(C5(3-3G*H!I)= %XseTk%:;)= !))= )=V T "( x}  uS"++EU?V [_ ( t h X 4 S[ 
K( 
K 
K 
KH  (5QY[_Q_K`Ba $uS"++-='> H Ya &#( #s #T( TC T^a T

'*
	%$'	(
*--%(-	t{{''.	/- -r$   r   httpsc                       \ rS rSrSrg)HttpsClient    N)r   r   r   r   r   r   r$   r!   r   r      s    r$   r   )r   r   r   r   r   urllib.requestr'   urllib.parseurllib.errorpathlibr   typingr   r   r   r	   r
   rO   r   rl   cloudpathlib.clientr   r   cloudpathlib.enumsr   httppathr   r   r   r   	HttpsPathr   r$   r!   <module>r      s    '  	 	     = =    = ,  vw- w- w-t !**
  w	* 	  	 $-- r$   