U
    M8c9@                     @   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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)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   st   | j | jd|jid}|d dkr.| j|d< nB|jr@| j|d< n0|jrf|d d}t| j||d< n
| j|d< |S )a  Convert an HTTP response object to a request dict.

    This converts the requests library's HTTP response object to
    a dictionary.

    :type http_response: botocore.vendored.requests.model.Response
    :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   5/tmp/pip-unpacked-wheel-ozje0y8b/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   sN   || _ || _|| _t | _|d kr,t }|| _|| _	| j	d krJt
 | _	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+   closer3   r   r   r    r5   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 |}|rNt|j|jg|_|jj }dj||j	d}| j
j|||j	d | |}|S )Nz&request-created.{service_id}.{op_name})
service_idZop_name)requestr   )r   anyr   r   Zstream_outputservice_modelr;   	hyphenizeformatr   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#   )rM   r   preparer,   r<   r   r   r    rB      s    zEndpoint.prepare_requestc                 C   s>   t j  }t j |d}|| }|t j|d | }|dS )Nz%a, %d %b %Y %H:%M:%S %Z)secondsz%Y%m%dT%H%M%SZ)datetimeutcnow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   sj   |d j d}|d}|rf|sfz tj }| ||||d< W n" tk
rd   tjddd Y nX d S )Nr   Datehas_streaming_inputrX   z9Exception received when updating retries context with TTLTexc_info)r   r   rQ   rR   rY   	Exceptionr6   r7   )r,   retries_contextrW   success_responseZresponse_date_headerr[   rV   r   r   r    _set_ttl   s    

zEndpoint._set_ttlc                 C   sL   | di }||d< d|kr,tt |d< |rH|d j}| ||| d S )Nretriesattemptzinvocation-idZclient_config)
setdefaultrI   uuidZuuid4rW   ra   )r,   r   rc   r`   r_   rW   r   r   r    _update_retries_context   s    
z Endpoint._update_retries_contextc           	      C   s   d}|d }|  || | ||}| |||\}}| |||||r|d7 }|  ||| |  | ||}| |||\}}q6|d k	rd|d kr|d }||d d d< |d k	r|n|S d S )N   r   ZResponseMetadataZRetryAttempts)rf   rF   _get_response_needs_retryZreset_stream)	r,   r9   r   attemptsr   r<   r`   	exceptionZtotal_retriesr   r   r    r8      sJ        


zEndpoint._send_requestc           
      C   sx   |  |||\}}d d ||d}|d k	rF|\}}||d< t|||d< |jj }	| jjd|	 d|j f| ||fS )N)r   parsed_responser   rk   rl   r   zresponse-received..)_do_get_responser!   r>   r;   r?   r%   rA   r   )
r,   r<   r   r   r`   rk   Zkwargs_to_emitr   rl   r;   r   r   r    rh      s0       zEndpoint._get_responsec              
   C   sr  zzt d| td|j|j|j|j|jd |j	j
 }d| d|j }| jj||d}t|}|d krx| |}W nh tk
r } zd |f W Y S d }~X Y n< tk
r } zt jddd	 d |f W Y S d }~X Y nX t||}	t||	|| |	 }
|j|
d
< td|
 |jd }| j|}||	|j}|jdkrZ| |	||| td| ||fd fS )NzSending http request: %sZHTTP_REQUEST)methodr   	streamingurlr   zbefore-send.rm   )r<   z-Exception received when sending HTTP request.Tr\   rp   ZHTTP_RESPONSEprotocolr   ZPARSED_RESPONSE)r6   r7   history_recorderrecordro   r   r[   rq   r   r>   r;   r?   r   r%   rA   r   _sendr   r^   r!   r   copyr   metadatar*   create_parserparseZoutput_shaper   _add_modeled_error_fields)r,   r<   r   r   r;   rD   	responsesr   er   Zhttp_response_record_dictrr   parserrl   r   r   r    rn     sp    
  
 zEndpoint._do_get_responsec           	      C   sT   | di  d}|d krd S |j}||}|d kr:d S |||}|| d S )NErrorZCode)r   r>   Zshape_for_error_codery   update)	r,   r   rl   r   r}   Z
error_coder>   Zerror_shapeZmodeled_parser   r   r    rz   F  s    
z"Endpoint._add_modeled_error_fieldsc           
   	   C   sj   |j j }d| d|j }| jj||| ||||d}t|}	|	d krLdS td|	 t	
|	 dS d S )Nzneeds-retry.rm   )responseZendpointZ	operationrj   caught_exceptionr9   Fz3Response received to retry, sleeping for %s secondsT)r>   r;   r?   r   r%   rA   r   r6   r7   timesleep)
r,   rj   r   r9   r   r   r;   rD   r{   Zhandler_responser   r   r    ri   X  s(    	
zEndpoint._needs_retryc                 C   s   | j |S r#   )r+   sendrO   r   r   r    ru   x  s    zEndpoint._send)NN)N)N)NN)__name__
__module____qualname____doc__r0   r4   r5   r:   rF   rM   rB   rY   ra   rf   r8   rh   rn   rz   ri   ru   r   r   r   r    r"   M   s*     



)?  
 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    r0   }  s    zEndpointCreator.__init__Nc              	   C   sr   t |st|std| |	d kr.| |}	|j}td|| |||	| |||
||d}t||| j	||dS )NzInvalid endpoint: %szSetting %s timeout as %s)timeoutproxiesverifymax_pool_connectionssocket_optionsclient_certproxies_config)r-   r.   r/   r+   )
r   r   
ValueError_get_proxiesr-   r6   r7   _get_verify_valuer"   r%   )r,   r>   Zregion_nameZendpoint_urlr   r/   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 k	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   r0   DEFAULT_TIMEOUTMAX_POOL_CONNECTIONSr   r   r   r   r   r   r   r    r   |  s   
+r   )#rQ   loggingr   r'   r   re   Zbotocorer   Zbotocore.awsrequestr   Zbotocore.exceptionsr   Zbotocore.historyr   Zbotocore.hooksr   Zbotocore.httpchecksumr   Zbotocore.httpsessionr   Zbotocore.responser	   Zbotocore.utilsr
   r   r   	getLoggerr   r6   rs   r   r   r!   r"   r   r   r   r   r    <module>   s.   
#  1