
    ;3hc                        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 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^                  e0      Z1dZ2dZ3 ejh                  dejj                        Z6 G d de      Z7 G d de      Z8dejr                  fdZ:eg ejr                  f   Z;e:a<e;e=d<   e:fde;ddfdZ>dejr                  fd Z?d?d!Z@ed"eAd#eAdejr                  fd$       ZBd%dd&ej                  ej                  fe
j                  d'd(e.d)eFd*eAd+eGd,eGd-eeeH   eeeH   d.f   f   d/eeAeeAd.f   f   defd0ZId)eFd1eeF   deFfd2ZJd@d3ed4eeF   ddfd5ZKd6ee%   d7eFd3ede%fd8ZLd9ej6                  deFfd:ZM ejh                  d;ej                        ZOd<eeF   d=eAdeeF   fd>ZPy)Az>Contains utilities to handle HTTP requests in Huggingface Hub.    N)	lru_cache)
HTTPStatus)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        |   |fi | t        |j                  vrO|j                  j	                  t
              xs t        t        j                               |j                  t        <   t        t        |j                  j	                  dd                  dkD  }t        j                  d|j                  t            d|j                   d|j                   d| d	       y )	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       [/var/www/html/audio-gradio/venv/lib/python3.12/site-packages/huggingface_hub/utils/_http.pyr*   z"UniqueRequestIdAdapter.add_headersN   s    G.v. '//1/6/B/B</P/eTWX\XbXbXdTeGOOO, GOO//DEFJ	w787>>:J!GKK=Xijsittuv	
    r8   returnc                 <   t         j                  r!t        j                  dt	        |              	 t        |   |g|i |S # t        j                  $ rA}|j                  j                  t              }|g |j                  d| d|_         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_DEBUGr3   r4   _curlifyr)   sendrequestsRequestExceptionr,   r-   r+   args)r7   r8   rE   r9   e
request_idr;   s         r<   rB   zUniqueRequestIdAdapter.send[   s    LL6(7"3!456	7<9$9&99(( 	 ,,_=J%A166A]:,a#@A	s   A B<BB)	__name__
__module____qualname__r+   r*   r   r   rB   __classcell__)r;   s   @r<   r#   r#   K   s%    'O
O   r=   r#   c                       e Zd ZdedefdZy)OfflineAdapterr8   r>   c                 4    t        d|j                   d      )NzCannot reach za: offline mode is enabled. To disable it, please unset the `HF_HUB_OFFLINE` environment variable.)r   r6   )r7   r8   rE   r9   s       r<   rB   zOfflineAdapter.sendj   s&    "GKK=  )J  K
 	
r=   N)rH   rI   rJ   r   r   rB    r=   r<   rM   rM   i   s    
O 
 
r=   rM   r>   c                  "   t        j                         } t        j                  r6| j	                  dt                      | j	                  dt                      | S | j	                  dt                      | j	                  dt                      | S )Nzhttp://zhttps://)rC   Sessionr   HF_HUB_OFFLINEmountrM   r#   )sessions    r<   _default_backend_factoryrU   p   sm     Gi!12j."23 N 	i!7!9:j"8":;Nr=   _GLOBAL_BACKEND_FACTORYbackend_factoryc                     | a t                y)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)rV   reset_sessions)rW   s    r<   configure_http_backendrZ      s    @ .r=   c                  d    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_identrO   r=   r<   get_sessionrd      s     : #biikYEXEXEZ[[r=   c                  ,    t         j                          y)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_clearrO   r=   r<   rY   rY      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.
    )rV   r\   s     r<   r_   r_      s     #$$r=         )max_retriesbase_wait_timemax_wait_timeretry_on_exceptionsretry_on_status_codesr5   r6   rj   rk   rl   rm   .rn   c          	      $   t        |t              r|f}t        |t              r|f}d}|}	d}
d|v r6t        |d   t        j                  t
        f      r|d   j                         }
t               }	 |dz  }	 |
|d   j                  |
        |j                  d| |d|}|j                  |vr|S t        j                  d|j                   d|  d|        ||kD  r|j                          |S 	 t        j                  d|	 d| d| d       t#        j$                  |	       t'        ||	dz        }	# |$ rS}t        j                  d	| d
|  d|        t        |t        j                        r
t!                ||kD  r|Y d}~d}~ww xY w)a#  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` and `requests.ConnectionError`.
        retry_on_status_codes (`int` or `Tuple[int]`, *optional*, defaults to `503`):
            Define on which status codes the request must be retried. By default, only
            HTTP 503 Service Unavailable is 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()
    ```

    <Tip warning={true}>

    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).

    </Tip>
    r   Ndatar   )r5   r6   zHTTP Error z thrown while requesting r'   'z' thrown while requesting zRetrying in z	s [Retry /z].r   rO   )
isinstancetypeintioIOBaser   tellrd   seekr8   status_coder3   warningraise_for_statusrC   ConnectionErrorrY   timesleepmin)r5   r6   rj   rk   rl   rm   rn   r9   nb_tries
sleep_timeio_obj_initial_posrT   responseerrs                 r<   http_backoffr      s   N %t,24'-!6 8HJ
 Jvf~		<7PQ#F^002mG
A	 "-v##$67 'wHf#HHH##+@@ NN[)=)=(>>WX^W__`ad`efg+%))+  	 &  	j\8*Ak]RTUV

: 
Q7
G * # 	NNQse#=fXQseLM#x778 +%	 &	s   8:D7 3>D7 7F<A	F

Fendpointc                    |r|j                  d      nt        j                  }|t        j                  t        j                  fvr@| j                  t        j                  |      } | 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.
    rr   )rstripr   ENDPOINT_HF_DEFAULT_ENDPOINT_HF_DEFAULT_STAGING_ENDPOINTreplace)r6   r   s     r<   fix_hf_endpoint_in_urlr   S  sf    
 (0xs#Y5G5GH	66	8^8^__kk)88(Ckk)@@(KJr=   r   endpoint_namec                    	 | j                          y# t        $ r}| j                  j                  d      }| j                  j                  d      }|dk(  r5| j                   ddz   d| j
                   dz   }t        t        ||       ||dk(  r5| j                   ddz   d	| j
                   dz   }t        t        ||       ||d
k(  r5| j                   ddz   d| j
                   dz   }t        t        ||       ||dk(  r;| j                   ddz   d| j
                   dz   dz   dz   }t        t        ||       ||dk(  s_| j                  dk(  r|dk7  r| j                  w| j                  j
                  at        j                  | j                  j
                        8| 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(  r9d| j                   d| dd| j
                   dz   dz   }t        t         ||       || j                  dk(  r[| j                  j                  j                  d      }| d| d | j                  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.

    <Tip warning={true}>

    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.

    </Tip>
    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-   rz   r6   _formatr   r   r   r   r8   REPO_API_REGEXsearchr   r   r   r/   )r   r   rF   
error_codeerror_messagemessagerange_headers          r<   hf_raise_for_statusr   `  sf   pJ?!!# H?%%)).9
 ((,,->?++!--.n=FKghphthtguuvIwwG/(CJ?*!--.n=FKdemeqeqdrrsIttG,gx@aG;&''(7&@EfgogsgsfttuCvv  .'8<!CDD''(75hll^1EF  9	9  +Wh?QF>)  C'!NN  ,  $$0%%h&6&6&:&:;G ''(728<<.BCNN  17HE1L!!S(DQD]&}oZ@cu  /7H=1D!!S(x++,LqI0a@AGH 
 .'8<!C!!S(#++3377@L.|n<MhN^N^NbNbcrNsMttuvG.'8<!C nc!fh7Q>QH?s    
KJ8KK
error_typecustom_messagec                 0   g }|j                   j                  d      }||j                  |       	 |j                         }|j                  d      }|3t	        |t
              r|j                  |       n|j                  |       |j                  d      }| |D ]  }d|v s|j                  |d           |D 	cg c]5  }	t        |	      j                         st        |	      j                         7 }}	t        t        j                  |            }dj                  |      }
|}|
r5|
j                         |j                         vrd	|v r	|d|
z   z  }n|d	|
z   z  }t        |j                   j                  t        d            }|rd
| d}n1t        |j                   j                  t         d            }|rd| d}|rI|j                         |j                         vr)d|v r |j#                  d      }|d | z   ||d  z   }n|z  } | |j                         ||
xs d       S # t        $ rY |j                   j                  dd      }|j                  r-d|j                         vr|j                  |j                         Y w xY wc c}	w )Nr   errorerrorsr   zContent-Typer&   htmlr   r   z (Request ID: r(   z (Amzn Trace ID: )r   server_message)r,   r-   appendjsonrs   listextendr   textlowerr/   stripdictfromkeysjoinr.   r+   index)r   r   r   server_errorsfrom_headersrp   r   r   content_typeliner   final_error_messagerG   request_id_messagenewline_indexs                  r<   r   r     s   M ##''(9:L\*0}}!%&$$U+ $$U+(# ;%!((y)9:; 4AV4CIOODUSY__&VMV }56M YY}-N )...08L8L8NN^#4.#886N#::X%%)),;<J-j\; ))--orBC
#4ZL!Bj&&(0C0I0I0KK&&/55d;M#N]36HHK^_l_mKnn    #55 )//1HUcUkgkllU  0''++NB?==V<+=+=+??  /	0 Ws%   A2H. %H. ?JJ.AJJr8   c                    dd| j                   fg}t        | j                  j                               D ]2  \  }}|j	                         dk(  rd}|ddj                  ||      fgz  }4 | j                  rl| j                  }t        |t              r|j                  dd	      }nt        |d
      rd}t        |      dkD  r|dd dz   }|d|j                  dd      fgz  }|d| j                  fgz  }g }|D ]>  \  }}|r|j                  t        |             |s%|j                  t        |             @ dj!                  |      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'   )r5   sortedr,   itemsr   formatbodyrs   bytesdecodehasattrr2   r   r6   r   r   r   )r8   partskvr   
flat_partss         r<   rA   rA   /  sS    		w~~$E
 w,,./ 31779'A4**1a01223
 ||||dE";;wx;8DT6"'Dt9t;!33D4dB/011	tW[[!""EJ (1eAh'eAh'	( 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        j                  |       }|st        d| d      |j	                         \  }}|s:|st        d| d      t        |      |z
  }d| }|d	k  rt        d
|d      |S t        |      }||z   }|r)t        |      }d| d| }||kD  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groupsru   )r   r   r   startend
new_suffix	new_range	new_starts           r<   _adjust_range_headerr   [  s'    }A&&
n6~6HH\]^^n-E4^4FaHIIJE3!88J!LMMX+
j\*	?!3I=BCCJE#I
#hYKq.	s?!3I=BCCI;a  r=   )r>   N)N)Q__doc__rv   r`   rerb   r~   r0   	functoolsr   httpr   shlexr   typingr   r   r   r	   r
   r   r   rC   r   r   requests.adaptersr   requests.modelsr   huggingface_hub.errorsr   r&   r   r   r   r   r   r   r   r   r   r   _fixesr   _lfsr   _typingr   
get_loggerrH   r3   r+   r.   compileVERBOSEr   r#   rM   rQ   rU   BACKEND_FACTORY_TrV   __annotations__rZ   rd   rY   ru   r_   Timeoutr}   SERVICE_UNAVAILABLEr/   float	Exceptionr   r   r   r   rA   
IGNORECASEr   r   rO   r=   r<   <module>r      s   E 	 	 	       D D D  ( ) + 7     #  " 
		H	%
 $
 ** [ <
[ 
("2"2  R!1!112 -E * E AY !,= !]a !H\X%% \@* % % %@P@P % %   P :D9W9W{8{8	{8 	{8
 {8 {8 tId9os6J0KKL{8 !eCHo!56{8 {8|
 
x} 
 
B?( B?8C= B?TX B?JGm^, Gmc GmX GmZh GmT% h.. % 3 % R bjjA2==Q"!# "!S "!XVY] "!r=   