a
    g                     @   sr  U d dl 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 d dlZd dlmZ d dlmZ d dlmZ d dlmZmZmZmZmZmZmZmZmZmZmZmZm Z  d dl!m"Z"m#Z#m$Z$m%Z%m&Z& zd dl'm(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/d dl0Z0d d	l/m1Z2 d d
l/m3Z4 W n e-y   dZ/dZ0Y n0 z$d dl5Z5d dl5m6Z7 d dl5m8Z9 W n e-y   dZ5Y n0 zd dl:Z:d dl:m;Z< W n e-y   dZ:Y n0 zDe=e>d< e:j?Z@eAe>d< eAe>d< eAe>d< dd e@BdD \ZCZDZEW n eFyP   Y n(0 eCeDeEfdk rxejGHde@f  dZ:zd dlImJZJ W n e-y   dZJY n0 d dlKmLZLmMZM dd ZNeeddddZOeedddd ZPG d!d deQZRG d"d# d#eRZSG d$d% d%eRZTG d&d' d'e$ZUG d(d) d)eRZVG d*d+ d+eRZWG d,d- d-eRZXG d.d/ d/eRZYG d0d1 d1eRZZdS )2    )BytesION)HTTPResponse)_util)RequestMetrics)APIConnectionError)AnyDictIterableListMappingMutableMappingOptionalTupleClassVarUnioncastoverloadAsyncIterable)LiteralNoReturn	TypedDict	AwaitableNever)Timeout)Client)ClientTimeout)StreamReader)Sessionversionmajorminorpatchc                 C   s   g | ]}t |qS  )int).0ir"   r"   a/var/www/staging/api/virtual_environments/venv/lib/python3.9/site-packages/stripe/_http_client.py
<listcomp>Y       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)urlparseParseResultc                   C   s   t tt d S )Ni  )r#   roundtimer"   r"   r"   r&   _now_mst   s    r0   
HTTPClient)argskwargsreturnc                  O   s0   t r
t}ntrt}ntrt}nt}|| i |S N)r+   UrlFetchClientrequestsRequestsClientpycurlPycurlClientUrllib2Clientr2   r3   implr"   r"   r&   new_default_http_clientx   s    r>   c                  O   s&   t r
t}ntrt}nt}|| i |S r5   )httpxHTTPXClientaiohttpAIOHTTPClientNoImportFoundAsyncClientr<   r"   r"   r&   new_http_client_async_fallback   s    rD   c                   @   sp  e Zd ZU ee ed< G dd deZdZdZ	dZ
ee ed< eed< dEeeeeef  ed  dddZeeeeeeeef  f  ee eee dddZdFeeeeeeef f  dddZdGeeeeeeeef f  edddZeedddZeeef eeef dddZdd ZdHd
deeeeef eee eee  eeeeeef f d d!d"ZdId
deeeeef eee  eeeeeef f d#d$d%Zd
deeeeef eeee eee  eeeeeef f d&d'd(ZdJd
deeeeeef  eeee  eeeeeef f d)d*d+ZdKd
deeeeeef  eeee  eeeeeef f d)d,d-Z d.d/ Z!dLd
deeeeef ee eee  eeeef d0d1d2Z"dMd
deeeeef eee  ee#e$ eef d#d3d4Z%e&d
deeeeef e'd5 ee eee  eeeeeef f d6d7d8Z(e&d
deeeeef e'd	 ee eee  ee#e$ eeeef f d6d9d8Z(d
deeeeef eee eee  eeeeeef f d6d:d8Z(dNeeeeef ee$eeeef f d;d<d=Z)dOeeeeef ee#e$ eeeef f d;d>d?Z*d@dA Z+ee,d
 dBdCdDZ-d
S )Pr1   namec                   @   s&   e Zd ZU ee ed< ee ed< dS )zHTTPClient._ProxyhttphttpsN)__name__
__module____qualname__r   str__annotations__r"   r"   r"   r&   _Proxy   s   
rM            ?<   _proxy_verify_ssl_certsTNverify_ssl_certsproxyasync_fallback_clientc                 C   sV   || _ |r0t|tr||d}t|ts0td|r<| nd | _|| _t	 | _
d S )N)rF   rG   zqProxy(ies) must be specified as either a string URL or a dict() with string URL under the https and/or http keys.)rR   
isinstancerK   dict
ValueErrorcopyrQ   _async_fallback_client	threadinglocal_thread_local)selfrT   rU   rV   r"   r"   r&   __init__   s    


	zHTTPClient.__init__)responseapi_connection_errornum_retriesmax_network_retriesc                 C   s   |d ur|nd}||krdS |d u r6|d us0J |j S |\}}}|d urpd|v rp|d dkr`dS |d dkrpdS |dkr|dS |dkrdS dS )	Nr   Fzstripe-should-retryfalsetrueTi  i  should_retry)r_   ra   rb   rc   rd   _status_coderheadersr"   r"   r&   _should_retry   s$    
zHTTPClient._should_retry)ra   c              	   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#   KeyErrorrY   )r_   ra   ri   rk   r"   r"   r&   _retry_after_header   s    
zHTTPClient._retry_after_header)rc   ra   r4   c                 C   sV   t tjd|d   tj}| |}ttj|}| |p<d}|tjkrRt||}|S )z
        Apply exponential backoff with initial_network_retry_delay on the number of num_retries so far as inputs.
        Do not allow the number to exceed `max_network_retry_delay`.
              r   )minr1   INITIAL_DELAY	MAX_DELAY_add_jitter_timemaxrn   MAX_RETRY_AFTER)r_   rc   ra   sleep_secondsretry_afterr"   r"   r&   _sleep_time_seconds   s    	


zHTTPClient._sleep_time_seconds)rw   r4   c                 C   s   |ddt dd  9 }|S )z
        Randomize the value in `[(sleep_seconds/ 2) to (sleep_seconds)]`.
        Also separated method here to isolate randomness for tests
        rO   rp   r   )randomuniform)r_   rw   r"   r"   r&   rt     s    zHTTPClient._add_jitter_timeheadersr4   c                 C   sB   t | jdd }tjr>|r>d| i}t|}t||d< |S |S )Nlast_request_metricszX-Stripe-Client-Telemetry)getattrr^   stripeenable_telemetrypayloadrX   jsondumps)r_   r}   r~   Z	telemetryretr"   r"   r&   _add_telemetry_header  s    
z HTTPClient._add_telemetry_headerc                 C   s@   |\}}}d|v r<t jr<|d }t | }t|||d| j_d S )Nz
Request-Idusage)r   r   r0   r   r^   r~   )r_   ra   request_startr   ri   rk   Z
request_idZrequest_duration_msr"   r"   r&   _record_request_metrics"  s    

z"HTTPClient._record_request_metrics)_usage)methodurlr}   	post_datard   r   r4   c             	   C   s   | j ||||d||dS NFis_streamingrd   r   _request_with_retries_internalr_   r   r   r}   r   rd   r   r"   r"   r&   request_with_retries+  s    
zHTTPClient.request_with_retries)r   r   r}   r   r4   c             	   C   s   | j ||||d||dS NTr   r   r   r"   r"   r&   request_stream_with_retries?  s    
z&HTTPClient.request_stream_with_retries)r   r   r}   r   r   rd   r   r4   c             
   C   s   |  |}d}t }	z.|r,| ||||}
n| ||||}
d }W n, tyn } z|}d }
W Y d }~n
d }~0 0 | |
|||r|rtd|j  |d7 }| 	||
}td||||f  t
| q|
d ur| j|
|	|d |
S |d usJ |qd S Nr   z Encountered a retryable error %srp   zBInitiating retry %i for request %s %s after sleeping %.2f seconds.r   )r   r0   request_streamrequestr   rl   r   log_infouser_messagery   r/   sleepr   r_   r   r   r}   r   r   rd   r   rc   r   ra   Zconnection_erroreZ
sleep_timer"   r"   r&   r   S  sJ    

z)HTTPClient._request_with_retries_internal)r   r   r}   r   r   r4   c                C   s   t dd S )Nz.HTTPClient subclasses must implement `request`NotImplementedErrorr_   r   r   r}   r   r   r"   r"   r&   r     s    	zHTTPClient.requestc                C   s   t dd S )Nz5HTTPClient subclasses must implement `request_stream`r   r   r"   r"   r&   r     s    	zHTTPClient.request_streamc                 C   s   t dd S )Nz,HTTPClient subclasses must implement `close`r   r_   r"   r"   r&   close  s    zHTTPClient.close)r   r   r}   rd   r   r4   c             	      s   | j ||||d||dI d H S r   $_request_with_retries_internal_asyncr   r"   r"   r&   request_with_retries_async  s    
z%HTTPClient.request_with_retries_asyncc             	      s   | j ||||d||dI d H S r   r   r   r"   r"   r&   !request_stream_with_retries_async  s    
z,HTTPClient.request_stream_with_retries_asyncF)r   r   r}   r   rd   r   r4   c                   s   d S r5   r"   r_   r   r   r}   r   r   rd   r   r"   r"   r&   r     s    z/HTTPClient._request_with_retries_internal_asyncc                   s   d S r5   r"   r   r"   r"   r&   r     s    c             
      s  |  |}d}t }	z:|r2| ||||I d H }
n| ||||I d H }
d }W n, tyz } z|}d }
W Y d }~n
d }~0 0 | |
|||r|rtd|j  |d7 }| 	||
}td||||f  | 
|I d H  q|
d ur| j|
|	|d |
S |d usJ |qd S r   )r   r0   request_stream_asyncrequest_asyncr   rl   r   r   r   ry   sleep_asyncr   r   r"   r"   r&   r     sN    


r   r   r}   r4   c                    s.   | j d ur"| j ||||I d H S tdd S )Nz4HTTPClient subclasses must implement `request_async`)r[   r   r   r_   r   r   r}   r   r"   r"   r&   r   ,  s    

zHTTPClient.request_asyncc                    s.   | j d ur"| j ||||I d H S tdd S )Nz;HTTPClient subclasses must implement `request_stream_async`)r[   r   r   r   r"   r"   r&   r   7  s    

zHTTPClient.request_stream_asyncc                    s&   | j d ur| j  I d H S tdd S )Nz2HTTPClient subclasses must implement `close_async`)r[   close_asyncr   r   r"   r"   r&   r   B  s
    
zHTTPClient.close_async)secsr4   c                 C   s"   | j d ur| j |S tdd S )Nz,HTTPClient subclasses must implement `sleep`)r[   r   r   r_   r   r"   r"   r&   r   I  s
    
zHTTPClient.sleep_async)TNN)N)N)NN)NN)N)N)NN)NN)N)N).rH   rI   rJ   r   rK   rL   r   rM   rs   rr   rv   r   boolr   r`   r   r   r#   r   r   rl   rn   floatry   rt   r   r   r
   r   r   r   r   r   r   r   r   bytesr   r   r   r   r   r   r   r   r   r"   r"   r"   r&   r1      s@  
   0  	

  

  



@ 
 

  

  









>  c                       sz  e Zd ZdZdeed eeeee	j
f  ee	 d fddZdeeeeeef  eeeeeef f d	d
dZdeeeeeef  eeeeeef f d	ddZeeeeeeef  ed eeeeeef f dddZeeeeeeef  ed eeeeeef f dddZeeeeeef  eeeeef eeeef f dddZeedddZdd Z  ZS )r8   r7   P   NTRequestsSession)timeoutsessionrT   rU   rV   c                    s8   t t| j|||d || _|| _td us.J t| _d S NrS   )superr8   r`   _session_timeoutr7   )r_   r   r   rT   rU   rV   r3   	__class__r"   r&   r`   T  s    	
zRequestsClient.__init__r   c                 C   s   | j ||||ddS NFr   _request_internalr   r"   r"   r&   r   h  s    
zRequestsClient.requestc                 C   s   | j ||||ddS NTr   r   r   r"   r"   r&   r   s  s    
zRequestsClient.request_streamr   r   r}   r   r4   c                 C   s   d S r5   r"   r_   r   r   r}   r   r   r"   r"   r&   r   ~  s    z RequestsClient._request_internalFc                 C   s   d S r5   r"   r   r"   r"   r&   r     s    c              
   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pZ| j | j_	z|z,t
d| 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   r   )r}   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)rR   r   ca_bundle_pathrQ   r   r^   r   r7   r   r   r   r   r   	TypeErrorrawcontentrj   	Exception_handle_request_errorr}   )r_   r   r   r}   r   r   r3   resultr   r   rj   r"   r"   r&   r     sL    


	
 r   r4   c                 C   s   t || jjjr0d}dt|jt|f }d}nt || jjj| jjjfrjd}dt|jt|f }d}nlt || j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||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.A %s was raisedz with error message %sz with no error message

(Network error: %s)rg   )rW   r7   
exceptionsSSLErrortyperH   rK   r   ConnectionErrorRequestExceptiontextwrapfillr   r_   r   msgerrrh   r"   r"   r&   r     s:    z$RequestsClient._handle_request_errorc                 C   s"   t | jdd d ur| jj  d S )Nr   )r   r^   r   r   r   r"   r"   r&   r     s    zRequestsClient.close)r   NTNN)N)N)rH   rI   rJ   rE   r#   r   r   r   rK   r1   rM   r`   r   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__r"   r"   r   r&   r8   Q  sb          	?5r8   c                
       s,  e Zd ZdZdeeej eee d fddZ	de
e
ee
e
f ee
eee
e
f f dd	d
Zde
e
ee
e
f eeeee
e
f f dddZee
e
ee
e
f ed eeeef dddZee
e
ee
e
f ed ee
eef dddZe
e
ee
e
f dddZee
edddZdd Z  ZS )r6   r+   TN7   )rT   rU   deadlinerV   c                    sD   t t| j|||d |r"td|| _|| _td us:J t| _d S )NrS   zNo proxy support in urlfetch library. Set stripe.default_http_client to either RequestsClient, PycurlClient, or Urllib2Client instance to use a proxy.)r   r6   r`   rY   rR   	_deadliner+   )r_   rT   rU   r   rV   r   r"   r&   r`     s    
zUrlFetchClient.__init__r   c                 C   s   | j ||||ddS r   r   r   r"   r"   r&   r   ,  s    
zUrlFetchClient.requestc                 C   s   | j ||||ddS r   r   r   r"   r"   r&   r   3  s    
zUrlFetchClient.request_streamr   c                 C   s   d S r5   r"   r   r"   r"   r&   r   :  s    z UrlFetchClient._request_internalFc                 C   s   d S r5   r"   r   r"   r"   r&   r   D  s    r   r   r}   c           	   
   C   s   z | j j|||| j| j|d}W n4 | j jyT } z| || W Y d }~n
d }~0 0 |rptjt	
|j}n|j}||j|jfS )N)r   r   r}   Zvalidate_certificater   r   )r+   fetchrR   r   Errorr   r   ior   rK   encoder   rj   r}   )	r_   r   r   r}   r   r   r   r   r   r"   r"   r&   r   N  s    
")r   r   r4   c                 C   sn   t || jjrd|f }n,t || jjr.d}nt || jjrBd}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: ))	rW   r+   ZInvalidURLErrorZDownloadErrorZResponseTooLargeErrorr   r   rK   r   )r_   r   r   r   r"   r"   r&   r   m  s    z$UrlFetchClient._handle_request_errorc                 C   s   d S r5   r"   r   r"   r"   r&   r     s    zUrlFetchClient.close)TNr   N)N)N)rH   rI   rJ   rE   r   r   r1   rM   r#   r`   rK   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r"   r"   r   r&   r6     sR         
	

r6   c                   @   s&   e Zd ZU ee ed< ee ed< dS )rM   rF   rG   NrH   rI   rJ   r   r-   rL   r"   r"   r"   r&   rM     s   
rM   c                       s  e Zd ZU G dd deddZdZee ed< d!eee	j
 ee	 d	 fd
dZdd Zd"eeef eeeeeef f dddZd#eeef eeeeeef f dddZeeeeeef ed eeeef dddZeeeeeef ed eeeeeef f dddZeeeeef eeeef eeeef f dddZeedddZee dddZdd  Z  ZS )$r:   c                   @   s&   e Zd ZU ee ed< ee ed< dS )zPycurlClient._ParsedProxyrF   rG   Nr   r"   r"   r"   r&   _ParsedProxy  s   
r   F)totalr9   _parsed_proxyTNrS   c                    sn   t t| j|||d td us"J t| _t | _i | _| jrj| j}| D ]\}}t	t
t|| j|< qLd S r   )r   r:   r`   r9   ZCurl_curlr   rQ   itemsr,   r   rK   )r_   rT   rU   rV   Zproxy_schemevaluer   r"   r&   r`     s    

zPycurlClient.__init__c                 C   s@   d|vri S | ddd }t|}tdd t| D S )Nz
rp   c                 s   s   | ]\}}|  |fV  qd S r5   lowerr$   kvr"   r"   r&   	<genexpr>  r(   z-PycurlClient.parse_headers.<locals>.<genexpr>)splitemailmessage_from_stringrX   r   )r_   r   Zraw_headersr}   r"   r"   r&   parse_headers  s
    
zPycurlClient.parse_headersr|   c                 C   s   | j ||||ddS r   r   r   r"   r"   r&   r     s    
zPycurlClient.requestc                 C   s   | j ||||ddS r   r   r   r"   r"   r&   r     s    
zPycurlClient.request_streamr   c                 C   s   d S r5   r"   r   r"   r"   r&   r     s    zPycurlClient._request_internalc                 C   s   d S r5   r"   r   r"   r"   r&   r     s    r   c              
   C   sD  t j }t j }| j  | |}|r|jrF| j| jj	|j |j
r`| j| jj|j
 |jsl|jr| j| jjd|j|jf  |dkr| j| jjd nD|dkr| j| jjd | j| jj| n| j| jj|  | j| jj| | j| jj|j | j| jj|j | j| jjd | j| jjd | j| jjd | j| jjdd t| D  | jr| j| jjt j! n| j| jj"d	 z| j#  W n4 | jj$y }	 z| %|	 W Y d }	~	n
d }	~	0 0 |r|&d
 |}
n|' (d}
| j)| jj*}| +|' (d}|
||fS )Nz%s:%sgetrp   post   r   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setoptr9   ZPROXYportZ	PROXYPORTusernamepasswordZPROXYUSERPWDZHTTPGETPOSTZ
POSTFIELDSZCUSTOMREQUESTupperURLZWRITEFUNCTIONwriteZHEADERFUNCTIONZNOSIGNALZCONNECTTIMEOUTTIMEOUTZ
HTTPHEADERrX   r   rR   ZCAINFOr   r   ZSSL_VERIFYHOSTZperformerrorr   seekgetvaluedecodegetinfoZRESPONSE_CODEr   )r_   r   r   r}   r   r   brk   rU   r   rcontentrcoder"   r"   r&   r     sX    



 
r   c                 C   s   |j d | jj| jj| jjfv r*d}d}n,|j d | jj| jjfv rNd}d}nd}d}t|d |j d  d	 }t	||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   rp   r   rg   )
r2   r9   ZE_COULDNT_CONNECTZE_COULDNT_RESOLVE_HOSTZE_OPERATION_TIMEOUTEDZE_SSL_CACERTZE_SSL_PEER_CERTIFICATEr   r   r   )r_   r   r   rh   r"   r"   r&   r   #  s(    z"PycurlClient._handle_request_errorr4   c                 C   sD   | j r@| j }|r|dd nd }|r@||||dd S d S )N:r   )r   r   r   )r_   r   rU   r   r"   r"   r&   r  F  s    zPycurlClient._get_proxyc                 C   s   d S r5   r"   r   r"   r"   r&   r   N  s    zPycurlClient.close)TNN)N)N) rH   rI   rJ   r   r   rE   r   rL   r   r1   rM   r`   r   r   rK   r   r#   r   r   r   r   r   r   r   r   r   r   r   r-   r  r   r   r"   r"   r   r&   r:     sX   
    
 

	

H#r:   c                
       s(  e Zd ZdZdeeej ee d fddZde	e	e
e	e	f ee	ee
e	e	f f ddd	Zde	e	e
e	e	f eeee
e	e	f f dd
dZee	e	e
e	e	f ed ee	eef dddZee	e	e
e	e	f ed eeeef dddZe	e	e
e	e	f dddZeedddZdd Z  ZS )r;   zurllib.requestTNrS   c                    sL   t t| j|||d d | _| jrHtttt	t	f | j}t
|| _d S r   )r   r;   r`   _openerrQ   urllibrequestProxyHandlerr   r   rK   build_opener)r_   rT   rU   rV   Zproxy_handlerr   r"   r&   r`   U  s    
zUrllib2Client.__init__r   c                 C   s   | j ||||ddS r   r   r   r"   r"   r&   r   j  s    
zUrllib2Client.requestc                 C   s   | j ||||ddS r   r   r   r"   r"   r&   r   q  s    
zUrllib2Client.request_streamFr   c                 C   s   d S r5   r"   r   r"   r"   r&   r   x  s    zUrllib2Client._request_internalc                 C   s   d S r5   r"   r   r"   r"   r&   r     s    r   c              
      s&  t |tr|d}t||ttttf |} dvrF fdd|_zD| jrZ| j	|nt
|}|rn|}n| }|j}	t| }W nr tjy }
 z&|
j}	|
 }t|
 }W Y d }
~
n<d }
~
0  t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 r5   )r	  r"   r   r"   r&   <lambda>  r(   z1Urllib2Client._request_internal.<locals>.<lambda>c                 s   s   | ]\}}|  |fV  qd S r5   r   r   r"   r"   r&   r     r(   z2Urllib2Client._request_internal.<locals>.<genexpr>)rW   rK   r   r  Requestr   r   
get_methodr  openurlopenreadcoderX   infourlliberror	HTTPErrorURLErrorrY   r   iterr   )r_   r   r   r}   r   r   reqra   r  r  r   Zlhr"   r  r&   r     s2    

  r   c                 C   s,   d}t |d t| d }t||d S )Nr   r   r   )r   r   rK   r   )r_   r   r   r"   r"   r&   r     s    z#Urllib2Client._handle_request_errorc                 C   s   d S r5   r"   r   r"   r"   r&   r     s    zUrllib2Client.close)TNN)N)N)rH   rI   rJ   rE   r   r   r1   rM   r`   rK   r   r   r#   r   r   r   r   r   r   r   r   r   r   r   r   r"   r"   r   r&   r;   R  sN        
	

+r;   c                
       sL  e Zd ZU dZed ed< d eeedf  d fdd	Zd
d Z	e
e
ee
e
f dddZd!e
e
ee
e
f eeeee
e
f f dddZd"e
e
ee
e
f eeeee
e
f f dddZeedddZd#e
e
ee
e
f eee eee
e
f f dddZd$e
e
ee
e
f eee eee
e
f f dddZdd Zdd Z  ZS )%r@   r?   HTTPXClientType_clientr   FHTTPXTimeoutr   c                    s   t t| jf i | td u r&tdtd u r6tdt| _t| _i }| jr`tjt	j
d|d< nd|d< tjf i || _d | _|rtjf i || _|| _d S )NzPUnexpected: tried to initialize HTTPXClient but the httpx module is not present.zPUnexpected: tried to initialize HTTPXClient but the anyio module is not present.cafiler   F)r   r@   r`   r?   ImportErroranyiorR   sslcreate_default_contextr   r   ZAsyncClient_client_asyncr+  r   r   )r_   r   Zallow_sync_methodsr3   r   r"   r&   r`     s,    zHTTPXClient.__init__c                 C   s   | j |S r5   )r1  r   r   r"   r"   r&   r     s    zHTTPXClient.sleep_asyncr   c                 C   s>   i }| j r| j |d< | jr$| j|d< ||f||p2i d|gS )Nr   r   )r}   r   )rQ   r   )r_   r   r   r}   r   r3   r"   r"   r&   _get_request_args_kwargs  s    

z$HTTPXClient._get_request_args_kwargsNr   c              
   C   s   | j d u rtd| ||||\}}z| j j|i |}W n. tyj } z| | W Y d }~n
d }~0 0 |j}	|j}
|j}|	|
|fS )NzqStripe: HTTPXClient was initialized with allow_sync_methods=False, so it cannot be used for synchronous requests.)	r+  RuntimeErrorr5  r   r   r   r   rj   r}   r_   r   r   r}   r   r2   r3   ra   r   r   rj   response_headersr"   r"   r&   r     s    
 zHTTPXClient.requestc              
      s|   |  ||||\}}z| jj|i |I d H }W n. ty^ } z| | W Y d }~n
d }~0 0 |j}	|j}
|j}|	|
|fS r5   )r5  r4  r   r   r   r   rj   r}   r7  r"   r"   r&   r     s     zHTTPXClient.request_asyncr   c                 C   s>   d}dt |jf }d}t|d|f  }t||d|d S Nr   r   Tr   rg   r   rH   r   r   r   r   r"   r"   r&   r   *  s    z!HTTPXClient._handle_request_errorc              
   C   s   | j d u rtd| ||||\}}z"| j j| jj|i |dd}W n. tyv } z| | W Y d }~n
d }~0 0 | }	|j	}
|j
}|	|
|fS )NztStripe: HTTPXClient was not initialized with allow_sync_methods=True, so it cannot be used for synchronous requests.Tr   r   )r+  r6  r5  sendr4  build_requestr   r   Z
iter_bytesrj   r}   r_   r   r   r}   r   r2   r3   ra   r   r   rj   r"   r"   r&   r   5  s$    

 zHTTPXClient.request_streamc              
      s   |  ||||\}}z(| jj| jj|i |ddI d H }W n. tyj } z| | W Y d }~n
d }~0 0 | }	|j}
|j}|	|
|fS )NTr;  )	r5  r4  r<  r=  r   r   Zaiter_bytesrj   r}   r>  r"   r"   r&   r   M  s     z HTTPXClient.request_stream_asyncc                 C   s   | j d ur| j   d S r5   )r+  r   r   r"   r"   r&   r   `  s    
zHTTPXClient.closec                    s   | j  I d H  d S r5   )r4  acloser   r"   r"   r&   r   d  s    zHTTPXClient.close_async)r   F)N)N)N)N)rH   rI   rJ   rE   r   rL   r   r   r`   r   rK   r   r5  r   r   r#   r   r   r   r   r   r	   r   r   r   r   r   r   r"   r"   r   r&   r@     sJ   
  # 
 
  r@   c                
       s&  e Zd ZdZd!eeedf  d fddZedd Z	d	d
 Z
eeeeeef f dddZeeeeef dddZd"eeeeef eeeeeef f dddZeedddZeee eeeef f dddZd#eeeeef edeeeef f dddZdd Zdd  Z  ZS )$rB   rA   r   AIOHTTPTimeoutr-  c                    s6   t t| jf i | td u r&td|| _d | _d S )NzTUnexpected: tried to initialize AIOHTTPClient but the aiohttp module is not present.)r   rB   r`   rA   r0  r   _cached_session)r_   r   r3   r   r"   r&   r`   k  s    zAIOHTTPClient.__init__c                 C   sh   t d usJ | jd u rbi }| jr@tjtjd}t j|d|d< nt jdd|d< t jf i || _| jS )Nr.  )r2  Z	connectorF)Z
verify_ssl)	rA   rA  rR   r2  r3  r   r   ZTCPConnectorZClientSession)r_   r3   ssl_contextr"   r"   r&   r   x  s    
zAIOHTTPClient._sessionc                 C   s
   t |S r5   )asyncior   r   r"   r"   r&   r     s    zAIOHTTPClient.sleep_asyncr  c                 C   s   t dd S Nz4AIOHTTPClient does not support synchronous requests.r   r   r"   r"   r&   r     s    zAIOHTTPClient.requestr   c                 C   sd   ||f}i }| j r<| j d | j d kr.td| j d |d< | jrL| j|d< ||d< ||d< ||fS )NrF   rG   zDAIOHTTPClient does not support different proxies for HTTP and HTTPS.rU   r   r}   r   )rQ   rY   r   )r_   r   r   r}   r   r2   r3   r"   r"   r&   r5    s    
z&AIOHTTPClient._get_request_args_kwargsNr   c                    s2   | j ||||dI d H \}}}| I d H ||fS )N)r   )r   r"  )r_   r   r   r}   r   r   rj   r8  r"   r"   r&   r     s    
zAIOHTTPClient.request_asyncr   c                 C   s>   d}dt |jf }d}t|d|f  }t||d|d S r9  r:  r   r"   r"   r&   r     s    z#AIOHTTPClient._handle_request_errorc                 C   s   t dd S rD  r   r   r"   r"   r&   r     s    zAIOHTTPClient.request_streamAIOHTTPStreamReaderc              
      s|   |  ||||\}}z| jj|i |I d H }W n. ty^ } z| | W Y d }~n
d }~0 0 |j}	|j}
|j}|	|
|fS r5   )r5  r   r   r   r   r   statusr}   r7  r"   r"   r&   r     s     z"AIOHTTPClient.request_stream_asyncc                 C   s   d S r5   r"   r   r"   r"   r&   r     s    zAIOHTTPClient.closec                    s   | j  I d H  d S r5   )r   r   r   r"   r"   r&   r     s    zAIOHTTPClient.close_async)r   )N)N)rH   rI   rJ   rE   r   r   r   r`   propertyr   r   r   r   r#   r   rK   r   r5  r   r   r   r   r	   r   r   r   r   r   r"   r"   r   r&   rB   h  s6    
  
$ rB   c                
       s   e Zd Z fddZeedddZdeeeeef e	e
eeeef f ddd	Zdeeeeef d
ddZdd Z  ZS )rC   c                    s   t t| jf i | d S r5   )r   rC   r`   )r_   r3   r   r"   r&   r`     s    z!NoImportFoundAsyncClient.__init__r  c                   C   s   t dd S )NzImport httpx not found. To make async http requests,You must either install httpx or define your ownasync http client by subclassing stripe.HTTPClientand setting stripe.default_http_client to an instance of it.)r0  r"   r"   r"   r&   raise_async_client_import_error  s    z8NoImportFoundAsyncClient.raise_async_client_import_errorNr   c                    s   |    d S r5   rH  r   r"   r"   r&   r     s    z&NoImportFoundAsyncClient.request_asyncr   c                    s   |    d S r5   rI  r   r"   r"   r&   r     s    z-NoImportFoundAsyncClient.request_stream_asyncc                    s   |    d S r5   rI  r   r"   r"   r&   r     s    z$NoImportFoundAsyncClient.close_async)N)N)rH   rI   rJ   r`   staticmethodr   rH  rK   r   r   r   r#   r   r   r   r   r"   r"   r   r&   rC     s     rC   )[r   r   sysr   r   r/   rz   r\   r   rC  r2  http.clientr   r   r   Zstripe._request_metricsr   Zstripe._errorr   typingr   r   r	   r
   r   r   r   r   r   r   r   r   r   Ztyping_extensionsr   r   r   r   r   urllib.requestr   r  urllib.errorr  r%  r0  r9   r?   r1  r   r,  r   r*  rA   r   r@  r   rE  r7   r   r   rK   rL   __version__r   r#   r   r   r    r!   r   stderrr  Zgoogle.appengine.apir+   urllib.parser,   r-   r0   r>   rD   objectr1   r8   r6   rM   r:   r;   r@   rB   rC   r"   r"   r"   r&   <module>   s   <





   D ; Dq &t