a
    xd\d                     @   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Zd dlZd dlmZmZmZ d dlmZ zd dlmZ W n ey   Y n0 zd dlZW n ey   dZY n0 zd dlZW n ey   dZY nb0 z$ejZdd edD \ZZZW n ey    Y n(0 eeefd	k rHejd
ef  dZzd dl m!Z! W n eyp   dZ!Y n0 d dl"m#Z# dd Z$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)errorutilsix)RequestMetrics)urllibc                 C   s   g | ]}t |qS  )int).0ir
   r
   J/var/www/html/Ranjet/env/lib/python3.9/site-packages/stripe/http_client.py
<listcomp>'       r   .)r      r   a  Warning: the Stripe library requires that your Python "requests" library be newer than version 0.8.8, but your "requests" library is version %s. Stripe 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@stripe.com. (HINT: running "pip install -U requests" should upgrade your requests library to the latest version.))urlfetch)urlparsec                   C   s   t tt d S )Ni  )r   roundtimer
   r
   r
   r   _now_msB   s    r   c                  O   s:   t r
t}n"trt}ntrt}nt}td || i |S )NzWarning: the Stripe 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_clientF   s    r#   c                   @   s   e Zd ZdZdZdZd"ddZd#dd	Zd$d
dZdd Z	d%ddZ
d&ddZdd Zdd Zd'ddZd(ddZdd Zdd Zdd Zd d! ZdS ))
HTTPClient         ?<   TNc                 C   sP   || _ |r0t|tr||d}t|ts0td|r<| nd | _t | _	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
isinstancestrdict
ValueErrorcopy_proxy	threadinglocal_thread_localselfverify_ssl_certsproxyr
   r
   r   __init___   s    


	zHTTPClient.__init__c                 C   s   | j ||||ddS NFis_streaming_request_with_retries_internalr5   methodurlheaders	post_datar
   r
   r   request_with_retriesr   s    
zHTTPClient.request_with_retriesc                 C   s   | j ||||ddS NTr:   r<   r>   r
   r
   r   request_stream_with_retriesw   s    
z&HTTPClient.request_stream_with_retriesc              
   C   s   |  | d}t }z.|r,| ||||}n| ||||}d }	W n. tjyp }
 z|
}	d }W Y d }
~
n
d }
~
0 0 | ||	|r|	rtd|	j	  |d7 }| 
||}td||||f  t| q|d ur| || |S |	qd S )Nr   z Encountered a retryable error %s   zBInitiating retry %i for request %s %s after sleeping %.2f seconds.)_add_telemetry_headerr   request_streamrequestr   APIConnectionError_should_retryr   Zlog_infoZuser_message_sleep_time_secondsr   sleep_record_request_metrics)r5   r?   r@   rA   rB   r;   num_retriesrequest_startresponseZconnection_erroreZ
sleep_timer
   r
   r   r=   ~   s@    

z)HTTPClient._request_with_retries_internalc                 C   s   t dd S )Nz.HTTPClient subclasses must implement `request`NotImplementedErrorr>   r
   r
   r   rI      s    zHTTPClient.requestc                 C   s   t dd S )Nz5HTTPClient subclasses must implement `request_stream`rS   r>   r
   r
   r   rH      s    zHTTPClient.request_streamc                 C   st   ||   krdS |d u r|jS |\}}}|d urXd|v rX|d dkrHdS |d dkrXdS |dkrddS |dkrpdS dS )NFzstripe-should-retryfalsetrueTi  i  )_max_network_retriesshould_retry)r5   rQ   Zapi_connection_errorrO   _status_coderheadersr
   r
   r   rK      s    
zHTTPClient._should_retryc                 C   s   ddl m} |S )Nr   )max_network_retries)striper\   )r5   r\   r
   r
   r   rW      s    zHTTPClient._max_network_retriesc              	   C   sB   |d u rd S |\}}}zt |d W S  ttfy<   Y d S 0 d S )Nzretry-after)r   KeyErrorr.   )r5   rQ   rY   r[   r
   r
   r   _retry_after_header   s    
zHTTPClient._retry_after_headerc                 C   sV   t tjd|d   tj}| |}ttj|}| |p<d}|tjkrRt||}|S )Nr%   rF   r   )minr$   INITIAL_DELAY	MAX_DELAY_add_jitter_timemaxr_   MAX_RETRY_AFTER)r5   rO   rQ   sleep_secondsretry_afterr
   r
   r   rL      s    


zHTTPClient._sleep_time_secondsc                 C   s   |ddt dd  9 }|S )Nr&   rF   r   )randomuniform)r5   rf   r
   r
   r   rc      s    zHTTPClient._add_jitter_timec                 C   s6   t | jdd }tjr2|r2d| i}t||d< d S )Nlast_request_metricszX-Stripe-Client-Telemetry)getattrr3   r]   enable_telemetrypayloadjsondumps)r5   rA   rj   Z	telemetryr
   r
   r   rG     s    
z HTTPClient._add_telemetry_headerc                 C   s<   |\}}}d|v r8t jr8|d }t | }t||| j_d S )Nz
Request-Id)r]   rl   r   r   r3   rj   )r5   rQ   rP   rY   r[   Z
request_idZrequest_duration_msr
   r
   r   rN     s    

z"HTTPClient._record_request_metricsc                 C   s   t dd S )Nz,HTTPClient subclasses must implement `close`rS   r5   r
   r
   r   close  s    zHTTPClient.close)TN)N)N)N)N)N)N)__name__
__module____qualname__rb   ra   re   r8   rC   rE   r=   rI   rH   rK   rW   r_   rL   rc   rG   rN   rq   r
   r
   r
   r   r$   Z   s$   

 
.

%



	r$   c                       sN   e Zd ZdZd fdd	ZdddZddd	Zd
d Zdd Zdd Z	  Z
S )r   r   P   Nc                    s&   t t| jf i | || _|| _d S N)superr   r8   _session_timeout)r5   timeoutsessionr!   	__class__r
   r   r8   "  s    zRequestsClient.__init__c                 C   s   | j ||||ddS r9   _request_internalr>   r
   r
   r   rI   '  s    
zRequestsClient.requestc                 C   s   | j ||||ddS rD   r~   r>   r
   r
   r   rH   ,  s    
zRequestsClient.request_streamc              
   C   s  i }| j rtj|d< nd|d< | jr.| j|d< |r:d|d< t| jdd d u r^| jpXt | j_	zvz&| jj	j
||f||| jd|}W n2 ty } ztd|f W Y d }~n
d }~0 0 |r|j}	n|j}	|j}
W n0 ty } z| | W Y d }~n
d }~0 0 |	|
|jfS )	NverifyFproxiesTstreamr{   )rA   datarz   a  Warning: It looks like your installed version of the "requests" library is not compatible with Stripe'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]   ca_bundle_pathr0   rk   r3   rx   r   Sessionr{   rI   ry   	TypeErrorrawcontentrZ   	Exception_handle_request_errorrA   )r5   r?   r@   rA   rB   r;   r!   resultrR   r   rZ   r
   r
   r   r   1  sF    

	
 z RequestsClient._request_internalc                 C   s   t |tjjr.d}dt|jt|f }d}nt |tjjtjjfrdd}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 Stripe's SSL certificate.  Please make sure that your network is not intercepting certificates.  If this problem persists, let us know at support@stripe.com.%s: %sFziUnexpected error communicating with Stripe.  If this problem persists, let us know at support@stripe.com.TzUnexpected error communicating with Stripe. It looks like there's probably a configuration issue locally.  If this problem persists, let us know at support@stripe.com.zA %s was raisedz with error message %sz with no error messagez

(Network error: %s)rX   )r+   r   
exceptionsSSLErrortyperr   r,   TimeoutConnectionErrorRequestExceptiontextwrapfillr   rJ   )r5   rR   msgerrrX   r
   r
   r   r   d  s6    z$RequestsClient._handle_request_errorc                 C   s"   t | jdd d ur| jj  d S )Nr{   )rk   r3   r{   rq   rp   r
   r
   r   rq     s    zRequestsClient.close)ru   N)N)Nrr   rs   rt   namer8   rI   rH   r   r   rq   __classcell__r
   r
   r|   r   r     s   

33r   c                       sN   e Zd ZdZd fdd	ZdddZdd	d
Z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r6   r7   zNo proxy support in urlfetch library. Set stripe.default_http_client to either RequestsClient, PycurlClient, or Urllib2Client instance to use a proxy.)rw   r   r8   r.   r*   	_deadline)r5   r6   r7   deadliner|   r
   r   r8     s    
zUrlFetchClient.__init__c                 C   s   | j ||||ddS r9   r~   r>   r
   r
   r   rI     s    
zUrlFetchClient.requestc                 C   s   | j ||||ddS rD   r~   r>   r
   r
   r   rH     s    
zUrlFetchClient.request_streamc           	   
   C   s   zt j|||| j| j|d}W n2 t jyP } z| || W Y d }~n
d }~0 0 |rltjt	
|j}n|j}||j|jfS )N)r@   r?   rA   Zvalidate_certificater   rm   )r   fetchr*   r   Errorr   r   ioBytesIOr,   encoder   rZ   rA   )	r5   r?   r@   rA   rB   r;   r   rR   r   r
   r
   r   r     s    
"z UrlFetchClient._request_internalc                 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 Stripe library attempted to fetch an invalid URL (%r). This is likely due to a bug in the Stripe Python bindings. Please let us know at support@stripe.com.z0There was a problem retrieving data from Stripe.zThere was a problem receiving all of your data from Stripe.  This is likely due to a bug in Stripe. Please let us know at support@stripe.com.hUnexpected error communicating with Stripe. If this problem persists, let us know at support@stripe.com.

(Network error: ))
r+   r   ZInvalidURLErrorZDownloadErrorZResponseTooLargeErrorr   r   r,   r   rJ   )r5   rR   r@   r   r
   r
   r   r     s    z$UrlFetchClient._handle_request_errorc                 C   s   d S rv   r
   rp   r
   r
   r   rq     s    zUrlFetchClient.close)TNr   )N)Nr   r
   r
   r|   r   r     s   

r   c                       s^   e Zd ZdZd fdd	Zdd Zddd	Zdd
dZdd Zdd Z	dd Z
dd Z  ZS )r   r   TNc                    sN   t t| j||d t | _| jrJ| j}t|D ]\}}t	|||< q4d S Nr   )
rw   r   r8   r   ZCurl_curlr0   r   	iteritemsr   )r5   r6   r7   schemevaluer|   r
   r   r8     s    

zPycurlClient.__init__c                 C   sB   d|vri S | ddd }t|}tdd tt|D S )Nz
rF   c                 s   s   | ]\}}|  |fV  qd S rv   lowerr   kvr
   r
   r   	<genexpr>  r   z-PycurlClient.parse_headers.<locals>.<genexpr>)splitemailmessage_from_stringr-   r   r   )r5   r   Zraw_headersrA   r
   r
   r   parse_headers  s
    
zPycurlClient.parse_headersc                 C   s   | j ||||ddS r9   r~   r>   r
   r
   r   rI   
  s    
zPycurlClient.requestc                 C   s   | j ||||ddS rD   r~   r>   r
   r
   r   rH     s    
zPycurlClient.request_streamc              
   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!t"j# n| jtj$d	 z| j%  W n2 tj&y }	 z| '|	 W Y d }	~	n
d }	~	0 0 |r|(d
 |}
n|) *d}
| j+tj,}| -|) *d}|
||fS )Nz%s:%sgetrF   post   ru   c                 S   s   g | ]\}}d ||f qS )r   r
   r   r
   r
   r   r   >  r   z2PycurlClient._request_internal.<locals>.<listcomp>Fr   utf-8).r   r   r   r   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CAINFOr]   r   ZSSL_VERIFYHOSTZperformr   r   seekgetvaluedecodegetinfoZRESPONSE_CODEr   )r5   r?   r@   rA   rB   r;   br[   r7   rR   rcontentrcoder
   r
   r   r     sX    



 
zPycurlClient._request_internalc                 C   sz   |j d tjtjtjfv r$d}d}n(|j d tjtjfv rDd}d}nd}d}t|d |j d  d	 }t	j
||d
d S )Nr   zCould not connect to Stripe.  Please check your internet connection and try again.  If this problem persists, you should check Stripe's service status at https://twitter.com/stripestatus, or let us know at support@stripe.com.Tr   Fr   r   rF   r   r   )r    r   ZE_COULDNT_CONNECTZE_COULDNT_RESOLVE_HOSTZE_OPERATION_TIMEOUTEDZE_SSL_CACERTZE_SSL_PEER_CERTIFICATEr   r   r   rJ   )r5   rR   r   rX   r
   r
   r   r   U  s"    z"PycurlClient._handle_request_errorc                 C   sD   | j r@| j }|r|dd nd }|r@||||dd S d S )N:r   )r0   r   r   )r5   r@   r7   r   r
   r
   r   r   u  s    zPycurlClient._get_proxyc                 C   s   d S rv   r
   rp   r
   r
   r   rq   }  s    zPycurlClient.close)TN)N)N)rr   rs   rt   r   r8   r   rI   rH   r   r   r   rq   r   r
   r
   r|   r   r     s   

A r   c                       sN   e Zd ZdZd fdd	ZdddZddd	Z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   )	rw   r   r8   _openerr0   r	   rI   ProxyHandlerbuild_openerr4   r|   r
   r   r8     s    
zUrllib2Client.__init__c                 C   s   | j ||||ddS r9   r~   r>   r
   r
   r   rI     s    
zUrllib2Client.requestc                 C   s   | j ||||ddS rD   r~   r>   r
   r
   r   rH     s    
zUrllib2Client.request_streamc              
      s&  t jrt|t jr|d}tj|||} dvrB fdd|_zF| j	rV| j	
|n
tj|}|rl|}n| }|j}	t| }W nv tjjy }
 z&|
j}	|
 }t|
 }W Y d }
~
n>d }
~
0  tjjtfy }
 z| |
 W Y d }
~
n
d }
~
0 0 tdd t t|D }||	|fS )Nr   )r   r   c                      s      S rv   )r   r
   r?   r
   r   <lambda>  r   z1Urllib2Client._request_internal.<locals>.<lambda>c                 s   s   | ]\}}|  |fV  qd S rv   r   r   r
   r
   r   r     r   z2Urllib2Client._request_internal.<locals>.<genexpr>)r   PY3r+   string_typesr   r	   rI   Request
get_methodr   openurlopenreadcoder-   infor   	HTTPErrorURLErrorr.   r   r   )r5   r?   r@   rA   rB   r;   reqrQ   r   r   rR   Zlhr
   r   r   r     s.    

  zUrllib2Client._request_internalc                 C   s,   d}t |d t| d }t|d S )Nr   r   r   )r   r   r,   r   rJ   )r5   rR   r   r
   r
   r   r     s    z#Urllib2Client._handle_request_errorc                 C   s   d S rv   r
   rp   r
   r
   r   rq     s    zUrllib2Client.close)TN)N)Nr   r
   r
   r|   r   r     s   


"r   ),
__future__r   r   r   sysr   r   r   r   rh   r1   rn   r]   r   r   r   Zstripe.request_metricsr   Zstripe.six.movesr	   ImportErrorr   r   __version__versionr   majorminorpatchr   stderrr   Zgoogle.appengine.apir   Zstripe.six.moves.urllib.parser   r   r#   objectr$   r   r   r   r   r
   r
   r
   r   <module>   sb   



 F}T 