U
    ³.¬b9@  ã                   @   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-7df6wvge/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	r²d|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