o
    ˷eB:                     @   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   sB   | j r| j | d urt|  }t|S t|  }t|S N)	tzinfo	utcoffsetcalendartimegmutctimetupletimemktime	timetupleint)dttimeutc_timestamp r   K/var/www/ideatree/venv/lib/python3.10/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t|dr ||jfV  qt|ts*t|tr]t	|D ]-\}}t|t
rOtd||f |}t|D ]	\}}||fV  qDq.d||f t|fV  q.qt|t
rvt||}t|D ]	\}}	||	fV  qkq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svsubdictkvr'   r(   r   r   r   r2   #   s2   




r2   c                 C   s4   t | \}}}}}|rd||f }t|||||fS )Nz%s&%s)r   r   )urlqueryschemenetlocpath
base_queryfragmentr   r   r   _build_api_url<   s   rA   c                   @   s   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} |r(|| _d S t j	r=t j	| _|| jkr;t
d d S d S 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.)rC   rD   )stripeapi_baseapi_keyapi_versionstripe_account_default_proxyrC   rD   _clientdefault_http_clientwarningswarnr   new_default_http_client)selfr#   clientrF   rH   accountverifyrD   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/%sr:   z (%s)r   )clsinfostrr   r   r   format_app_infom   s   zAPIRequestor.format_app_infoc           
      C   6   | j | |||dd\}}}}| |||}	|	|fS )NFis_streaming)request_rawlowerinterpret_response)
rP   methodr:   paramsheadersrbodyrcoderheaders
my_api_keyrespr   r   r   requestv   
   zAPIRequestor.requestc           
      C   rZ   )NTr[   )r]   r^   interpret_streaming_response)
rP   r`   r:   ra   rb   streamrd   re   rf   rg   r   r   r   request_stream}   ri   zAPIRequestor.request_streamc              	   C   sx   z|d }W n t tfy   td||f |||w d }t|tjr-| |||||}|d u r:| |||||}|)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)rP   rc   rd   rg   re   
error_dataerrr   r   r   handle_error_response   s,   	

z"APIRequestor.handle_error_responsec              	   C   s@  t jd|d|d|d|dd |dks%|dkr1|dd	kr1t|d||||S |d
v r\|ddkrHt|d||||S t|d|d|d||||S |dkrlt|d||||S |dkrt|d|d|d||||S |dkrt	|d||||S t
|d||||S )NzStripe API error receivedcodetypemessageparam)
error_code
error_typeerror_messageerror_parami    
rate_limit)r~   i  idempotency_errori  i  i  )r
   log_infogetr   RateLimitErrorIdempotencyErrorInvalidRequestErrorAuthenticationError	CardErrorPermissionErrorro   )rP   rc   rd   rg   re   rs   r   r   r   rr      s^   			zAPIRequestor.specific_api_errorc                 C   s   | d|}tjd||d ||||||g}|dkrtj| S |dkr(tj| S |dkr1tj| S |dkr:tj| S |dkrCtj| S |d	krLtj	| S d S )
Nerror_descriptionzStripe OAuth error received)rz   r   invalid_clientinvalid_grantinvalid_requestinvalid_scopeunsupported_grant_typeunsupported_response_type)
r   r
   r   r   InvalidClientErrorInvalidGrantErrorr   InvalidScopeErrorUnsupportedGrantTypErrorUnsupportedResponseTypError)rP   rc   rd   rg   re   rz   descriptionargsr   r   r   rq      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 ]\}}z| }W n t	y@   d}Y nw |||< q,tjrNtj|d< t
||d|f d}| jrb| j|d< |dkrtd|d< |dtt  | jd ur~| j|d< |S )NzStripe/v1 PythonBindings/%s pythonrE   )bindings_versionlang	publisherhttpliblang_versionplatformunamec                   S   s   d t S )Nr   )joinr   r   r   r   r   r   <lambda>   s    z.APIRequestor.request_headers.<locals>.<lambda>z
(disabled)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	   VERSIONrE   app_inforY   rK   rU   r   python_version	ExceptionjsondumpsrI   
setdefaultrX   uuiduuid4rH   )	rP   rG   r`   
user_agentuaattrfuncvalrb   r   r   r   request_headers   s@   






zAPIRequestor.request_headersFc                 C   s  | j r| j }nddlm } |}|du rtdd| j|f }ttt|p%i }	|	dddd	}	|d
ks;|dkrE|rBt	||	}d}
n1|dkrn|durk|
ddkrkt }||p\i  | }
d|jf |d< n|	}
ntd|f | ||}|durt|D ]\}}|||< qtjd||d tjd|	| jd |r| 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   )rG   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]r   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)r`   r>   zPost details)	post_datarH   zStripe API response)r>   response_codezAPI response body)bodyz
Request-IdzDashboard link for request)link)rG   rE   r   r   rF   r   r.   r2   replacerA   r   r   
add_paramsget_post_databoundaryAPIConnectionErrorr   r   r"   r
   r   	log_debugrH   rK   request_stream_with_retriesrequest_with_retriesdashboard_link)rP   r`   r:   ra   supplied_headersr\   rf   rG   abs_urlencoded_paramsr   	generatorrb   r#   r4   rcontentrd   re   
request_idr   r   r   r]     s~   



zAPIRequestor.request_rawc                 C   s   d|  ko
dk  S    S )N   i,  r   )rP   rd   r   r   r   _should_handle_code_as_error~  s   z)APIRequestor._should_handle_code_as_errorc              	   C   sl   zt |dr|d}t|||}W n ty%   td||f |||w | |r4| |||j| |S )Ndecodezutf-8z>Invalid response body from API: %s (HTTP response code was %d))	r,   r   r   r   r   ro   r   ru   r$   )rP   rc   rd   re   rg   r   r   r   r_     s"   


zAPIRequestor.interpret_responsec                 C   sT   |  |r$t|dr| }nt|dr| }ntd| |||S t|||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   NotImplementedErrorr_   r   )rP   rk   rd   re   json_contentr   r   r   rj     s   




z)APIRequestor.interpret_streaming_response)NNNNN)NN)NNF)__name__
__module____qualname__rT   classmethodrY   rh   rl   ru   rr   rq   r   r]   r   r_   rj   r   r   r   r   rB   E   s,    
'


6.
crB   )r!   )#
__future__r   r   r   r   r3   r   r   r   r   rM   collectionsr   rE   r   r   r   r	   r
   r   stripe.multipart_data_generatorr   stripe.six.moves.urllib.parser   r   r   stripe.stripe_responser   r   r    r)   r2   rA   objectrB   r   r   r   r   <module>   s&     
		