
    $g                         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 j                  e      Z G d d	e      Zy)
    N)dumps)	urlencodeurljoin)	HTTPError)HTTPAdapter)check_header_validity)Retryc            
           e Zd ZddddZdddddddg d	d
df
dZd Zd Zd Zd Zd Z	e
d        Zddej                  fdZd Zd ZddZ	 	 	 	 	 	 ddZ	 	 ddZ	 	 	 ddZd Zy)
Connectionzapplication/jsonzno-check)AcceptContent-TypezCache-ControlNapiZ   TF)i  i  i  x      c           	      B   || _         || _        t        |      | _        || _        t        j                         | _        |rpt        t        j                  j                  d      d         dk\  rBt        d |d |	dd|
      }| j                  j                  | j                   t        |             || j                  _        |r|r| j                  ||       n|| j!                  |       | j                  j"                  j%                         D ]  }t'        |        y )N.r         )totalstatusallowed_methodsstatus_forcelistbackoff_factorbackoff_jitterbackoff_max)max_retries)urlapi_rootinttimeout
verify_sslrequestsSession_sessionurllib3__version__splitr	   mountr   verify_create_basic_session_create_token_sessionheadersitemsr   )selfr   usernamepasswordtokenr   r!   r"   backoff_and_retryretry_status_codesmax_backoff_secondsmax_backoff_retriesretriesheaders                 0./modules/youtrack/youtrack_client/connection.py__init__zConnection.__init__   s      7|$ ((*W%8%8%>%>s%CA%F!G1!L* $!3  /G MM+'*JK)&&x:&&u-mm++113 	*F!&)	*    c                     | S N r/   s    r9   	__enter__zConnection.__enter__@   s    r;   c                 $    | j                          y r=   )close)r/   _s     r9   __exit__zConnection.__exit__C   s    

r;   c                 *    ||f| j                   _        y r=   )r%   auth)r/   r0   r1   s      r9   r+   z Connection._create_basic_sessionF   s    &1r;   c                 .    | j                  dd|        y )NAuthorizationzBearer )_update_header)r/   r2   s     r9   r,   z Connection._create_token_sessionI   s    Owug->?r;   c                 R    | j                   j                  j                  ||i       y r=   )r%   r-   update)r/   keyvalues      r9   rI   zConnection._update_headerL   s    $$c5\2r;   c                     	 | j                         S # t        $ r t        j                  d       Y y t        $ r}t        j                  |       Y d }~y d }~ww xY w)Nz!Received response with no content)json
ValueErrorloggerdebug	Exceptionerror)responsees     r9   _response_handlerzConnection._response_handlerO   sI    	==?" 	LL<= 	LLO	s    AAAAc                 @   |xs | j                   }dj                  |dj                  |j                         D cg c]  \  }}dj                  ||       c}}      |sdndj                  t	        |            |      }t
        j                  ||       y c c}}w )Nz5curl --silent -X {method} -H {headers} {data} '{url}'z -H z
'{0}: {1}' z--data '{0}')methodr-   datar   )levelmsg)default_headersformatjoinr.   r   rQ   log)	r/   rZ   r   r[   r-   r\   rL   rM   messages	            r9   logger_curl_debugzConnection.logger_curl_debugZ   s     1T11IPPKK")--/!C ##C/!   ^%:%:5;%G Q 
 	

G
,!s   Bc                 6    | j                   j                         S r=   )r%   rB   r?   s    r9   rB   zConnection.closen   s    }}""$$r;   c                 .    t        | j                  |      S r=   )r   r   )r/   paths     r9   	build_urlzConnection.build_urlq   s    txx&&r;   c                     t         j                  d|       | j                  |      }| j                  d|       | j                  j                  d|d| j                  | j                        }|j                  d      S )NzStream GET %sGET)rZ   r   T)rZ   r   streamr!   r*   i    )	rQ   inforg   rc   r%   requestr!   r"   iter_content)r/   rf   paramsr   rU   s        r9   rj   zConnection.streamt   s|    OT*nnT" 	 	
 ==((LL?? ) 
 $$X..r;   c           	         | j                  |      }d|v rdnd}|r|r|dz  }n|dz  }|r|t        |xs i       z  }|sd n
t        |      }|sd n
t        |      }	| j                  |||r|n|	|       |xs | j                  }| j
                  j                  |||||| j                  | j                        }
d|
_	        | j                  |
       |
S )N?TF&)rZ   r   r[   r-   )rZ   r   r-   r[   rO   r!   r*   zutf-8)rg   r   r   rc   r^   r%   rl   r!   r"   encodingraise_for_status)r/   rZ   rf   r[   rO   rn   r-   r   params_already_in_url	json_dumprU   s              r9   rl   zConnection.request   s     nnT"(+s
$s
s
9V\r**CtU4[ $D%+	9	 	 	
 1T11==((LL?? ) 
 $h'r;   c                     | j                  d|||      }|j                  sy 	 |j                         S # t        $ r+}t        j                  |       |j                  cY d }~S d }~ww xY w)Nri   )rf   rn   r[   )rl   textrO   rS   rQ   rT   )r/   rf   rn   r[   rU   rV   s         r9   getzConnection.get   se     <<	   
 }}	!==?" 	!LLO== 	!s   4 	A( A#A(#A(c                 P    | j                  d||||      }| j                  |      S )NPOST)rf   r[   rO   rn   )rl   rW   )r/   rf   r[   rO   rn   rU   s         r9   postzConnection.post   s9     <<   
 %%h//r;   c                    |j                   dk(  r+|j                  j                  d      dk7  rt        d|      d|j                   cxk  rdk  rUn nR	 |j	                         }|j                  d      }|j                  d	      }d
j                  ||      }t        ||      |j                          y # t        $ r/}t        j                  |       |j                          Y d }~y d }~ww xY w)Ni  r   zapplication/json;charset=UTF-8zUnauthorized (401))rU   i  iX  rT   error_descriptionz{}: {})
status_coder-   rx   r   rO   r_   rS   rQ   rT   rs   )r/   rU   jrT   r}   	error_msgrV   s          r9   rs   zConnection.raise_for_status   s      C'  $$^48XX08DD(&&,,	>MMOg$%EE*=$>!$OOE3DE	
  	H==%%'  ,Q))++,s   AB6 6	C.?%C))C.r=   )ri   /NNNN)NN)NNN)__name__
__module____qualname__r^   r:   r@   rD   r+   r,   rI   staticmethodrW   loggingDEBUGrc   rB   rg   rj   rl   rx   r{   rs   r>   r;   r9   r   r      s    $*#O *(*T2@3   mm-(%'/$ )\ 	!0 0"(r;   r   )r   rO   r   urllib.parser   r   r#   r&   r   requests.adaptersr   requests.utilsr   urllib3.utilr	   	getLoggerr   rQ   objectr   r>   r;   r9   <module>r      s@      +    ) 0 			8	$Y( Y(r;   