o
    YZßa­5  ã                   @   sÔ   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mZmZ d dlmZ d dlmZ d dlmZ d d	lmZ e e¡Zeƒ Zd
ZdZdd„ ZG dd„ deƒZG dd„ deƒZ dS )é    N)Úcreate_request_object)ÚHTTPClientError)ÚURLLib3Session)Úis_valid_endpoint_urlÚis_valid_ipv6_endpoint_urlÚget_environ_proxies)Úfirst_non_none_response)Úget_global_history_recorder)ÚStreamingBody)Úparsersé<   é
   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 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   ú3/usr/lib/python3/dist-packages/botocore/endpoint.pyÚconvert_to_response_dict(   s"   ÿý
ù
û
ÿr    c                   @   sz   e Zd ZdZ	d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„ 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   ÚResponseParserFactoryÚ_response_parser_factoryÚhttp_sessionr   )Úselfr%   Úendpoint_prefixÚevent_emitterÚresponse_parser_factoryr+   r   r   r   Ú__init__U   s   

ÿzEndpoint.__init__c                 C   s   d| j | jf S )Nz%s(%s))r#   r%   )r,   r   r   r   Ú__repr__b   s   zEndpoint.__repr__c                 C   s   t  d||¡ |  ||¡S )Nz%Making request for %s with params: %s)ÚloggerÚdebugÚ_send_request)r,   r   Úrequest_dictr   r   r   Úmake_requeste   s   ÿzEndpoint.make_requestc                 C   s\   t |ƒ}|r't|j|jgƒ|_|jj ¡ }dj||j	d�}| j
j|||j	d� |  |¡}|S )Nz&request-created.{service_id}.{op_name})Ú
service_idÚop_name)Úrequestr   )r   Úanyr   r   Ústream_outputÚservice_modelr7   Ú	hyphenizeÚformatr   r$   ÚemitÚprepare_request)r,   Úparamsr   r9   r7   Ú
event_nameÚprepared_requestr   r   r   Úcreate_requestj   s    þþ
ÿ
zEndpoint.create_requestc                 C   s0   |  ¡ D ]\}}t|tjƒr| d¡||< qd S )Nzutf-8)ÚitemsÚ
isinstanceÚsixÚ	text_typeÚencode)r,   r   ÚkeyÚvaluer   r   r   Ú_encode_headersz   s
   €þzEndpoint._encode_headersc                 C   s   |   |j¡ | ¡ S r"   )rL   r   Úprepare©r,   r9   r   r   r   r@   €   s   zEndpoint.prepare_requestc           	      C   s¸   d}|   ||¡}|d }|  |||¡\}}|  |||||¡r>|d7 }| ¡  |   ||¡}|  |||¡\}}|  |||||¡s|d urTd|d v rT|d }||d d d< |d urZ|‚|S )Né   r   ÚResponseMetadataÚRetryAttempts)rD   Ú_get_responseÚ_needs_retryÚreset_stream)	r,   r5   r   Úattemptsr9   r   Úsuccess_responseÚ	exceptionÚtotal_retriesr   r   r   r4   „   s6   ÿ
ÿÿÿ
õÿzEndpoint._send_requestc           
      C   sv   |   ||¡\}}d d ||dœ}|d ur"|\}}||d< t||ƒ|d< |jj ¡ }	| jjd|	|jf fi |¤Ž ||fS )N)r   Úparsed_responser   rW   rY   r   zresponse-received.%s.%s)Ú_do_get_responser    r<   r7   r=   r$   r?   r   )
r,   r9   r   r   rV   rW   Úkwargs_to_emitr   rY   r7   r   r   r   rR   ¡   s.   ÿüÿÿÿþzEndpoint._get_responsec              
   C   sZ  z;t  d|¡ t d|j|j|j|j|jdœ¡ |j	j
 ¡ }d||jf }| jj||d�}t|ƒ}|d u r:|  |¡}W n2 tyQ } z
d |fW  Y d }~S d }~w tym } zt jddd� d |fW  Y d }~S d }~ww t||ƒ}| ¡ }	|j|	d	< t d
|	¡ |jd }
| j |
¡}| ||j¡}|jdkr¡|  ||||¡ t d|¡ ||fd fS )NzSending http request: %sÚHTTP_REQUEST)Úmethodr   Ú	streamingÚurlr   zbefore-send.%s.%s)r9   z-Exception received when sending HTTP request.T)Úexc_infor^   ÚHTTP_RESPONSEÚprotocolr   ÚPARSED_RESPONSE)r2   r3   Úhistory_recorderÚrecordr]   r   Úhas_streaming_inputr_   r   r<   r7   r=   r   r$   r?   r   Ú_sendr   Ú	Exceptionr    Úcopyr   Úmetadatar*   Úcreate_parserÚparseÚoutput_shaper   Ú_add_modeled_error_fields)r,   r9   r   r7   rB   Ú	responsesr   Úer   Úhttp_response_record_dictrb   ÚparserrY   r   r   r   rZ   º   sV   û
€€ÿ€ý
ÿ
ÿ
þzEndpoint._do_get_responsec           	      C   sT   |  di ¡  d¡}|d u rd S |j}| |¡}|d u rd S | ||¡}| |¡ d S )NÚErrorÚCode)r   r<   Úshape_for_error_coderl   Úupdate)	r,   r   rY   r   rr   Ú
error_coder<   Úerror_shapeÚmodeled_parser   r   r   rn   é   s   
z"Endpoint._add_modeled_error_fieldsc           
   	   C   sb   |j j ¡ }d||jf }| jj||| ||||d�}t|ƒ}	|	d u r$dS t d|	¡ t	 
|	¡ dS )Nzneeds-retry.%s.%s)ÚresponseÚendpointÚ	operationrU   Úcaught_exceptionr5   Fz3Response received to retry, sleeping for %s secondsT)r<   r7   r=   r   r$   r?   r   r2   r3   ÚtimeÚsleep)
r,   rU   r   r5   rz   r}   r7   rB   ro   Úhandler_responser   r   r   rS   ø   s$   þýÿ
zEndpoint._needs_retryc                 C   s   | j  |¡S r"   )r+   ÚsendrN   r   r   r   rg     s   zEndpoint._send)NNr"   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r0   r1   r6   rD   rL   r@   r4   rR   rZ   rn   rS   rg   r   r   r   r   r!   K   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 u 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-   r2   r3   Ú_get_verify_valuer!   r$   )r,   r<   Úregion_nameÚendpoint_urlr‰   r/   r‡   rŠ   Úhttp_session_clsrˆ   r‹   rŒ   r�   r-   r+   r   r   r   Úcreate_endpoint  s2   ÿþ
ù
ûzEndpointCreator.create_endpointc                 C   s   t |ƒS r"   )r   )r,   r_   r   r   r   r�   9  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„   r0   ÚDEFAULT_TIMEOUTÚMAX_POOL_CONNECTIONSr   r”   r�   r�   r   r   r   r   r†     s    
û$r†   )!r–   Úloggingr~   r&   rG   Úbotocore.awsrequestr   Úbotocore.exceptionsr   Úbotocore.httpsessionr   Úbotocore.utilsr   r   r   Úbotocore.hooksr   Úbotocore.historyr	   Úbotocore.responser
   Úbotocorer   Ú	getLoggerr‚   r2   rd   r˜   r™   r    Úobjectr!   r†   r   r   r   r   Ú<module>   s*   
# G