o
    icA                     @   s   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m	Z	 d dl
mZ d dlmZ d dlmZ d dlm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 eeZe ZdZ dZ!dd Z"G dd dZ#G dd dZ$dS )    N)parsers)create_request_object)get_current_datetime)HTTPClientError)get_global_history_recorder)first_non_none_response)handle_checksum_body)URLLib3Session)StreamingBody)get_environ_proxiesis_valid_endpoint_urlis_valid_ipv6_endpoint_url<   
   c                 C   sz   | j | jd|jid}|d dkr| j|d< |S |jr"| j|d< |S |jr6|d d}t| j||d< |S | j|d< |S )a  Convert an HTTP response object to a request dict.

    This converts the HTTP response object to a dictionary.

    :type http_response: botocore.awsrequest.AWSResponse
    :param http_response: The HTTP response from an AWS service request.

    :rtype: dict
    :return: A response dictionary which will contain the following keys:
        * headers (dict)
        * status_code (int)
        * body (string or file-like object)

    operation_name)headersstatus_codecontextr   ,  bodyr   zcontent-length)	r   r   namecontenthas_event_stream_outputrawhas_streaming_outputgetr
   )http_responseoperation_modelresponse_dictlength r    H/home/app/Keep/.python/lib/python3.10/site-packages/botocore/endpoint.pyconvert_to_response_dict+   s"   


r"   c                   @   s   e Zd Z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d Z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S )%Endpointa,  
    Represents an endpoint for a particular service in a specific
    region.  Only an endpoint can make requests.

    :ivar service: The Service object that describes this endpoints
        service.
    :ivar host: The fully qualified endpoint hostname.
    :ivar session: The session object.
    Nc                 C   sR   || _ || _|| _t | _|d u rt }|| _|| _	| j	d u r't
 | _	d S d S N)_endpoint_prefix_event_emitterhost	threadingLock_lockr   ZResponseParserFactory_response_parser_factoryhttp_sessionr	   )selfr'   endpoint_prefixevent_emitterresponse_parser_factoryr,   r    r    r!   __init__X   s   

zEndpoint.__init__c                 C   s   | j  d| j dS )N())r%   r'   r-   r    r    r!   __repr__k   s   zEndpoint.__repr__c                 C   s   | j   d S r$   )r,   closer4   r    r    r!   r6   n   s   zEndpoint.closec                 C   s   t d|| | ||S )Nz%Making request for %s with params: %s)loggerdebug_send_request)r-   r   request_dictr    r    r!   make_requestq   s   zEndpoint.make_requestc                 C   s^   t |}|r(t|j|jg|_|jj }d| d|j }| j	j
|||jd | |}|S )Nzrequest-created..)requestr   )r   anyr   r   Zstream_outputservice_model
service_id	hyphenizer   r&   emitprepare_request)r-   paramsr   r=   r@   
event_nameprepared_requestr    r    r!   create_requesty   s    
zEndpoint.create_requestc                 C   s.   |  D ]\}}t|tr|d||< qd S )Nzutf-8)items
isinstancestrencode)r-   r   keyvaluer    r    r!   _encode_headers   s
   
zEndpoint._encode_headersc                 C   s   |  |j | S r$   )rN   r   preparer-   r=   r    r    r!   rC      s   zEndpoint.prepare_requestc                 C   s:   t  }tj|d}|| }|tj|d | }|dS )Nz%a, %d %b %Y %H:%M:%S %Z)secondsz%Y%m%dT%H%M%SZ)r   datetimestrptime	timedeltastrftime)r-   response_received_timestampZdate_headerread_timeoutZlocal_timestampZdate_conversionZestimated_skewttlr    r    r!   _calculate_ttl   s   

zEndpoint._calculate_ttlc                 C   sl   |d j d}|d}|r2|s4zt }| ||||d< W d S  ty1   tjddd Y d S w d S d S )Nr   Datehas_streaming_inputrX   z9Exception received when updating retries context with TTLTexc_info)r   r   r   rY   	Exceptionr7   r8   )r-   retries_contextrW   success_responseZresponse_date_headerr[   rV   r    r    r!   _set_ttl   s"   
zEndpoint._set_ttlc                 C   sP   | di }||d< d|vrtt |d< |r&|d j}| ||| d S d S )Nretriesattemptzinvocation-idZclient_config)
setdefaultrJ   uuiduuid4rW   ra   )r-   r   rc   r`   r_   rW   r    r    r!   _update_retries_context   s   
z Endpoint._update_retries_contextc           	      C   s   d}|d }|  || | ||}| |||\}}| |||||rK|d7 }|  ||| |  | ||}| |||\}}| |||||s$|d urad|d v ra|d }||d d d< |d urg||S )N   r   ZResponseMetadataZRetryAttempts)rg   rG   _get_response_needs_retryZreset_stream)	r-   r:   r   attemptsr   r=   r`   	exceptionZtotal_retriesr    r    r!   r9      sH   zEndpoint._send_requestc           
      C   s|   |  |||\}}d d ||d}|d ur#|\}}||d< t|||d< |jj }	| jjd|	 d|j fi | ||fS )N)r   parsed_responser   rl   rm   r   zresponse-received.r<   )_do_get_responser"   r?   r@   rA   r&   rB   r   )
r-   r=   r   r   r`   rl   Zkwargs_to_emitr   rm   r@   r    r    r!   ri      s*   zEndpoint._get_responsec              
   C   s  z=t d| td|j|j|j|j|jd |j	j
 }d| d|j }| jj||d}t|}|d u r<| |}W n2 tyS } z
d |fW  Y d }~S d }~w tyo } zt jddd	 d |fW  Y d }~S d }~ww t||}	t||	|| |	 }
|j|
d
< td|
 |j	j}i }| jjd| d|j ||	|d | j|}||	|j}|| |jdkr| |	||| td| ||fd fS )NzSending http request: %sZHTTP_REQUEST)methodr   	streamingurlr   zbefore-send.r<   )r=   z-Exception received when sending HTTP request.Tr\   rp   ZHTTP_RESPONSEzbefore-parse.)r   r   customized_response_dictr   ZPARSED_RESPONSE)r7   r8   history_recorderrecordro   r   r[   rq   r   r?   r@   rA   r   r&   rB   r   _sendr   r^   r"   r   copyr   Zresolved_protocolr+   Zcreate_parserparseZoutput_shapeupdater   _add_modeled_error_fields)r-   r=   r   r   r@   rE   	responsesr   er   Zhttp_response_record_dictprotocolrr   parserrm   r    r    r!   rn     s~   



zEndpoint._do_get_responsec           	      C   sT   | di  d}|d u rd S |j}||}|d u rd S |||}|| d S )NErrorZCode)r   r?   Zshape_for_error_coderw   rx   )	r-   r   rm   r   r}   Z
error_coder?   Zerror_shapeZmodeled_parser    r    r!   ry   L  s   
z"Endpoint._add_modeled_error_fieldsc           
   	   C   sf   |j j }d| d|j }| jj||| ||||d}t|}	|	d u r&dS td|	 t	
|	 dS )Nzneeds-retry.r<   )responseZendpointZ	operationrk   caught_exceptionr:   Fz3Response received to retry, sleeping for %s secondsT)r?   r@   rA   r   r&   rB   r   r7   r8   timesleep)
r-   rk   r   r:   r   r   r@   rE   rz   Zhandler_responser    r    r!   rj   ^  s(   	
zEndpoint._needs_retryc                 C   s   | j |S r$   )r,   sendrP   r    r    r!   ru   ~  s   zEndpoint._send)NNr$   )__name__
__module____qualname____doc__r1   r5   r6   r;   rG   rN   rC   rY   ra   rg   r9   ri   rn   ry   rj   ru   r    r    r    r!   r#   M   s,    



)G
 r#   c                	   @   s@   e Zd Zdd Zddeeeddddf	ddZdd Zdd	 Z	dS )
EndpointCreatorc                 C   s
   || _ d S r$   )r&   )r-   r/   r    r    r!   r1     s   
zEndpointCreator.__init__Nc              	   C   st   t |st|std| |	d u r| |}	|j}td|| |||	| |||
||d}t||| j	||dS )NzInvalid endpoint: zSetting %s timeout as %s)timeoutproxiesverifymax_pool_connectionssocket_optionsclient_certproxies_config)r.   r/   r0   r,   )
r   r   
ValueError_get_proxiesr.   r7   r8   _get_verify_valuer#   r&   )r-   r?   Zregion_nameZendpoint_urlr   r0   r   r   Zhttp_session_clsr   r   r   r   r.   r,   r    r    r!   create_endpoint  s4   

zEndpointCreator.create_endpointc                 C   s   t |S r$   )r   )r-   rq   r    r    r!   r     s   zEndpointCreator._get_proxiesc                 C   s   |d ur|S t jddS )NREQUESTS_CA_BUNDLET)osenvironr   )r-   r   r    r    r!   r     s   z!EndpointCreator._get_verify_value)
r   r   r   r1   DEFAULT_TIMEOUTMAX_POOL_CONNECTIONSr	   r   r   r   r    r    r    r!   r     s    
+r   )%rR   loggingr   r(   r   re   Zbotocorer   Zbotocore.awsrequestr   Zbotocore.compatr   Zbotocore.exceptionsr   Zbotocore.historyr   Zbotocore.hooksr   Zbotocore.httpchecksumr   Zbotocore.httpsessionr	   Zbotocore.responser
   Zbotocore.utilsr   r   r   	getLoggerr   r7   rs   r   r   r"   r#   r   r    r    r    r!   <module>   s2   
"  7