o
    ˷e\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yO   Y nw zd dlZW n eya   dZY nw zd dlZW n eys   dZY n/w zejZdd edD \ZZZW n	 ey   Y nw eeefd	k rejd
ef  dZzd dl m!Z! W n ey   dZ!Y nw 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
   I/var/www/ideatree/venv/lib/python3.10/site-packages/stripe/http_client.py
<listcomp>'   s    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   || _ |rt|tr||d}t|tst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      | j ||||ddS NFis_streaming_request_with_retries_internalr4   methodurlheaders	post_datar
   r
   r   request_with_retriesr      
zHTTPClient.request_with_retriesc                 C   r8   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y9 }
 z
|
}	d }W Y d }
~
nd }
~
ww | ||	|rf|	rKtd|	j	  |d7 }| 
||}td||||f  t| n|d urr| || |S |	q)Nr   Tz 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   log_infouser_message_sleep_time_secondsr   sleep_record_request_metrics)r4   r?   r@   rA   rB   r;   num_retriesrequest_startresponseconnection_errore
sleep_timer
   r
   r   r=   ~   sH   

z)HTTPClient._request_with_retries_internalc                 C      t d)Nz.HTTPClient subclasses must implement `request`NotImplementedErrorr>   r
   r
   r   rJ         zHTTPClient.requestc                 C   rX   )Nz5HTTPClient subclasses must implement `request_stream`rY   r>   r
   r
   r   rI      r[   zHTTPClient.request_streamc                 C   st   ||   krdS |d u r|jS |\}}}|d ur,d|v r,|d dkr$dS |d dkr,dS |dkr2dS |dkr8dS dS )NFzstripe-should-retryfalsetrueTi  i  )_max_network_retriesshould_retry)r4   rT   api_connection_errorrR   _status_coderheadersr
   r
   r   rL      s   
zHTTPClient._should_retryc                 C   s   ddl m} |S )Nr   )max_network_retries)striperd   )r4   rd   r
   r
   r   r^      s   zHTTPClient._max_network_retriesc              	   C   s>   |d u rd S |\}}}zt |d W S  ttfy   Y d S w )Nzretry-after)r   KeyErrorr-   )r4   rT   ra   rc   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r)t||}|S )Nr$   rG   r   )minr#   INITIAL_DELAY	MAX_DELAY_add_jitter_timemaxrg   MAX_RETRY_AFTER)r4   rR   rT   sleep_secondsretry_afterr
   r
   r   rO      s   


zHTTPClient._sleep_time_secondsc                 C   s   |ddt dd  9 }|S )Nr%   rG   r   )randomuniform)r4   rn   r
   r
   r   rk      s   zHTTPClient._add_jitter_timec                 C   s>   t | jdd }tjr|rd| i}t||d< d S d S d S )Nlast_request_metricszX-Stripe-Client-Telemetry)getattrr2   re   enable_telemetrypayloadjsondumps)r4   rA   rr   	telemetryr
   r
   r   rH     s   
z HTTPClient._add_telemetry_headerc                 C   sD   |\}}}d|v rt jr |d }t | }t||| j_d S d S d S )Nz
Request-Id)re   rt   r   r   r2   rr   )r4   rT   rS   ra   rc   
request_idrequest_duration_msr
   r
   r   rQ     s   

z"HTTPClient._record_request_metricsc                 C   rX   )Nz,HTTPClient subclasses must implement `close`rY   r4   r
   r
   r   close  r[   zHTTPClient.closeTNN)__name__
__module____qualname__rj   ri   rm   r7   rC   rF   r=   rJ   rI   rL   r^   rg   rO   rk   rH   rQ   r|   r
   r
   r
   r   r#   Z   s&    



.
%



	r#   c                       N   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di | || _|| _d S )Nr
   )superr   r7   _session_timeout)r4   timeoutsessionr    	__class__r
   r   r7   "  s   
zRequestsClient.__init__c                 C   r8   r9   _request_internalr>   r
   r
   r   rJ   '  rD   zRequestsClient.requestc                 C   r8   rE   r   r>   r
   r
   r   rI   ,  rD   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p,t | j_	z5z| jj	j
||f||| jd|}W n tyV } ztd|f d }~ww |r]|j}	n|j}	|j}
W n ty{ } z| | W Y d }~nd }~ww |	|
|jfS )	NverifyFproxiesTstreamr   )rA   datar   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)   re   ca_bundle_pathr/   rs   r2   r   r   Sessionr   rJ   r   	TypeErrorrawcontentrb   	Exception_handle_request_errorrA   )r4   r?   r@   rA   rB   r;   r    resultrV   r   rb   r
   r
   r   r   1  sN   



z RequestsClient._request_internalc                 C   s   t |tjjrd}dt|jt|f }d}nPt |tjjtjjfr2d}dt|jt|f }d}n5t |tjj	rId}dt|jt|f }d}nd}dt|jf }t|ra|dt|f 7 }n|d	7 }d}t
|d
|f  }tj||d)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)r_   )r*   r   
exceptionsSSLErrortyper   r+   TimeoutConnectionErrorRequestExceptiontextwrapfillr   rK   )r4   rV   msgerrr_   r
   r
   r   r   d  s6   z$RequestsClient._handle_request_errorc                 C   s&   t | jdd d ur| jj  d S d S )Nr   )rs   r2   r   r|   r{   r
   r
   r   r|     s   zRequestsClient.close)r   Nr~   r   r   r   namer7   rJ   rI   r   r   r|   __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r5   r6   zNo proxy support in urlfetch library. Set stripe.default_http_client to either RequestsClient, PycurlClient, or Urllib2Client instance to use a proxy.)r   r   r7   r-   r)   	_deadline)r4   r5   r6   deadliner   r
   r   r7     s   

zUrlFetchClient.__init__c                 C   r8   r9   r   r>   r
   r
   r   rJ     rD   zUrlFetchClient.requestc                 C   r8   rE   r   r>   r
   r
   r   rI     rD   zUrlFetchClient.request_streamc           	   
   C   s   zt j|||| j| j|d}W n t jy( } z| || W Y d }~nd }~ww |r6tjt	
|j}n|j}||j|jfS )N)r@   r?   rA   validate_certificater   ru   )r   fetchr)   r   Errorr   r   ioBytesIOr+   encoder   rb   rA   )	r4   r?   r@   rA   rB   r;   r   rV   r   r
   r
   r   r     s"   
z UrlFetchClient._request_internalc                 C   sd   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	|)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   InvalidURLErrorDownloadErrorResponseTooLargeErrorr   r   r+   r   rK   )r4   rV   r@   r   r
   r
   r   r     s   
z$UrlFetchClient._handle_request_errorc                 C      d S r~   r
   r{   r
   r
   r   r|        zUrlFetchClient.close)TNr   r~   r   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                    sR   t t| j||d t | _| jr%| j}t|D ]\}}t	|||< qd S d S Nr   )
r   r   r7   r   Curl_curlr/   r   	iteritemsr   )r4   r5   r6   schemevaluer   r
   r   r7     s   

zPycurlClient.__init__c                 C   sB   d|vri S | ddd }t|}tdd tt|D S )Nz
rG   c                 s        | ]\}}|  |fV  qd S r~   lowerr   kvr
   r
   r   	<genexpr>      z-PycurlClient.parse_headers.<locals>.<genexpr>)splitemailmessage_from_stringr,   r   r   )r4   r   raw_headersrA   r
   r
   r   parse_headers  s
   
zPycurlClient.parse_headersc                 C   r8   r9   r   r>   r
   r
   r   rJ   
  rD   zPycurlClient.requestc                 C   r8   rE   r   r>   r
   r
   r   rI     rD   zPycurlClient.request_streamc              
   C   s"  t j }t j }| j  | |}|rB|jr"| jtj	|j |j
r.| jtj|j
 |js4|jrB| jtjd|j|jf  |dkrO| jtjd n|dkrd| 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 n tj&y }	 z| '|	 W Y d }	~	nd }	~	ww |r|(d
 |}
n|) *d}
| j+tj,}| -|) *d}|
||fS )Nz%s:%sgetrG   post   r   c                 S   s   g | ]
\}}d ||f qS )r   r
   r   r
   r
   r   r   >  s    z2PycurlClient._request_internal.<locals>.<listcomp>Fr   utf-8).r   r   r   r   reset
_get_proxyhostnamesetoptr   PROXYport	PROXYPORTusernamepasswordPROXYUSERPWDHTTPGETPOST
POSTFIELDSCUSTOMREQUESTupperURLutf8WRITEFUNCTIONwriteHEADERFUNCTIONNOSIGNALCONNECTTIMEOUTTIMEOUT
HTTPHEADERr   r   r,   r)   CAINFOre   r   SSL_VERIFYHOSTperformr   r   seekgetvaluedecodegetinfoRESPONSE_CODEr   )r4   r?   r@   rA   rB   r;   brc   r6   rV   rcontentrcoder
   r
   r   r     s\   





zPycurlClient._request_internalc                 C   sv   |j d tjtjtjfv rd}d}n|j d tjtjfv r"d}d}nd}d}t|d |j d  d	 }t	j
||d
)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   rG   r   r   )r   r   E_COULDNT_CONNECTE_COULDNT_RESOLVE_HOSTE_OPERATION_TIMEOUTEDE_SSL_CACERTE_SSL_PEER_CERTIFICATEr   r   r   rK   )r4   rV   r   r_   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   )r/   r   r   )r4   r@   r6   r   r
   r
   r   r   u  s   zPycurlClient._get_proxyc                 C   r   r~   r
   r{   r
   r
   r   r|   }  r   zPycurlClient.closer}   r~   )r   r   r   r   r7   r   rJ   rI   r   r   r   r|   r   r
   r
   r   r   r     s    

A r   c                       r   )r   zurllib.requestTNc                    sD   t t| j||d d | _| jr tj| j}tj|| _d S d S r   )	r   r   r7   _openerr/   r	   rJ   ProxyHandlerbuild_openerr3   r   r
   r   r7     s   
zUrllib2Client.__init__c                 C   r8   r9   r   r>   r
   r
   r   rJ     rD   zUrllib2Client.requestc                 C   r8   rE   r   r>   r
   r
   r   rI     rD   zUrllib2Client.request_streamc              
      s&  t jrt|t jr|d}tj|||} dvr! fdd|_z#| j	r+| j	
|ntj|}|r6|}n| }|j}	t| }W n; tjjye }
 z|
j}	|
 }t|
 }W Y d }
~
nd }
~
w tjjtfy }
 z| |
 W Y d }
~
nd }
~
ww tdd t t|D }||	|fS )Nr   )r   r   c                      s      S r~   )r   r
   r?   r
   r   <lambda>  s    z1Urllib2Client._request_internal.<locals>.<lambda>c                 s   r   r~   r   r   r
   r
   r   r     r   z2Urllib2Client._request_internal.<locals>.<genexpr>)r   PY3r*   string_typesr   r	   rJ   Request
get_methodr   openurlopenreadcoder,   infor   	HTTPErrorURLErrorr-   r   r   )r4   r?   r@   rA   rB   r;   reqrT   r   r   rV   lhr
   r   r   r     s4   


zUrllib2Client._request_internalc                 C   s(   d}t |d t| d }t|)Nr   r   r   )r   r   r+   r   rK   )r4   rV   r   r
   r
   r   r     s   
z#Urllib2Client._handle_request_errorc                 C   r   r~   r
   r{   r
   r
   r   r|     r   zUrllib2Client.closer}   r~   r   r
   r
   r   r   r     s    


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