
    +h(@                     "   d dl Z d dlZd dlmZmZ d dlZd dl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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 d dlmZ d dlmZmZm Z  d d	l!m"Z"m#Z# d
ej                  fdZ$ddZ%d Z&d Z' G d de(      Z)y)    N)BytesIOIOBase)AnyDictMappingOptionalTuplecast)NoReturn)OrderedDict)erroroauth_errorhttp_clientversionutil)MultipartDataGenerator)	urlencodeurlsplit
urlunsplit)StripeResponseStripeStreamResponsedttimec                    | j                   rI| j                   j                  |       .t        j                  | j	                               }t        |      S t        j                  | j                               }t        |      S N)	tzinfo	utcoffsetcalendartimegmutctimetupletimemktime	timetupleint)r   utc_timestamps     G/var/www/html/venv/lib/python3.12/site-packages/stripe/api_requestor.py_encode_datetimer&      se    }}008D (;(;(=> } F$4$4$67}    c                 ^    t               }|j                         D ]  \  }}|||| |fz  <    |S r   )r   items)keydatafmtdsubkeysubvalues         r%   _encode_nested_dictr0   $   s;    A JJL *!)#f
*Hr'   c              #   B  K   | j                         D ]  \  }}|
t        |d      r||j                  f 't        |t              st        |t
              rZt        |      D ]K  \  }}t        |t              r+t        d||fz  |      }t        |      D ]  \  }}||f  Ad||fz  |f M t        |t              r&t        ||      }t        |      D ]  \  }}	||	f  t        |t        j                        r|t        |      f ||f 
 y w)N	stripe_idz%s[%d])r)   hasattrr2   
isinstancelisttuple	enumeratedictr0   _api_encodedatetimer&   )
r+   r*   valueisvsubdictkvr.   r/   s
             r%   r9   r9   +   s(    jjl 
U=UK(((t$
5%(@"5) 42b$'1(c1X2ErJG +G 4 %1 !f% $sAh.334 t$)#u5G$/$8 ) x(()x001(/00,)s   DDc                 V    t        |       \  }}}}}|r|d|}t        |||||f      S )N&)r   r   )urlqueryschemenetlocpath
base_queryfragments          r%   _build_api_urlrJ   C   s9    19#.FFD*h%u-vvtUH=>>r'   c                      e Zd ZU ee   ed<   eed<   eed<   ee   ed<   	 	 	 	 	 ddZed        Z	 	 dded	ed
ee	ee
f      dee	eef      deeef   f
dZ	 	 dded	ed
ee	ee
f      dee	eef      deeef   f
dZdefdZd Zd Zd Z	 	 	 dded	ed
ee	ee
f      dee	eef      dedeeee	eef   ef   fdZd Zdedede	eef   defdZdedede	eef   defdZy) APIRequestorapi_keyapi_baseapi_versionstripe_accountNc                    |xs t         j                  | _        || _        |xs t         j                  | _        || _        d | _        ddl m} ddl m} |r|| _        y t         j                  r;t         j                  | _        || j
                  k7  rt        j                  d       y y t        j                  ||      t         _	        t         j                  | _        || _        y )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.)rR   rS   )striperN   rM   rO   rP   _default_proxyrR   rS   _clientdefault_http_clientwarningswarnr   new_default_http_client)selfr*   clientrN   rO   accountverifyrS   s           r%   __init__zAPIRequestor.__init__R   s     !3FOO&<&*<*<%"5 !DL''!55DL+++1 , *5)L)L!'u*F& "55DL"'Dr'   c                 R    |d   }|d   r|d|d   z  }|d   r|d|d   dz  }|S )Nnamer   /rC   z () )clsinfostrs      r%   format_app_infozAPIRequestor.format_app_infoy   s@    6l	?DO--C;d5k++C
r'   methodrC   paramsheadersreturnc                     | j                  |j                         |||d      \  }}}}| j                  |||      }	|	|fS )NFis_streaming)request_rawlowerinterpret_response)
r[   ri   rC   rj   rk   rbodyrcoderheaders
my_api_keyresps
             r%   requestzAPIRequestor.request   sT     .2-=-=LLNCu .> .
*uh
 &&ueX>Zr'   c                     | j                  |j                         |||d      \  }}}}| j                  t        t        |      ||      }	|	|fS )NTrn   )rp   rq   interpret_streaming_responser
   r   )
r[   ri   rC   rj   rk   streamrt   ru   rv   rw   s
             r%   request_streamzAPIRequestor.request_stream   sd     /3.>.>LLNCt /? /
+x 00  
 Zr'   c                     	 |d   }d }t	        |t
              r| j                  |||||      }|| j                  |||||      }|# t         t        f$ r t        j                  d||fz  |||      w xY w)Nr   z@Invalid response object from API: %r (HTTP response code was %d))KeyError	TypeErrorr   APIErrorr4   rg   specific_oauth_errorspecific_api_error)r[   rs   rt   rw   ru   
error_dataerrs          r%   handle_error_responsez"APIRequestor.handle_error_response   s    		gJ 
 j#&++udHjC ;))udHjC 	1 )$ 	.."EN+ 	s   A -A4c           	         t        j                  d|j                  d      |j                  d      |j                  d      |j                  d             |dk(  s|dk(  r<|j                  d      d	k(  r(t        j                  |j                  d      ||||      S |d
v r|j                  d      dk(  r(t        j
                  |j                  d      ||||      S t        j                  |j                  d      |j                  d      |j                  d      ||||      S |dk(  r(t        j                  |j                  d      ||||      S |dk(  rHt        j                  |j                  d      |j                  d      |j                  d      ||||      S |dk(  r(t        j                  |j                  d      ||||      S t        j                  |j                  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PermissionErrorr   )r[   rs   rt   rw   ru   r   s         r%   r   zAPIRequestor.specific_api_error   s   '!~~f-!~~f-$..3"w/	
 C<SLZ^^F3|C''y)5%x  j ~~f%)<<--NN9-ueT8  00NN9-NN7+NN6*  c\,,y)5%x  c\??y)w'v&  c\((y)5%x  >>y)5%x r'   c                 |   |j                  d|      }t        j                  d||       ||||||g}|dk(  rt        j                  | S |dk(  rt        j
                  | S |dk(  rt        j                  | S |dk(  rt        j                  | S |dk(  rt        j                  | S |d	k(  rt        j                  | S y )
Nerror_descriptionzStripe OAuth error received)r   r   invalid_clientinvalid_grantinvalid_requestinvalid_scopeunsupported_grant_typeunsupported_response_type)
r   r   r   r   InvalidClientErrorInvalidGrantErrorr   InvalidScopeErrorUnsupportedGrantTypeErrorUnsupportedResponseTypeError)r[   rs   rt   rw   ru   r   descriptionargss           r%   r   z!APIRequestor.specific_oauth_error   s    hh2J?)!)	
 KtXF))11488?*00$77,,22D99?*00$773388$??66;;TBBr'   c                    dt         j                  }t        j                  r%|d| j	                  t        j                        z   z  }t         j                  dd| j
                  j                  d}dt        j                  gdt        j                  gdd	 gfD ]  \  }}	  |       }|||<    t        j                  rt        j                  |d<   t        j                  |      |d|d}| j                  r| j                  |d<   |dk(  r2d|d<   |j                  dt        t        j                                       | j"                  |d<   |S # t        $ r d
}Y w xY w)NzStripe/v1 PythonBindings/ pythonrT   )bindings_versionlang	publisherhttpliblang_versionplatformunamec                  H    dj                  t        j                               S )Nr   )joinr   r   rd   r'   r%   <lambda>z.APIRequestor.request_headers.<locals>.<lambda>  s    chhx~~'78 r'   z
(disabled)applicationzBearer )zX-Stripe-Client-User-Agentz
User-AgentAuthorizationzStripe-Accountpostz!application/x-www-form-urlencodedContent-TypezIdempotency-KeyzStripe-Version)r   VERSIONrT   app_inforh   rV   ra   r   python_version	ExceptionjsondumpsrP   
setdefaultrg   uuiduuid4rO   )	r[   rM   ri   
user_agentuaattrfuncvalrk   s	            r%   request_headerszAPIRequestor.request_headers  sS   6=ooG
??# 4 4V__ EEEJ !(!||((	
 X445**+89
 		JD$
#f BtH		 ?? &B} +/**R.$,35
 (,(;(;G$%V&IGN#0#djjl2CD$($4$4 !+  #"#s   !EEEsupplied_headersro   c                    |t        |      nd}| j                  r| j                  }nddlm} |}|t        j                  d      | j
                  |}	t        t        t        |xs i                   }
|
j                  dd      j                  dd      }
|d	k(  s|d
k(  r|rt        |	|
      }	d}ny|dk(  r[|V|j                  d      dk(  rBt               }|j                  |xs i        |j                         }d|j                  |d<   n|
}nt        j                   d|d      | j#                  ||      }||j%                         D ]
  \  }}|||<    t'        j(                  d||	       t'        j*                  d|
| j,                         |r#| j.                  j1                  ||	||      \  }}}n"| j.                  j3                  ||	||      \  }}}t'        j(                  d|	|       t'        j*                  d|       d|v r/|d   }t'        j*                  dt'        j4                  |             ||||fS )z3
        Mechanism for issuing an API call
        Nr   )rM   zNo 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%5B[z%5D]r   deleter   r   zmultipart/form-datazmultipart/form-data; boundary=zUnrecognized HTTP method ze.  This may indicate a bug in the Stripe bindings.  Please contact support@stripe.com for assistance.zRequest to Stripe api)ri   rG   zPost details)	post_datarO   zStripe API response)rG   response_codezAPI response body)bodyz
Request-IdzDashboard link for request)link)r8   rM   rT   r   r   rN   r   r5   r9   replacerJ   r   r   
add_paramsget_post_databoundaryAPIConnectionErrorr   r)   r   r   	log_debugrO   rV   request_stream_with_retriesrequest_with_retriesdashboard_link)r[   ri   rC   rj   r   ro   supplied_headers_dictrv   rM   abs_urlencoded_paramsr   	generatorrk   r*   r;   rcontentrt   ru   
request_ids                       r%   rp   zAPIRequestor.request_raw8  so    '7&BD!" 	 <<J& J++  !MM3/"4FLb(A#BC
 (//s;CCE3OU?f0(.AIv%1)--n=() 34	$$V\r2%335	 ;D:L:LN &" +	** "(*  &&z6: ,399; %
U$% 	-f7K$((	
 
 88)	
 )-(I(I))%HeX 	+'O*:8#!,/JNN,((4
 *44r'   c                 &    d|cxk  xr dk   S c  S )N   i,  rd   )r[   rt   s     r%   _should_handle_code_as_errorz)APIRequestor._should_handle_code_as_error  s    %%#%%%%%%r'   rs   rt   ru   c                 b   	 t        |d      rt        t        |      j                  d      }t	        t        t
        |      ||      }| j                  |      r| j                  |||j                  |       |S # t        $ r, t        j                  d||fz  t        t        |      ||      w xY w)Ndecodezutf-8z>Invalid response body from API: %s (HTTP response code was %d))r3   r
   bytesr   r   rg   r   r   r   r   r   r+   )r[   rs   rt   ru   rw   s        r%   rr   zAPIRequestor.interpret_response  s    	uh' UE*11':!S% D ,,U3&&ueTYYI  	...16?UE" 	s   AA9 95B.r{   c                     | j                  |      rqt        |d      rt        t        |      j	                         }n(t        |d      r|j                         }nt        d      | j                  |||       t        d      t        |||      S )Ngetvaluereadz`HTTP client %s does not return an IOBase object which can be consumed when streaming a response.z.interpret_response should have raised an error)
r   r3   r
   r   r   r   NotImplementedErrorrr   RuntimeErrorr   )r[   r{   rt   ru   json_contents        r%   rz   z)APIRequestor.interpret_streaming_response  s     ,,U3vz*#GV4==?(%{{})A 
 ##L%B@  (x@@r'   )NNNNN)NN)NNF)__name__
__module____qualname__r   rg   __annotations__r_   classmethodrh   r   r   r	   r   rx   r   r|   r   r   r   r   r   boolobjectr#   rp   r   rr   r   rz   rd   r'   r%   rL   rL   L   s   c]MSM! %(N   /3/3     c*+	 
 '#s(+,  
~s"	# " /3/3     c*+	 
 '#s(+,  
#S(	) &X :4l4'Z /38<"e5e5 e5 c*+	e5
 #738#45e5 e5 
vsGCH-s2	3e5N&$'3:383D	2AA%(A4;CH4EA	Ar'   rL   )z%s[%s])*r   r:   ior   r   r   r   r    typingr   r   r   r   r	   r
   typing_extensionsr   r   rX   collectionsr   rT   r   r   r   r   r   stripe.multipart_data_generatorr   urllib.parser   r   r   stripe.stripe_responser   r   r&   r0   r9   rJ   r   rL   rd   r'   r%   <module>r      su           '   #  A A B 8 8 GX.. 0?GA6 GAr'   