
    wic                        U d Z ddlZddlZ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
 ddlmZmZmZmZmZmZmZ ddlZddlmZ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m Z m!Z!m"Z"m#Z#m$Z$m%Z% ddlm&Z& ddl'm(Z( ddl)m*Z* ddl+m,Z,  e&j-        e.          Z/dZ0dZ1 ej2        dej3                  Z4 G d de          Z5 G d de          Z6dej7        fdZ8eg ej7        f         Z9e8a:e9e;d<   e8fde9ddfdZ<dej7        fdZ=d?d Z>ed!e?d"e?dej7        fd#            Z@d$dd%ejA        ejB        ejC        jD        fd&d'd(e,d)eEd*e?d+eFd,eFd-eeeG         eeeG         d.f         f         d/ee?ee?d.f         f         defd0ZHd)eEd1eeE         deEfd2ZId@d3ed4eeE         ddfd5ZJd6ee#         d7eEd3ede#fd8ZKd9ej        deEfd:ZL ej2        d;ejM                  ZNd<eeE         d=e?deeE         fd>ZOdS )Az>Contains utilities to handle HTTP requests in Huggingface Hub.    N)	lru_cache)quote)AnyCallableListOptionalTupleTypeUnion)	HTTPErrorResponse)HTTPAdapter)PreparedRequest)OfflineModeIsEnabled   )	constants)BadRequestErrorDisabledRepoErrorEntryNotFoundErrorGatedRepoErrorHfHubHTTPErrorRepositoryNotFoundErrorRevisionNotFoundError   )logging)JSONDecodeError)SliceFileObj)HTTP_METHOD_TX-Amzn-Trace-Idzx-request-ida  
        # staging or production endpoint
        ^https://[^/]+
        (
            # on /api/repo_type/repo_id
            /api/(models|datasets|spaces)/(.+)
            |
            # or /repo_id/resolve/revision/...
            /(.+)/resolve/(.+)
        )
    )flagsc                   6     e Zd ZdZ fdZdedef fdZ xZS )UniqueRequestIdAdapterr   c                     t                      j        |fi | t          |j        vrL|j                            t
                    pt          t          j                              |j        t          <   t          t          |j                            dd                              dk    }t                              d|j        t                    d|j         d|j         d| d	           d S )	Nauthorization r   zRequest z:  z (authenticated: ))superadd_headersX_AMZN_TRACE_IDheadersgetX_REQUEST_IDstruuiduuid4lenloggerdebugmethodurl)selfrequestkwargs	has_token	__class__s       s/var/www/development/aibuddy-work/election-extract/venv/lib/python3.11/site-packages/huggingface_hub/utils/_http.pyr)   z"UniqueRequestIdAdapter.add_headersM   s    G..v... '/11/6/B/B</P/P/eTWX\XbXdXdTeTeGOO, GO//DDEEFFJ	vw7vv7>vvGKvvjsvvv	
 	
 	
 	
 	
    r7   returnc                 H   t           j        r*t                              dt	          |                      	  t                      j        |g|R i |S # t          j        $ r<}|j	        
                    t                    }|g |j        d| dR |_         d}~ww xY w)zSCatch any RequestException to append request id to the error message for debugging.zSend: Nz(Request ID: r'   )r   HF_DEBUGr2   r3   _curlifyr(   sendrequestsRequestExceptionr+   r,   r*   args)r6   r7   rD   r8   e
request_idr:   s         r;   rA   zUniqueRequestIdAdapter.sendZ   s     	7LL5(7"3"355666	577<9$999&999( 	 	 	 ,,_==J%A16A#@:#@#@#@AA	s   A B!%7BB!)	__name__
__module____qualname__r*   r)   r   r   rA   __classcell__)r:   s   @r;   r"   r"   J   si        'O
 
 
 
 
O           r<   r"   c                       e Zd ZdedefdZdS )OfflineAdapterr7   r=   c                 2    t          d|j         d          )NzCannot reach za: offline mode is enabled. To disable it, please unset the `HF_HUB_OFFLINE` environment variable.)r   r5   )r6   r7   rD   r8   s       r;   rA   zOfflineAdapter.sendi   s0    " KGK  K  K  K
 
 	
r<   N)rG   rH   rI   r   r   rA    r<   r;   rL   rL   h   s6        
O 
 
 
 
 
 
 
r<   rL   r=   c                  V   t          j                    } t          j        rE|                     dt                                 |                     dt                                 nD|                     dt                                 |                     dt                                 | S )Nzhttp://zhttps://)rB   Sessionr   HF_HUB_OFFLINEmountrL   r"   )sessions    r;   _default_backend_factoryrT   o   s      G <i!1!1222j."2"23333i!7!9!9:::j"8":":;;;Nr<   _GLOBAL_BACKEND_FACTORYbackend_factoryc                 &    | a t                       dS )a  
    Configure the HTTP backend by providing a `backend_factory`. Any HTTP calls made by `huggingface_hub` will use a
    Session object instantiated by this factory. This can be useful if you are running your scripts in a specific
    environment requiring custom configuration (e.g. custom proxy or certifications).

    Use [`get_session`] to get a configured Session. Since `requests.Session` is not guaranteed to be thread-safe,
    `huggingface_hub` creates 1 Session instance per thread. They are all instantiated using the same `backend_factory`
    set in [`configure_http_backend`]. A LRU cache is used to cache the created sessions (and connections) between
    calls. Max size is 128 to avoid memory leaks if thousands of threads are spawned.

    See [this issue](https://github.com/psf/requests/issues/2766) to know more about thread-safety in `requests`.

    Example:
    ```py
    import requests
    from huggingface_hub import configure_http_backend, get_session

    # Create a factory function that returns a Session with configured proxies
    def backend_factory() -> requests.Session:
        session = requests.Session()
        session.proxies = {"http": "http://10.10.1.10:3128", "https": "https://10.10.1.11:1080"}
        return session

    # Set it as the default session factory
    configure_http_backend(backend_factory=backend_factory)

    # In practice, this is mostly done internally in `huggingface_hub`
    session = get_session()
    ```
    N)rU   reset_sessions)rV   s    r;   configure_http_backendrY   ~   s    @ .r<   c                  h    t          t          j                    t          j                              S )a  
    Get a `requests.Session` object, using the session factory from the user.

    Use [`get_session`] to get a configured Session. Since `requests.Session` is not guaranteed to be thread-safe,
    `huggingface_hub` creates 1 Session instance per thread. They are all instantiated using the same `backend_factory`
    set in [`configure_http_backend`]. A LRU cache is used to cache the created sessions (and connections) between
    calls. Max size is 128 to avoid memory leaks if thousands of threads are spawned.

    See [this issue](https://github.com/psf/requests/issues/2766) to know more about thread-safety in `requests`.

    Example:
    ```py
    import requests
    from huggingface_hub import configure_http_backend, get_session

    # Create a factory function that returns a Session with configured proxies
    def backend_factory() -> requests.Session:
        session = requests.Session()
        session.proxies = {"http": "http://10.10.1.10:3128", "https": "https://10.10.1.11:1080"}
        return session

    # Set it as the default session factory
    configure_http_backend(backend_factory=backend_factory)

    # In practice, this is mostly done internally in `huggingface_hub`
    session = get_session()
    ```
    
process_id	thread_id)_get_session_from_cacheosgetpid	threading	get_identrN   r<   r;   get_sessionrc      s&    : #bikkYEXEZEZ[[[[r<   c                  8    t                                            dS )zReset the cache of sessions.

    Mostly used internally when sessions are reconfigured or an SSLError is raised.
    See [`configure_http_backend`] for more details.
    N)r^   cache_clearrN   r<   r;   rX   rX      s     '')))))r<   r\   r]   c                     t                      S )z
    Create a new session per thread using global factory. Using LRU cache (maxsize 128) to avoid memory leaks when
    using thousands of threads. Cache is cleared when `configure_http_backend` is called.
    )rU   r[   s     r;   r^   r^      s     #$$$r<         )i  i  i  i  )max_retriesbase_wait_timemax_wait_timeretry_on_exceptionsretry_on_status_codesr4   r5   ri   rj   rk   rl   .rm   c          	         t          |t                    r|f}t          |t                    r|f}d}|}	d}
d|v rAt          |d         t          j        t
          f          r|d                                         }
t                      }	 |dz  }	 |
|d                             |
            |j	        d| |d|}|j
        |vr|S t                              d|j
         d|  d	|            ||k    r|                                 |S ne# |$ r]}t                              d
| d|  d	|            t          |t          j                  rt!                       ||k    r|Y d}~nd}~ww xY wt                              d|	 d| d| d           t#          j        |	           t'          ||	dz            }	5)a7  Wrapper around requests to retry calls on an endpoint, with exponential backoff.

    Endpoint call is retried on exceptions (ex: connection timeout, proxy error,...)
    and/or on specific status codes (ex: service unavailable). If the call failed more
    than `max_retries`, the exception is thrown or `raise_for_status` is called on the
    response object.

    Re-implement mechanisms from the `backoff` library to avoid adding an external
    dependencies to `hugging_face_hub`. See https://github.com/litl/backoff.

    Args:
        method (`Literal["GET", "OPTIONS", "HEAD", "POST", "PUT", "PATCH", "DELETE"]`):
            HTTP method to perform.
        url (`str`):
            The URL of the resource to fetch.
        max_retries (`int`, *optional*, defaults to `5`):
            Maximum number of retries, defaults to 5 (no retries).
        base_wait_time (`float`, *optional*, defaults to `1`):
            Duration (in seconds) to wait before retrying the first time.
            Wait time between retries then grows exponentially, capped by
            `max_wait_time`.
        max_wait_time (`float`, *optional*, defaults to `8`):
            Maximum duration (in seconds) to wait before retrying.
        retry_on_exceptions (`Type[Exception]` or `Tuple[Type[Exception]]`, *optional*):
            Define which exceptions must be caught to retry the request. Can be a single type or a tuple of types.
            By default, retry on `requests.Timeout`, `requests.ConnectionError` and `requests.exceptions.ChunkedEncodingError`.
        retry_on_status_codes (`int` or `Tuple[int]`, *optional*, defaults to `(500, 502, 503, 504)`):
            Define on which status codes the request must be retried. By default, 5xx errors are retried.
        **kwargs (`dict`, *optional*):
            kwargs to pass to `requests.request`.

    Example:
    ```
    >>> from huggingface_hub.utils import http_backoff

    # Same usage as "requests.request".
    >>> response = http_backoff("GET", "https://www.google.com")
    >>> response.raise_for_status()

    # If you expect a Gateway Timeout from time to time
    >>> http_backoff("PUT", upload_url, data=data, retry_on_status_codes=504)
    >>> response.raise_for_status()
    ```

    > [!WARNING]
    > When using `requests` it is possible to stream data by passing an iterator to the
    > `data` argument. On http backoff this is a problem as the iterator is not reset
    > after a failed call. This issue is mitigated for file objects or any IO streams
    > by saving the initial position of the cursor (with `data.tell()`) and resetting the
    > cursor between each call (with `data.seek()`). For arbitrary iterators, http backoff
    > will fail. If this is a hard constraint for you, please let us know by opening an
    > issue on [Github](https://github.com/huggingface/huggingface_hub).
    r   NdataTr   )r4   r5   zHTTP Error z thrown while requesting r&   'z' thrown while requesting zRetrying in z	s [Retry /z].r   rN   )
isinstancetypeintioIOBaser   tellrc   seekr7   status_coder2   warningraise_for_statusrB   ConnectionErrorrX   timesleepmin)r4   r5   ri   rj   rk   rl   rm   r8   nb_tries
sleep_timeio_obj_initial_posrS   responseerrs                 r;   http_backoffr      s?   H %t,, 524'-- 9!6 8HJ
 Jvf~	<7PQQ#F^0022mmG#8A	 "-v##$6777 'wHf#HHHHH#+@@@ NNf)=ffX^ffadffggg+%%))+++  	 & # 	 	 	NNLsLLfLLsLLMMM#x788 !   +%%	 &%%%%	 	UjUU8UUkUUUVVV
: 
Q77
G#8s    7D 	AD E0AE++E0endpointc                     |r|                     d          nt          j        }|t          j        t          j        fvr@|                     t          j        |          } |                     t          j        |          } | S )zReplace the default endpoint in a URL by a custom one.

    This is useful when using a proxy and the Hugging Face Hub returns a URL with the default endpoint.
    rq   )rstripr   ENDPOINT_HF_DEFAULT_ENDPOINT_HF_DEFAULT_STAGING_ENDPOINTreplace)r5   r   s     r;   fix_hf_endpoint_in_urlr   O  si    
 (0Gxs###Y5GH	6	8^___kk)8(CCkk)@(KKJr<   r   endpoint_namec                 b   	 |                                   dS # t          $ r}| j                            d          }| j                            d          }|dk    r0| j         ddz   d| j         dz   }t          t          ||           ||dk    r0| j         ddz   d	| j         dz   }t          t          ||           ||d
k    r0| j         ddz   d| j         dz   }t          t          ||           ||dk    r6| j         ddz   d| j         dz   dz   dz   }t          t          ||           ||dk    sH| j        dk    rp|dk    rj| j        c| j        j        Wt                              | j        j                  3| j         ddz   d| j         dz   dz   }t          t          ||           || j        dk    r!|d| dnd}t          t          ||           || j        dk    r4d| j         d| dd| j         dz   dz   }t          t           ||           || j        dk    rY| j        j                            d          }| d| d | j                            d!           d}t          t           ||           |t          t           t#          |          |           |d}~ww xY w)"a(  
    Internal version of `response.raise_for_status()` that will refine a
    potential HTTPError. Raised exception will be an instance of `HfHubHTTPError`.

    This helper is meant to be the unique method to raise_for_status when making a call
    to the Hugging Face Hub.


    Example:
    ```py
        import requests
        from huggingface_hub.utils import get_session, hf_raise_for_status, HfHubHTTPError

        response = get_session().post(...)
        try:
            hf_raise_for_status(response)
        except HfHubHTTPError as e:
            print(str(e)) # formatted message
            e.request_id, e.server_message # details returned by server

            # Complete the error message with additional information once it's raised
            e.append_to_message("
`create_commit` expects the repository to exist.")
            raise
    ```

    Args:
        response (`Response`):
            Response from the server.
        endpoint_name (`str`, *optional*):
            Name of the endpoint that has been called. If provided, the error message
            will be more complete.

    > [!WARNING]
    > Raises when the request has failed:
    >
    >     - [`~utils.RepositoryNotFoundError`]
    >         If the repository to download from cannot be found. This may be because it
    >         doesn't exist, because `repo_type` is not set correctly, or because the repo
    >         is `private` and you do not have access.
    >     - [`~utils.GatedRepoError`]
    >         If the repository exists but is gated and the user is not on the authorized
    >         list.
    >     - [`~utils.RevisionNotFoundError`]
    >         If the repository exists but the revision couldn't be find.
    >     - [`~utils.EntryNotFoundError`]
    >         If the repository exists but the entry (e.g. the requested file) couldn't be
    >         find.
    >     - [`~utils.BadRequestError`]
    >         If request failed with a HTTP 400 BadRequest error.
    >     - [`~utils.HfHubHTTPError`]
    >         If request failed for a reason not listed above.
    zX-Error-CodeX-Error-MessageRevisionNotFoundz Client Error.

zRevision Not Found for url: .EntryNotFoundzEntry Not Found for url: 	GatedRepoz!Cannot access gated repo for url z$Access to this resource is disabled.z!Cannot access repository for url 
RepoNotFoundi  z+Invalid credentials in Authorization headerNzRepository Not Found for url: z
Please make sure you specified the correct `repo_id` and `repo_type`.
If you are trying to access a private or gated repo, make sure you are authenticated. For more details, see https://huggingface.co/docs/huggingface_hub/authenticationi  z

Bad request for z
 endpoint:z

Bad request:i  z Forbidden: z
Cannot access content at: z2
Make sure your token has the correct permissions.i  Rangez. Requested range: z. Content-Range: zContent-Range)r{   r   r+   r,   ry   r5   _formatr   r   r   r   r7   REPO_API_REGEXsearchr   r   r   r.   )r   r   rE   
error_codeerror_messagemessagerange_headers          r;   hf_raise_for_statusr   \  s   jJ?!!##### H? H? H?%)).99
 (,,->??+++!-===FIwhphtIwIwIwwG/(CCJ?**!-===FItemeqItItIttG,gx@@aG;&&'777&@CvgogsCvCvCvv  .'8<<!CDDD'777EhlEEEF  9	9  +Wh??QF>)) C''!NNN , $0%%h&6&:;;G '777B8<BBBCNN  17HEE1L!S((DQD]@}@@@@cu  /7H==1D!S((Ix+IIIII@@@@AGH 
 .'8<<!C!S((#+377@@Lvv|vvhN^NbNbcrNsNsvvvG.'8<<!C nc!ffh77Q>QH?s    J.JJ))J.
error_typecustom_messagec                 j   g }|j                             d          }||                    |           	 |                                }|                    d          }|@t	          |t
                    r|                    |           n|                    |           |                    d          }|$|D ]!}d|v r|                    |d                    "nb# t          $ rU |j                             dd          }|j        r0d|	                                vr|                    |j                   Y nw xY wd |D             }t          t                              |                    }d	                    |          }	|}
|	r=|		                                |	                                vrd
|v r	|
d	|	z   z  }
n|
d
|	z   z  }
t          |j                             t          d                    }|rd| d}n5t          |j                             t          d                    }|rd| d}|r_|	                                |
	                                vr7d	|
v r.|
                    d	          }|
d |         |z   |
|d          z   }
n|
|z  }
 | |
                                ||	pd           S )Nr   errorerrorsr   zContent-Typer%   htmlc                     g | ]D}t          |                                          #t          |                                          ES rN   )r.   strip).0lines     r;   
<listcomp>z_format.<locals>.<listcomp>  s=    VVV4CIIOODUDUVSYY__&&VVVr<   r   r   z (Request ID: r'   z (Amzn Trace ID: )r   server_message)r+   r,   appendjsonrr   listextendr   textlowerdictfromkeysjoinr.   r-   r*   indexr   )r   r   r   server_errorsfrom_headersro   r   r   content_typer   final_error_messagerF   request_id_messagenewline_indexs                 r;   r   r     s'   M #''(9::L\***0}}!!%&& ,$$U++++ $$U+++(## ; ;%%!((y)9::: 0 0 0'++NB??= 	0V<+=+=+?+???  ///	0 WV=VVVM }5566M YY}--N ) ;...008L8L8N8NNN^##4.#886N#::X%)),;;<<J C;j;;; )--orBBCC
 	C!BZ!B!B!B 6j&&((0C0I0I0K0KKK&&&/55d;;M#N]N36HHK^_l_m_mKnn    #55 :)//11HUcUkgklllls   B&C AD;:D;r7   c                    dd| j         fg}t          | j                                                  D ];\  }}|                                dk    rd}|dd                    ||          fgz  }<| j        r| j        }t          |t                    r|	                    dd	          }nt          |d
          rd}t          |          dk    r|dd         dz   }|d|                    dd          fgz  }|d| j        fgz  }g }|D ]M\  }}|r"|                    t          |                     |r"|                    t          |                     Nd                    |          S )zConvert a `requests.PreparedRequest` into a curl command (str).

    Used for debug purposes only.

    Implementation vendored from https://github.com/ofw/curlify/blob/master/curlify.py.
    MIT License Copyright (c) 2016 Egor.
    )curlNz-Xr$   z<TOKEN>z-Hz{0}: {1}zutf-8ignore)r   readz<file-like object>i  Nz ... [truncated]z-dr   r%   r&   )r4   sortedr+   itemsr   formatbodyrr   bytesdecodehasattrr1   r   r5   r   r   r   )r7   partskvr   
flat_partss         r;   r@   r@   (  s    		w~$E
 w,,..// 3 317799''A4**1a00122| 2|dE"" 	(;;wx;88DDT6"" 	('Dt99t;!33D4dB//011	tW[!""EJ ( (1 	(eAhh''' 	(eAhh'''88Jr<   z%^\s*bytes\s*=\s*(\d*)\s*-\s*(\d*)\s*$original_rangeresume_sizec                    | sd| dS d| v rt          d| d          t                              |           }|st          d| d          |                                \  }}|sG|st          d| d          t          |          |z
  }d| }|d	k    rt          d
|d          |S t          |          }||z   }|r2t          |          }d| d| }||k    rt          d
|d          |S d| dS )zB
    Adjust HTTP Range header to account for resume position.
    zbytes=-,zMultiple ranges detected - z, not supported yet.zInvalid range format - r   zbytes=-r   zEmpty new range - )
ValueErrorRANGE_REGEXmatchRuntimeErrorgroupsrt   )r   r   r   startend
new_suffix	new_range	new_starts           r;   _adjust_range_headerr   T  sq     '&&&&&
n]~]]]^^^n--E JH^HHHIIIJE3  	NLLLLMMMXX+
*j**	??BIBBBCCCJJE#I
 #hh.Y....	s??BIBBBCCC I    r<   )r=   N)N)P__doc__ru   r_   rera   r}   r/   	functoolsr   shlexr   typingr   r   r   r   r	   r
   r   rB   r   r   requests.adaptersr   requests.modelsr   huggingface_hub.errorsr   r%   r   r   r   r   r   r   r   r   r   r   _fixesr   _lfsr   _typingr   
get_loggerrG   r2   r*   r-   compileVERBOSEr   r"   rL   rP   rT   BACKEND_FACTORY_TrU   __annotations__rY   rc   rX   rt   r^   Timeoutr|   
exceptionsChunkedEncodingErrorr.   float	Exceptionr   r   r   r   r@   
IGNORECASEr   r   rN   r<   r;   <module>r      s,   E D D 				 				 				                   D D D D D D D D D D D D D D D D D D  ( ( ( ( ( ( ( ( ) ) ) ) ) ) + + + + + + 7 7 7 7 7 7                              # # # # # #       " " " " " " 
	H	%	%
 $
 *       [   <
 
 
 
 
[ 
 
 
("2     R!112 -E * E E E AY ! !,= !]a ! ! ! !H\X% \ \ \ \@* * * * % % %@P % % % %  0P
 :Nx8 x8 x8x8	x8 	x8
 x8 x8 tId9os6J0KKLx8 !eCHo!56x8 x8 x8 x8 x8v
 
x} 
 
 
 
 
? ?( ?8C= ?TX ? ? ? ?DGm^, Gmc GmX GmZh Gm Gm Gm GmT% h. % 3 %  %  %  % R bjA2=QQ"!# "!S "!XVY] "! "! "! "! "! "!r<   