U
    Įwh                     @   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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dejfddZdd Zd d! Zd.d"d#Zd/d&d'Zd0d(d)Zd1d*d+Zd,d- ZdS )2
Connectionzapplication/jsonzno-check)ZAcceptContent-TypezCache-ControlNZ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_|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_retries)urlapi_rootinttimeout
verify_sslrequestsZSession_sessionurllib3__version__splitr   Zmountr   verify_create_basic_session_create_token_sessionheaders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__   s.    

	
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__C   s    zConnection.__exit__c                 C   s   ||f| j _d S r*   )r   Zauth)r"   r#   r$   r'   r'   r(   r   F   s    z Connection._create_basic_sessionc                 C   s   |  dd|  d S )NZAuthorizationzBearer )_update_header)r"   r%   r'   r'   r(   r   I   s    z Connection._create_token_sessionc                 C   s   | j j||i d S r*   )r   r    update)r"   keyvaluer'   r'   r(   r0   L   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_handlerO   s    


zConnection._response_handlerc                 C   sT   |p| j }dj|ddd | 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>e   s   z0Connection.logger_curl_debug.<locals>.<listcomp> z--data '{0}')methodr    datar   )levelmsg)default_headersr=   joinr!   r   r6   log)r"   rA   r   rB   r    rC   messager'   r'   r(   logger_curl_debugZ   s    

	zConnection.logger_curl_debugc                 C   s
   | j  S r*   )r   r-   r+   r'   r'   r(   r-   n   s    zConnection.closec                 C   s   t | j|S r*   )r   r   )r"   pathr'   r'   r(   	build_urlq   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   inforK   rI   r   requestr   r   Ziter_content)r"   rJ   paramsr   r:   r'   r'   r(   rM   t   s    
zConnection.streamrL   /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 |p| j}| jj|||||| j| jd}
d|
_	| 
|
 |
S )N?TF&)rA   r   rB   r    )rA   r   r    rB   r4   r   r   zutf-8)rK   r   r   rI   rE   r   rO   r   r   encodingraise_for_status)r"   rA   rJ   rB   r4   rP   r    r   Zparams_already_in_urlZ	json_dumpr:   r'   r'   r(   rO      s:    	



	
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 )NrL   )rJ   rP   rB   )rO   textr4   r8   r6   r9   )r"   rJ   rP   rB   r:   r;   r'   r'   r(   get   s    

zConnection.getc                 C   s   | j d||||d}| |S )NZPOST)rJ   rB   r4   rP   )rO   r<   )r"   rJ   rB   r4   rP   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    rW   r   r4   r=   r8   r6   r9   rU   )r"   r:   jr9   rY   Z	error_msgr;   r'   r'   r(   rU      s     


zConnection.raise_for_status)N)rL   rQ   NNNN)NN)NNN)__name__
__module____qualname__rE   r)   r,   r/   r   r   r0   staticmethodr<   loggingDEBUGrI   r-   rK   rM   rO   rW   rX   rU   r'   r'   r'   r(   r	      sX   	
*


      
.  
   
r	   )r_   r4   r   urllib.parser   r   r   r   r   Zrequests.adaptersr   Zrequests.utilsr   Zurllib3.utilr   Z	getLoggerr[   r6   objectr	   r'   r'   r'   r(   <module>   s   
