a
    xdB:                     @   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Zd dlmZmZmZmZmZmZ d dlmZ d dlmZmZmZ d dlmZmZ dd	 ZdddZdd Zdd Z G dd de!Z"dS )    )absolute_importdivisionprint_functionN)OrderedDict)erroroauth_errorhttp_clientversionutilsix)MultipartDataGenerator)	urlencodeurlsplit
urlunsplit)StripeResponseStripeStreamResponsec                 C   s<   | j r&| j | d ur&t|  }nt|  }t|S N)	tzinfo	utcoffsetcalendartimegmutctimetupletimemktime	timetupleint)ZdttimeZutc_timestamp r   L/var/www/html/Ranjet/env/lib/python3.9/site-packages/stripe/api_requestor.py_encode_datetime   s    r   %s[%s]c                 C   s.   t  }t|D ]\}}|||| |f < q|S r   )r   r   	iteritems)keydatafmtdsubkeysubvaluer   r   r   _encode_nested_dict   s    r'   c           
      c   s"  t | D ]\}}t|}|d u r*q
q
t|drB||jfV  q
t|tsVt|trt	|D ]Z\}}t|t
rtd||f |}t|D ]\}}||fV  qq^d||f t|fV  q^q
t|t
rt||}t|D ]\}}	||	fV  qq
t|tjr|t|fV  q
|t|fV  q
d S )N	stripe_idz%s[%d])r   r    r
   utf8hasattrr(   
isinstancelisttuple	enumeratedictr'   _api_encodedatetimer   )
r"   r!   valueisvZsubdictkvr%   r&   r   r   r   r0   #   s(    




r0   c                 C   s4   t | \}}}}}|r"d||f }t|||||fS )Nz%s&%s)r   r   )urlqueryschemenetlocpathZ
base_queryfragmentr   r   r   _build_api_url<   s    r=   c                   @   sx   e Zd ZdddZe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dZdd Zdd Zdd ZdS )APIRequestorNc                 C   s   |pt j| _|| _|pt j| _|| _d | _ddl m} ddl m} |rN|| _nBt j	rrt j	| _|| jkrt
d ntj||dt _	t j	| _|| _d S )Nr   )verify_ssl_certs)proxyzstripe.proxy was updated after sending a request - this is a no-op. To use a different proxy, set stripe.default_http_client to a new client configured with the proxy.)r?   r@   )stripeapi_baseapi_keyapi_versionstripe_accountZ_default_proxyr?   r@   _clientZdefault_http_clientwarningswarnr   Znew_default_http_client)selfr!   clientrB   rD   accountverifyr@   r   r   r   __init__F   s(    

zAPIRequestor.__init__c                 C   s@   |d }|d r"|d|d f 7 }|d r<|d|d f 7 }|S )Nnamer	   z/%sr7   z (%s)r   )clsinfostrr   r   r   format_app_infom   s    zAPIRequestor.format_app_infoc           
      C   s6   | j | |||dd\}}}}| |||}	|	|fS )NFis_streaming)request_rawlowerinterpret_response)
rI   methodr7   paramsheadersrbodyrcoderheaders
my_api_keyrespr   r   r   requestv   s
    zAPIRequestor.requestc           
      C   s6   | j | |||dd\}}}}| |||}	|	|fS )NTrS   )rU   rV   interpret_streaming_response)
rI   rX   r7   rY   rZ   streamr\   r]   r^   r_   r   r   r   request_stream}   s
    zAPIRequestor.request_streamc              	   C   s   z|d }W n. t tfy:   td||f |||Y n0 d }t|tjr^| |||||}|d u rx| |||||}|d S )Nr   z@Invalid response object from API: %r (HTTP response code was %d))	KeyError	TypeErrorr   APIErrorr+   r   string_typesspecific_oauth_errorspecific_api_error)rI   r[   r\   r_   r]   
error_dataerrr   r   r   handle_error_response   s*    


z"APIRequestor.handle_error_responsec              	   C   sJ  t jd|d|d|d|dd |dksJ|dkrb|dd	krbt|d||||S |d
v r|ddkrt|d||||S t|d|d|d||||S n|dkrt|d||||S |dkrt|d|d|d||||S |dkr.t	|d||||S t
|d||||S d S )NzStripe API error receivedcodetypemessageparam)
error_codeZ
error_typeerror_messageZerror_parami    Z
rate_limit)rs   i  Zidempotency_errori  i  i  )r
   log_infogetr   ZRateLimitErrorZIdempotencyErrorInvalidRequestErrorAuthenticationErrorZ	CardErrorPermissionErrorrf   )rI   r[   r\   r_   r]   rj   r   r   r   ri      sd    		
	
zAPIRequestor.specific_api_errorc                 C   s   | d|}tjd||d ||||||g}|dkr>tj| S |dkrPtj| S |dkrbtj| S |dkrttj| S |dkrtj| S |d	krtj	| S d S )
Nerror_descriptionzStripe OAuth error received)rq   ry   Zinvalid_clientZinvalid_grantZinvalid_requestZinvalid_scopeZunsupported_grant_typeZunsupported_response_type)
ru   r
   rt   r   ZInvalidClientErrorZInvalidGrantErrorrv   ZInvalidScopeErrorZUnsupportedGrantTypErrorZUnsupportedResponseTypError)rI   r[   r\   r_   r]   rq   descriptionargsr   r   r   rh      s(    





z!APIRequestor.specific_oauth_errorc           	   	   C   s   dt jf }tjr&|d| tj 7 }t jdd| jjd}dtjgdtjgdd	d
 gfD ]2\}}z
| }W n t	y   d}Y n0 |||< qXtjrtj|d< t
||d|f d}| jr| j|d< |dkrd|d< |dtt  | jd ur| j|d< |S )NzStripe/v1 PythonBindings/%s pythonrA   )Zbindings_versionlangZ	publisherhttplibZlang_versionplatformunamec                   S   s   d t S )Nr|   )joinr   r   r   r   r   r   <lambda>       z.APIRequestor.request_headers.<locals>.<lambda>z
(disabled)Zapplicationz	Bearer %s)zX-Stripe-Client-User-Agentz
User-AgentAuthorizationzStripe-Accountpostz!application/x-www-form-urlencodedContent-TypezIdempotency-KeyzStripe-Version)r	   VERSIONrA   Zapp_inforR   rF   rN   r   python_version	ExceptionjsondumpsrE   
setdefaultrQ   uuiduuid4rD   )	rI   rC   rX   
user_agentZuaattrfuncvalrZ   r   r   r   request_headers   s>    







zAPIRequestor.request_headersFc                 C   s  | j r| j }nddlm } |}|du r0tdd| j|f }ttt|pJi }	|	dddd	}	|d
ksv|dkr|rt	||	}d}
nb|dkr|dur|
ddkrt }||pi  | }
d|jf |d< q|	}
ntd|f | ||}|dur t|D ]\}}|||< qtjd||d tjd|	| jd |rb| j||||
\}}}n| j||||
\}}}tjd||d tjd|d d|v r|d }tjdt|d ||||fS )z3
        Mechanism for issuing an API call
        r   )rC   NzNo API key provided. (HINT: set your API key using "stripe.api_key = <API-KEY>"). You can generate API keys from the Stripe web interface.  See https://stripe.com/api for details, or email support@stripe.com if you have any questions.z%s%sz%5B[z%5D]ru   deleter   r   zmultipart/form-dataz multipart/form-data; boundary=%szUnrecognized HTTP method %r.  This may indicate a bug in the Stripe bindings.  Please contact support@stripe.com for assistance.zRequest to Stripe api)rX   r;   zPost details)	post_datarD   zStripe API response)r;   Zresponse_codezAPI response body)bodyz
Request-IdzDashboard link for request)link)rC   rA   r   rw   rB   r   r,   r0   replacer=   ru   r   Z
add_paramsZget_post_databoundaryZAPIConnectionErrorr   r   r    r
   rt   	log_debugrD   rF   Zrequest_stream_with_retriesZrequest_with_retriesZdashboard_link)rI   rX   r7   rY   Zsupplied_headersrT   r^   rC   Zabs_urlZencoded_paramsr   	generatorrZ   r!   r2   Zrcontentr\   r]   Z
request_idr   r   r   rU     s    




zAPIRequestor.request_rawc                 C   s   d|  kodk n   S )N   i,  r   )rI   r\   r   r   r   _should_handle_code_as_error~  s    z)APIRequestor._should_handle_code_as_errorc              	   C   sp   z$t |dr|d}t|||}W n* tyN   td||f |||Y n0 | |rl| |||j| |S )Ndecodezutf-8z>Invalid response body from API: %s (HTTP response code was %d))	r*   r   r   r   r   rf   r   rl   r"   )rI   r[   r\   r]   r_   r   r   r   rW     s     



zAPIRequestor.interpret_responsec                 C   sX   |  |rHt|dr| }nt|dr2| }ntd| |||S t|||S d S )Ngetvaluereadz`HTTP client %s does not return an IOBase object which can be consumed when streaming a response.)r   r*   r   r   NotImplementedErrorrW   r   )rI   rb   r\   r]   Zjson_contentr   r   r   ra     s    




z)APIRequestor.interpret_streaming_response)NNNNN)NN)NN)NNF)__name__
__module____qualname__rM   classmethodrR   r`   rc   rl   ri   rh   r   rU   r   rW   ra   r   r   r   r   r>   E   s*        
'


6.   
cr>   )r   )#
__future__r   r   r   r   r1   r   r   r   r   rG   collectionsr   rA   r   r   r   r	   r
   r   Zstripe.multipart_data_generatorr   Zstripe.six.moves.urllib.parser   r   r   Zstripe.stripe_responser   r   r   r'   r0   r=   objectr>   r   r   r   r   <module>   s$    	
	