U
    !hJN                     @   s  d dl mZmZm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
Z
d dlmZ d dlmZmZ zd dlmZ W n ek
r   Y nX zd dlZW n ek
r   dZY nX zd dlZW n ek
r   dZY ndX z$ejZdd edD \ZZZW n ek
r   Y n(X eeefd	k r<ejd
ef  dZzd dlmZ W n ek
rf   dZY nX dd Z G dd de!Z"G dd de"Z#G dd de"Z$G dd de"Z%G dd de"Z&dS )    )absolute_importdivisionprint_functionN)urlparse)errorutil)urllibc                 C   s   g | ]}t |qS  )int).0ir	   r	   U/home/ankuromar296_gmail_com/.local/lib/python3.8/site-packages/telnyx/http_client.py
<listcomp>&   s     r   .)r      r   a  Warning: the Telnyx library requires that your Python "requests" library be newer than version 0.8.8, but your "requests" library is version %s. Telnyx will fall back to an alternate HTTP library so everything should work. We recommend upgrading your "requests" library. If you have any questions, please contact support@telnyx.com. (HINT: running "pip install -U requests" should upgrade your requests library to the latest version.))urlfetchc                  O   s6   t r
t}n"trt}ntrt}nt}td || |S )NzWarning: the Telnyx library is falling back to urllib2/urllib because neither requests nor pycurl are installed. urllib2's SSL implementation doesn't verify server certificates. For improved security, we suggest installing requests.)	r   UrlFetchClientrequestsRequestsClientpycurlPycurlClientUrllib2Clientwarningswarn)argskwargsimplr	   r	   r   new_default_http_client>   s    r   c                   @   sZ   e Zd ZdZdZdddZdddZdd	d
Zdd Zdd Z	dd Z
dd Zdd ZdS )
HTTPClient         ?TNc                 C   sJ   || _ |r4t|tkr ||d}t|tk	r4td|r@| nd | _d S )N)httphttpszqProxy(ies) must be specified as either a string URL or a dict() with string URL under the https and/or http keys.)_verify_ssl_certstypestrdict
ValueErrorcopy_proxyselfverify_ssl_certsproxyr	   r	   r   __init__V   s    
	zHTTPClient.__init__c           
   
   C   s   d}z |d7 }|  ||||}d }W n, tjk
rP } z|}d }W 5 d }~X Y nX | |||r|rttd|j  | |}	td||||	f  t	|	 q|d k	r|S |qd S )Nr      z Encountered a retryable error %szBInitiating retry %i for request %s %s after sleeping %.2f seconds.)
requestr   APIConnectionError_should_retryr   Zlog_infoZuser_message_sleep_time_secondstimesleep)
r+   methodurlheaders	post_datanum_retriesresponseZconnection_erroreZ
sleep_timer	   r	   r   request_with_retriesg   s2    

zHTTPClient.request_with_retriesc                 C   s   t dd S )Nz.HTTPClient subclasses must implement `request`NotImplementedError)r+   r6   r7   r8   r9   r	   r	   r   r0      s    zHTTPClient.requestc                 C   s2   |d k	r|\}}}|dk}n|j }|o0||  k S )Ni  )should_retry_max_network_retries)r+   r;   Zapi_connection_errorr:   _status_coder@   r	   r	   r   r2      s
    

zHTTPClient._should_retryc                 C   s   ddl m} |S )Nr   )max_network_retries)telnyxrD   )r+   rD   r	   r	   r   rA      s    zHTTPClient._max_network_retriesc                 C   s4   t tjd|d   tj}| |}ttj|}|S )Nr   r/   )minr   INITIAL_DELAY	MAX_DELAY_add_jitter_timemax)r+   r:   sleep_secondsr	   r	   r   r3      s     
zHTTPClient._sleep_time_secondsc                 C   s   |ddt dd  9 }|S )Nr    r/   r   )randomuniform)r+   rK   r	   r	   r   rI      s    zHTTPClient._add_jitter_timec                 C   s   t dd S )Nz,HTTPClient subclasses must implement `close`r>   r+   r	   r	   r   close   s    zHTTPClient.close)TN)N)N)__name__
__module____qualname__rH   rG   r.   r=   r0   r2   rA   r3   rI   rO   r	   r	   r	   r   r   R   s   

"
r   c                       s<   e Zd ZdZd fdd	ZdddZdd	 Zd
d Z  ZS )r   r   P   Nc                    s*   t t| jf | || _|p"t | _d S N)superr   r.   _timeoutr   Session_session)r+   timeoutsessionr   	__class__r	   r   r.      s    zRequestsClient.__init__c           
   
   C   s   i }| j rd|d< nd|d< | jr,| j|d< zfz$| jj||f||| jd|}W n0 tk
r } ztd|f W 5 d }~X Y nX |j}|j}	W n, tk
r } z| 	| W 5 d }~X Y nX ||	|j
fS )NTverifyFproxies)r8   datarY   a  Warning: It looks like your installed version of the "requests" library is not compatible with Telnyx's usage thereof. (HINT: The most likely cause is that your "requests" library is out of date. You can fix that by running "pip install -U requests".) The underlying error was: %s)r#   r)   rX   r0   rV   	TypeErrorcontentrC   	Exception_handle_request_errorr8   )
r+   r6   r7   r8   r9   r   resultr<   ra   rC   r	   r	   r   r0      s:    



zRequestsClient.requestc                 C   s   t |tjjr.d}dt|jt|f }d}nt |tjjsJt |tjjrjd}dt|jt|f }d}njt |tjj	rd}dt|jt|f }d}n<d}dt|jf }t|r|dt|f 7 }n|d	7 }d}t
|d
|f  }tj||dd S )NCould not verify Telnyx's SSL certificate.  Please make sure that your network is not intercepting certificates.  If this problem persists, let us know at support@telnyx.com.%s: %sFziUnexpected error communicating with Telnyx.  If this problem persists, let us know at support@telnyx.com.TzUnexpected error communicating with Telnyx. It looks like there's probably a configuration issue locally.  If this problem persists, let us know at support@telnyx.com.zA %s was raisedz with error message %sz with no error messagez

(Network error: %s))r@   )
isinstancer   
exceptionsSSLErrorr$   rP   r%   TimeoutConnectionErrorRequestExceptiontextwrapfillr   r1   )r+   r<   msgerrr@   r	   r	   r   rc      s6     z$RequestsClient._handle_request_errorc                 C   s   | j d k	r| j   d S rT   )rX   rO   rN   r	   r	   r   rO     s    
zRequestsClient.close)rS   N)N	rP   rQ   rR   namer.   r0   rc   rO   __classcell__r	   r	   r[   r   r      s
   
)1r   c                       s<   e Zd ZdZd fdd	ZdddZd	d
 Zdd Z  ZS )r   r   TN7   c                    s0   t t| j||d |r td|| _|| _d S )Nr,   r-   zNo proxy support in urlfetch library. Set telnyx.default_http_client to either RequestsClient, PycurlClient, or Urllib2Client instance to use a proxy.)rU   r   r.   r'   r#   	_deadline)r+   r,   r-   deadliner[   r	   r   r.      s    
 zUrlFetchClient.__init__c              
   C   s`   zt j|||| j| j|d}W n0 t jk
rN } z| || W 5 d }~X Y nX |j|j|jfS )N)r7   r6   r8   Zvalidate_certificaterw   payload)	r   fetchr#   rv   Errorrc   ra   rC   r8   )r+   r6   r7   r8   r9   rd   r<   r	   r	   r   r0   3  s    
zUrlFetchClient.requestc                 C   sh   t |tjrd|f }n(t |tjr*d}nt |tjr<d}nd}t|d t| d }t	|d S )NzThe Telnyx library attempted to fetch an invalid URL (%r). This is likely due to a bug in the Telnyx Python bindings. Please let us know at support@telnyx.com.z0There was a problem retrieving data from Telnyx.zThere was a problem receiving all of your data from Telnyx.  This is likely due to a bug in Telnyx. Please let us know at support@telnyx.com.hUnexpected error communicating with Telnyx. If this problem persists, let us know at support@telnyx.com.

(Network error: ))
rg   r   ZInvalidURLErrorZDownloadErrorZResponseTooLargeErrorrm   rn   r%   r   r1   )r+   r<   r7   ro   r	   r	   r   rc   E  s    z$UrlFetchClient._handle_request_errorc                 C   s   d S rT   r	   rN   r	   r	   r   rO   ^  s    zUrlFetchClient.close)TNrt   )Nrq   r	   r	   r[   r   r     s
   
r   c                       sL   e Zd ZdZd fdd	Zdd Zddd	Zd
d Zdd Zdd Z	  Z
S )r   r   TNc                    sH   t t| j||d t | _| jrD| j}|D ]}t|| ||< q.d S Nru   )rU   r   r.   r   ZCurl_curlr)   r   )r+   r,   r-   schemer[   r	   r   r.   e  s    
 
zPycurlClient.__init__c                 C   sB   d|kri S | ddd }t|}tdd tt|D S )Nz
r/   c                 s   s   | ]\}}|  |fV  qd S rT   lowerr   kvr	   r	   r   	<genexpr>z  s     z-PycurlClient.parse_headers.<locals>.<genexpr>)splitemailmessage_from_stringr&   six	iteritems)r+   r_   Zraw_headersr8   r	   r	   r   parse_headersu  s
    
zPycurlClient.parse_headersc              
   C   s  t j }t j }| j  | |}|r|jrD| jtj	|j |j
r\| jtj|j
 |jsh|jr| jtjd|j|jf  |dkr| jtjd n>|dkr| jtjd | jtj| n| jtj|  | jtjt | | jtj|j | jtj|j | jtjd | jtjd | jtjd | jtjdd tt|D  | j r| jtj!d	 n| jtj!d
 z| j"  W n0 tj#k
r } z| $| W 5 d }~X Y nX |% &d}	| j'tj(}
| )|% &d}|	|
|fS )Nz%s:%sgetr/   post   rS   c                 S   s   g | ]\}}d ||f qS )rf   r	   r   r	   r	   r   r     s     z(PycurlClient.request.<locals>.<listcomp>TFutf-8)*r   ioBytesIOr   reset
_get_proxyhostnameZsetoptr   ZPROXYportZ	PROXYPORTusernamepasswordZPROXYUSERPWDZHTTPGETPOSTZ
POSTFIELDSZCUSTOMREQUESTupperURLutf8ZWRITEFUNCTIONwriteZHEADERFUNCTIONZNOSIGNALZCONNECTTIMEOUTTIMEOUTZ
HTTPHEADERr   r   r&   r#   ZSSL_VERIFYHOSTZperformr   rc   getvaluedecodegetinfoZRESPONSE_CODEr   )r+   r6   r7   r8   r9   bZrheadersr-   r<   rbodyrcoder	   r	   r   r0   |  sR    



 zPycurlClient.requestc                 C   sj   |j d tjtjtjfkr d}n |j d tjtjfkr<d}nd}t|d |j d  d }t	
|d S )Nr   zCould not connect to Telnyx.  Please check your internet connection and try again.  If this problem persists, you should check Telnyx's service status at status.telnyx.com, or let us know at support@telnyx.com.re   r{   r|   r/   r}   )r   r   ZE_COULDNT_CONNECTZE_COULDNT_RESOLVE_HOSTZE_OPERATION_TIMEOUTEDZE_SSL_CACERTZE_SSL_PEER_CERTIFICATErm   rn   r   r1   r+   r<   ro   r	   r	   r   rc     s    z"PycurlClient._handle_request_errorc                 C   sV   | j rR| j }|r|dd nd }|rR||kr6|| S |dd }||krR|| S d S )N:r   )r)   r   )r+   r7   r-   r   r	   r	   r   r     s    zPycurlClient._get_proxyc                 C   s   d S rT   r	   rN   r	   r	   r   rO     s    zPycurlClient.close)TN)N)rP   rQ   rR   rr   r.   r   r0   rc   r   rO   rs   r	   r	   r[   r   r   b  s   
:r   c                       s<   e Zd ZdZd fdd	ZdddZdd	 Zd
d Z  ZS )r   zurllib.requestTNc                    s@   t t| j||d d | _| jr<tj| j}tj|| _d S r~   )	rU   r   r.   _openerr)   r   r0   ProxyHandlerbuild_openerr*   r[   r	   r   r.     s    
 zUrllib2Client.__init__c              
      s  t jrt|t jr|d}tj|||} dkrB fdd|_z<| j	rV| j	
|n
tj|}| }|j}t| }W nr tjjk
r }	 z|	j}|	 }t|	 }W 5 d }	~	X Y n4 tjjtfk
r }	 z| |	 W 5 d }	~	X Y nX tdd t t|D }
|||
fS )Nr   )r   r   c                      s      S rT   )r   r	   r6   r	   r   <lambda>      z'Urllib2Client.request.<locals>.<lambda>c                 s   s   | ]\}}|  |fV  qd S rT   r   r   r	   r	   r   r     s     z(Urllib2Client.request.<locals>.<genexpr>)r   PY3rg   string_typesencoder   r0   Request
get_methodr   openurlopenreadcoder&   infor   	HTTPErrorURLErrorr'   rc   r   )r+   r6   r7   r8   r9   reqr;   r   r   r<   Zlhr	   r   r   r0     s&    
zUrllib2Client.requestc                 C   s,   d}t |d t| d }t|d S )Nr{   r|   r}   )rm   rn   r%   r   r1   r   r	   r	   r   rc   
  s    z#Urllib2Client._handle_request_errorc                 C   s   d S rT   r	   rN   r	   r	   r   rO     s    zUrllib2Client.close)TN)Nrq   r	   r	   r[   r   r     s
   

r   )'
__future__r   r   r   r   rL   sysrm   r4   r   r   Zsix.moves.urllib.parser   rE   r   r   Z	six.movesr   ImportErrorr   r   __version__versionr   majorminorpatchrb   stderrr   Zgoogle.appengine.apir   r   objectr   r   r   r   r   r	   r	   r	   r   <module>   sX   



dgE 