o
    Ďi?&                     @   s   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
Z
d dlmZ d dl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 d
d Zdd ZG dd deZdS )    N)BytesIO)Path)RequestField)get_endpointget_envget_access_token_from_env	KaggleEnv)KaggleObject)FileDownload)HttpRedirect)Typec                 C   s   d dd |  D S )N
c                 s   s"    | ]\}}| d | V  qdS )z: N ).0kvr   r   X/home/jeff/fluffinator/venv/lib/python3.10/site-packages/kagglesdk/kaggle_http_client.py	<genexpr>   s     z"_headers_to_str.<locals>.<genexpr>)joinitems)headersr   r   r   _headers_to_str   s   r   c                  C   s   t jd} t j| sd S d }t| }| }W d    n1 s#w   Y  |r.| s0d S t|}|d }|d }||fS )Nz~/.kaggle/kaggle.jsonusernamekey)	ospath
expanduserexistsopenreadstripjsonloads)apikey_filenamekaggle_jsonapikey_fileapi_key_datar   api_keyr   r   r   _get_apikey_creds!   s   


r(   c                   @   sF  e Zd ZdZdZeefZdZ							d=deded	e	d
e	de	de	fddZ
de	de	dedee fddZde	de	defddZdd Zdd Zd>ddZde	fdd Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+e	d,e	d-ee	 d.e	d/e	d0e	fd1d2Zd0e	fd3d4Zd0e	fd5d6ZG d7d8 d8ejjZd9d: Z de	de	fd;d<Z!dS )?KaggleHttpClientz
XSRF-TOKENz
CSRF-TOKENzX-XSRF-TOKENNFkaggle-api/v1.7.0envverboser   password	api_token
user_agentc                 C   sL   |pt  | _d | _t| j| _|| _d | _|| _|| _|| _	|| _
|| _d S N)r   _env
_signed_inr   	_endpoint_verbose_session	_username	_password
_api_token_user_agent_response_processor)selfr+   r,   r   r-   r.   r/   response_processorr   r   r   __init__9   s   

zKaggleHttpClient.__init__service_namerequest_namerequestresponse_typec           	      C   sp   |    | |||}| j|ji d d d }|d ur&|tks"|tkr&d|d< | jj|fi |}| ||}|S )NTstream)	_init_session_prepare_requestr5   merge_environment_settingsurlr
   r   send_prepare_response)	r;   r>   r?   r@   rA   http_requestsettingshttp_responseresponser   r   r   callN   s   zKaggleHttpClient.callc                 C   sF   |  ||}tjd||j|| jj| jjd}| }| 	| |S )NPOST)methodrF   r!   r   auth)
_get_request_urlrequestsRequest	__class__to_dictr5   r   rP   prepare_print_request)r;   r>   r?   r@   request_urlrI   prepared_requestr   r   r   rD   e   s   

z!KaggleHttpClient._prepare_requestc                 C   s   |  | z!d|jd v r%| }d|v r%|d dkr%tjj|d |dW n	 ty/   Y nw |  | jr<| | |du rBdS |	|S )zEExtract the kaggle response and raise an exception if it is an error.application/jsonContent-Typecodei  message)rL   N)
_print_responser   r!   rR   
exceptions	HTTPErrorKeyErrorraise_for_statusr:   prepare_from)r;   rA   rK   respr   r   r   rH   r   s    


z"KaggleHttpClient._prepare_responsec              	   C   sN   | j sd S | d | |j d|j dt|j d|j  | d d S )Nz2---------------------Request---------------------- r   z

2--------------------------------------------------)r4   _printrO   rF   r   r   body)r;   r@   r   r   r   rW      s
   
,zKaggleHttpClient._print_requestTc                 C   sT   | j sd S | d | |j dt|j  |r#| d|j  | d d S )Nz2---------------------Response---------------------r   rf   )r4   rg   status_coder   r   text)r;   rL   rh   r   r   r   r^      s   
z KaggleHttpClient._print_responser]   c                 C   s   | j r	t| d S d S r0   )r4   print)r;   r]   r   r   r   rg      s   zKaggleHttpClient._printc                 C   s   |    | S r0   )rC   r;   r   r   r   	__enter__   s   zKaggleHttpClient.__enter__c                 C   s   | j d ur| j   d S d S r0   )r5   close)r;   exc_type	exc_valuetbr   r   r   __exit__   s   
zKaggleHttpClient.__exit__c                 C   sd   | j d ur| j S t | _ | j j| jdd |  }|d ur,| j jdd| i |   d S )NrZ   )z
User-Agentr[   zProxy-AuthorizationBearer )r5   rR   Sessionr   updater9   _get_iap_token_if_required_try_fill_authr;   	iap_tokenr   r   r   rC      s   


zKaggleHttpClient._init_sessionc                 C   s>   | j tjtjfvrd S td}|d u rtd| j d|S )NKAGGLE_IAP_TOKENz%Must set KAGGLE_IAP_TOKEN to access "")r1   r   STAGINGADMINr   getenv	Exceptionr3   rx   r   r   r   rv      s   
z+KaggleHttpClient._get_iap_token_if_requiredc                 C   s   t jd| j| jj| jjd}| }| | | j|}| j	|dd |d ur3|j
dv r3t jd|  | jjtj| jjtj i d S )NGET)rO   rF   r   rP   F)rh   )i  i  zIAP token invalid or expired)rR   rS   r3   r5   r   rP   rV   rW   rG   r^   ri   r_   r`   rb   ru   r)   _xsrf_header_namecookies_xsrf_cookie_name)r;   ry   initial_get_requestrY   rK   r   r   r   _fill_xsrf_token   s"   
z!KaggleHttpClient._fill_xsrf_token	client_idredirect_uriscopestatecode_challengereturnc           	   
   C   sN   d||d |||dddd	}|   d}tjj|tjjd}| d| S )	Nr\   re   S256query)	rA   r   r   r   r   r   code_challenge_methodrA   response_modez/api/v1/oauth2/authorize)	quote_via?)r   get_non_api_endpointurllibparse	urlencode
quote_plus)	r;   r   r   r   r   r   paramsauth_urlquery_stringr   r   r   build_start_oauth_url   s   	z&KaggleHttpClient.build_start_oauth_urlc                 C   s   |    dS )Nz/account/api/oauth/token)r   rl   r   r   r   get_oauth_default_redirect_url   s   z/KaggleHttpClient.get_oauth_default_redirect_urlc                 C   s   | j tjkrdS | jS )Nzhttps://www.kaggle.comr1   r   PRODr3   rl   r   r   r   r      s   z%KaggleHttpClient.get_non_api_endpointc                   @   s   e Zd Zdd Zdd ZdS )zKaggleHttpClient.BearerAuthc                 C   s
   || _ d S r0   )token)r;   r   r   r   r   r=      s   
z$KaggleHttpClient.BearerAuth.__init__c                 C   s   d| j  |jd< |S )Nrs   Authorization)r   r   )r;   rr   r   r   __call__   s   z$KaggleHttpClient.BearerAuth.__call__N)__name__
__module____qualname__r=   r   r   r   r   r   
BearerAuth   s    r   c                 C   s   | j d urd S | jd u rt \}}|| _| jd ur&t| j| j_d| _ d S | jr3| jr3| j| jf}nt	 }|d urC|| j_d| _ d S d| _ d S )NTF)
r2   r8   r   r)   r   r5   rP   r6   r7   r(   )r;   r.   _apikey_credsr   r   r   rw      s"   




zKaggleHttpClient._try_fill_authc                 C   s2   | j tjkr	| jn| j d}| d| d| S )Nz/apiz/v1//r   )r;   r>   r?   base_urlr   r   r   rQ     s   z!KaggleHttpClient._get_request_url)NFNNNr*   N)T)"r   r   r   r   _csrf_cookie_name_xsrf_cookiesr   r   boolstrr=   r	   r   rM   rD   rH   rW   r^   rg   rm   rr   rC   rv   r   listr   r   r   rR   rP   AuthBaser   rw   rQ   r   r   r   r   r)   3   s|    


	
	r)   )binasciicodecsr!   r   urllib.parser   ior   pathlibr   rR   urllib3.fieldsr   kagglesdk.kaggle_envr   r   r   r   kagglesdk.kaggle_objectr	   $kagglesdk.common.types.file_downloadr
   $kagglesdk.common.types.http_redirectr   typingr   r   r(   objectr)   r   r   r   r   <module>   s"    