U
    !hB)                     @   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
mZmZmZ d dlZd dlmZmZmZ d dlmZ d dl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)	urlencodeurlsplit
urlunsplit)errorhttp_clientutil)MultipartDataGenerator)TelnyxResponsec                 C   s<   | j r&| j | d k	r&t|  }nt|  }t|S N)	tzinfo	utcoffsetcalendartimegmutctimetupletimemktime	timetupleint)ZdttimeZutc_timestamp r   W/home/ankuromar296_gmail_com/.local/lib/python3.8/site-packages/telnyx/api_requestor.py_encode_datetime   s    r   %s[%s]c                 C   s,   i }t |D ]\}}|||| |f < q|S r   )six	iteritems)keydatafmtdsubkeysubvaluer   r   r   _encode_nested_dict   s    r#   c           	      c   s   t | D ]\}}t|}|d kr(q
q
t|ts<t|tr|D ]N}t|trztd| |}t	|D ]\}}||fV  qdq@d| 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 )Nz%s[])r   r   r
   utf8
isinstancelisttupledictr#   _api_encodedatetimer   )	r   r   valuesvZsubdictkvr!   r"   r   r   r   r)   "   s$    



r)   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_url9   s    r5   c                   @   s^   e Zd ZdddZedd ZdddZdd	 Zd
d Zdd Z	dddZ
dd Zdd ZdS )APIRequestorNc                 C   sF   |pt j| _|| _ddl m}m} |p8t jp8tj||d| _d | _	d S )Nr   )proxyverify_ssl_certs)r8   r7   )
telnyxapi_baseapi_keyr7   r8   Zdefault_http_clientr	   Znew_default_http_client_clientZ_last_request_metrics)selfr   clientr:   r7   verifyr   r   r   __init__C   s    zAPIRequestor.__init__c                 C   s@   |d }|d r"|d|d f 7 }|d r<|d|d f 7 }|S )Nnameversionz/%sr/   z (%s)r   )clsinfostrr   r   r   format_app_infoQ   s    zAPIRequestor.format_app_infoc           
      C   s2   |  | |||\}}}}| |||}	|	|fS r   )request_rawlowerinterpret_response)
r=   methodr/   paramsheadersrbodyrcoderheaders
my_api_keyrespr   r   r   requestZ   s       zAPIRequestor.requestc              	   C   s^   z|d }W n6 t tfk
rB   tdd||f ig|||Y nX | |||||}|d S )Nerrorstitlez@Invalid response object from API: %r (HTTP response code was %d))KeyError	TypeErrorr   APIErrorspecific_api_errorr=   rM   rN   rQ   rO   Z
error_listerrr   r   r   handle_error_responsea   s      
z"APIRequestor.handle_error_responsec              	   C   sr  |D ]0}t jd|d|d|d|dd q|dkrPt|||||S |dkrjt|||||S |d	krt|||||S |d
krt|||||S |dkrt|||||S |dkrt	|||||S |dkrt
|||||S |dkrt|||||S |dkr$t|||||S |dkr@t|||||S |dkr\t|||||S t|||||S d S )NzTelnyx API error receivedcodedetailsourcerT   )Z
error_codeZerror_detailZerror_sourceZerror_titlei  i  i  i  i  i  i  i  i  i  i  )r
   log_infogetr   ZInvalidRequestErrorAuthenticationErrorPermissionErrorZResourceNotFoundErrorZMethodNotSupportedErrorTimeoutErrorZUnsupportedMediaTypeErrorZInvalidParametersErrorZRateLimitErrorrW   ZServiceUnavailableErrorrY   r   r   r   rX   u   sn            
    


    zAPIRequestor.specific_api_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 ]H\}}z
| }W n, tk
r } zd|f }W 5 d }~X Y nX |||< qXt jrt j|d< t	
||d|f d}	|dks|dkr|	dd krd|	d< |	S )NzTelnyx/v2 PythonBindings/%s pythonr9   )Zbindings_versionlangZ	publisherhttplibZlang_versionplatformunamec                   S   s   d t S )Nrd   )joinrh   ri   r   r   r   r   <lambda>       z.APIRequestor.request_headers.<locals>.<lambda>z!! %sZapplicationz	Bearer %s)zX-Telnyx-Client-User-Agentz
User-AgentAuthorizationpostpatchContent-Typeapplication/json)r9   __version__Zapp_inforF   r<   rA   rh   python_version	Exceptionjsondumpsr`   )
r=   r;   rJ   
user_agentZuaattrfuncvalerL   r   r   r   request_headers   s>    



zAPIRequestor.request_headersc                 C   s  | j r| j }nddlm } |}|dkr*i }|dkr<tdd| j|f }|dksb|dksb|dkr| |}|rzt||}d}	n|d	ks|d
ks|dkr|dddkrt	|pi }|}	n@|dddkrt
 }
|
|pi  |
 }	|}d|
jf |d< ntd|f | ||}|dk	rBt|D ]\}}|||< q.tjd||d tjd|d | j||||	\}}}tjd||d tjd|d ||||fS )z3
        Mechanism for issuing an API call
        r   )r;   Na  No API key provided. (HINT: set your API key using "telnyx.api_key = <API-KEY>"). You can generate API keys from the Telnyx web interface.  See https://developers.telnyx.com/docs/v2/development/authentication for details, or email support@telnyx.com if you have any questions.z%s%sr`   headdeletern   ro   putrp   rq   zmultipart/form-dataz multipart/form-data; boundary=%szUnrecognized HTTP method %r.  This may indicate a bug in the Telnyx bindings.  Please contact support@telnyx.com for assistance.zRequest to Telnyx api)rJ   r3   zPost details)	post_datazTelnyx API response)r3   Zresponse_codezAPI response body)body)r;   r9   r   ra   r:   build_query_paramsr5   r`   ru   rv   r   Z
add_paramsZget_post_databoundaryZAPIConnectionErrorr|   r   r   r
   r_   	log_debugr<   Zrequest_with_retries)r=   rJ   r/   rK   Zsupplied_headersrP   r;   Zabs_urlencoded_paramsr   	generatorrL   r   r+   rM   rN   rO   r   r   r   rG      sd    




   
zAPIRequestor.request_rawc                 C   s,   t tt|pi }|dddd}|S )Nz%5B[z%5D])r   r&   r)   replace)r=   rK   r   r   r   r   r     s    zAPIRequestor.build_query_paramsc              	   C   s   |dkrt d||}nzz$t|dr,|d}t |||}W n, tk
rf   td||f |||Y nX d|  kr|dk sn | |||j| |S )N    decodezutf-8z>Invalid response body from API: %s (HTTP response code was %d)   i,  )r   hasattrr   rt   r   rW   r[   r   )r=   rM   rN   rO   rQ   r   r   r   rI     s$    


zAPIRequestor.interpret_response)NNN)NN)NN)__name__
__module____qualname__r@   classmethodrF   rR   r[   rX   r|   rG   r   rI   r   r   r   r   r6   B   s   


+'
F	r6   )r   )
__future__r   r   r   r   r*   ru   rh   r   r   Zsix.moves.urllib.parser   r   r   r9   r   r	   r
   Ztelnyx.multipart_data_generatorr   Ztelnyx.telnyx_responser   r   r#   r)   r5   objectr6   r   r   r   r   <module>   s    	
	