U
    g                     @   s   d dl Z d dlmZ d dlmZm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 e eZG dd	 d	eZdS )
    N)dumps)	urlencodeurljoin)	HTTPError)HTTPAdapter)check_header_validity)Retryc                
   @   s   e Zd Zddddddddddgd	d
f
ddZdd Zdd Zdd Zdd Zdd Ze	dd Z
dejfddZdd Zdd Zd+dd Zd,d#d$Zd-d%d&Zd.d'd(Zd)d* ZdS )/
ConnectionNZapiZ   TFi  i  i  x      c              	   C   s   || _ || _t|| _|| _t | _|rnttj	
dd dkrntd |d |	dd|
d}| j| j t|d || j_d| jjd< d| jjd	< d
| jjd< |r|r| || n|d k	r| | | jj D ]}t| qd S )N.r         )totalstatusZallowed_methodsZstatus_forcelistZbackoff_factorZbackoff_jitterZbackoff_max)Zmax_retrieszapplication/jsonZAcceptContent-Typezno-checkzCache-Control)urlapi_rootinttimeout
verify_sslrequestsZSession_sessionurllib3__version__splitr   Zmountr   verifyheaders_create_basic_session_create_token_sessionitemsr   )selfr   usernamepasswordtokenr   r   r   Zbackoff_and_retryZretry_status_codesZmax_backoff_secondsZmax_backoff_retriesZretriesheader r'   0./modules/youtrack/youtrack_client/connection.py__init__   s4    

	
zConnection.__init__c                 C   s   | S Nr'   r"   r'   r'   r(   	__enter__>   s    zConnection.__enter__c                 G   s   |    d S r*   )close)r"   _r'   r'   r(   __exit__A   s    zConnection.__exit__c                 C   s   ||f| j _d S r*   )r   Zauth)r"   r#   r$   r'   r'   r(   r   D   s    z Connection._create_basic_sessionc                 C   s   |  dd|  d S )NZAuthorizationzBearer )_update_header)r"   r%   r'   r'   r(   r    G   s    z Connection._create_token_sessionc                 C   s   | j j||i d S r*   )r   r   update)r"   keyvaluer'   r'   r(   r0   J   s    zConnection._update_headerc              
   C   s`   z
|   W S  tk
r*   td Y d S  tk
rZ } zt| W Y d S d }~X Y nX d S )Nz!Received response with no content)json
ValueErrorloggerdebug	Exceptionerror)responseer'   r'   r(   _response_handlerM   s    


zConnection._response_handlerc                 C   sN   dj |ddd | jj D |s(dnd t||d}tj||d d S )	Nz5curl --silent -X {method} -H {headers} {data} '{url}'z -H c                 S   s   g | ]\}}d  ||qS )z
'{0}: {1}')format).0r2   r3   r'   r'   r(   
<listcomp>a   s   z0Connection.logger_curl_debug.<locals>.<listcomp> z--data '{0}')methodr   datar   )levelmsg)r=   joinr   r   r!   r   r6   log)r"   rA   r   rB   rC   messager'   r'   r(   logger_curl_debugX   s    

	zConnection.logger_curl_debugc                 C   s
   | j  S r*   )r   r-   r+   r'   r'   r(   r-   j   s    zConnection.closec                 C   s   t | j|S r*   )r   r   )r"   pathr'   r'   r(   	build_urlm   s    zConnection.build_urlc                 C   sH   t d| | |}| jd|d | jjd|d| j| jd}|dS )NzStream GET %sGET)rA   r   T)rA   r   streamr   r   i    )	r6   inforJ   rH   r   requestr   r   Ziter_content)r"   rI   paramsr   r:   r'   r'   r(   rL   p   s    
zConnection.streamrK   /c           
      C   s   |  |}d|krdnd}|r4|r,|d7 }n|d7 }|rH|t|pBi 7 }|sPd nt|}|s`d nt|}| j|||rx|n|d | jj||||| j| jd}	d|	_| 	|	 |	S )N?TF&)rA   r   rB   )rA   r   rB   r4   r   r   zutf-8)
rJ   r   r   rH   r   rN   r   r   encodingraise_for_status)
r"   rA   rI   rB   r4   rO   r   Zparams_already_in_urlZ	json_dumpr:   r'   r'   r(   rN      s4    



zConnection.requestc              
   C   sb   | j d|||d}|jsd S z
| W S  tk
r\ } zt| |j W Y S d }~X Y nX d S )NrK   )rI   rO   rB   )rN   textr4   r8   r6   r9   )r"   rI   rO   rB   r:   r;   r'   r'   r(   get   s    

zConnection.getc                 C   s   | j d||||d}| |S )NZPOST)rI   rB   r4   rO   )rN   r<   )r"   rI   rB   r4   rO   r:   r'   r'   r(   post   s    zConnection.postc              
   C   s   |j dkr&|jddkr&td|dd|j   kr<dk rn npz,| }|d}|d	}d
||}W n4 tk
r } zt| |	  W 5 d }~X Y qX t||dn|	  d S )Ni  r   zapplication/json;charset=UTF-8zUnauthorized (401))r:   i  iX  r9   error_descriptionz{}: {})
Zstatus_coder   rV   r   r4   r=   r8   r6   r9   rT   )r"   r:   jr9   rX   Z	error_msgr;   r'   r'   r(   rT      s     


zConnection.raise_for_status)N)rK   rP   NNN)NN)NNN)__name__
__module____qualname__r)   r,   r/   r   r    r0   staticmethodr<   loggingDEBUGrH   r-   rJ   rL   rN   rV   rW   rT   r'   r'   r'   r(   r	      sL   
.


     
+  
   
r	   )r^   r4   r   Zurllib.parser   r   r   r   r   Zrequests.adaptersr   Zrequests.utilsr   Zurllib3.utilr   Z	getLoggerrZ   r6   objectr	   r'   r'   r'   r(   <module>   s   
