U
    EZh                     @   s  d 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Zddl	Z	ddl
mZmZ ddlmZmZ ddlmZmZmZmZmZmZ eeZeZG dd dZdd	 Zd
d ZG dd deZG dd dZ G dd de Z!G dd de!Z"G dd de"Z#G dd de Z$G dd de Z%G dd de Z&G dd de&e$Z'G dd de&e!Z(G d d! d!e&e%Z)G d"d# d#e$Z*G d$d% d%e Z+G d&d' d'e Z,G d(d) d)e+e$Z-G d*d+ d+e,e%Z.G d,d- d-e+e!Z/e#e"e*e-e/e.d.Z0dS )/a  Response parsers for the various protocol types.

The module contains classes that can take an HTTP response, and given
an output shape, parse the response into a dict according to the
rules in the output shape.

There are many similarities amongst the different protocols with regard
to response parsing, and the code is structured in a way to avoid
code duplication when possible.  The diagram below is a diagram
showing the inheritance hierarchy of the response classes.

::


                                +-------------------+
                                |   ResponseParser  |
                                +-------------------+
                                ^    ^    ^   ^   ^
                                |    |    |   |   |
                                |    |    |   |   +--------------------------------------------+
                                |    |    |   +-----------------------------+                  |
                                |    |    |                                 |                  |
           +--------------------+    |    +----------------+                |                  |
           |                         |                     |                |                  |
+----------+----------+       +------+-------+     +-------+------+  +------+-------+   +------+--------+
|BaseXMLResponseParser|       |BaseRestParser|     |BaseJSONParser|  |BaseCBORParser|   |BaseRpcV2Parser|
+---------------------+       +--------------+     +--------------+  +----------+---+   +-+-------------+
          ^         ^          ^           ^        ^        ^                  ^         ^
          |         |          |           |        |        |                  |         |
          |         |          |           |        |        |                  |         |
          |        ++----------+-+       +-+--------+---+    |              +---+---------+-+
          |        |RestXMLParser|       |RestJSONParser|    |              |RpcV2CBORParser|
    +-----+-----+  +-------------+       +--------------+    |              +---+---------+-+
    |QueryParser|                                            |
    +-----------+                                       +----+-----+
                                                        |JSONParser|
                                                        +----------+

The diagram above shows that there is a base class, ``ResponseParser`` that
contains logic that is similar amongst all the different protocols (``query``,
``json``, ``rest-json``, ``rest-xml``, ``smithy-rpc-v2-cbor``).  Amongst the various services
there is shared logic that can be grouped several ways:

* The ``query`` and ``rest-xml`` both have XML bodies that are parsed in the
  same way.
* The ``json`` and ``rest-json`` protocols both have JSON bodies that are
  parsed in the same way.
* The ``rest-json`` and ``rest-xml`` protocols have additional attributes
  besides body parameters that are parsed the same (headers, query string,
  status code).

This is reflected in the class diagram above.  The ``BaseXMLResponseParser``
and the BaseJSONParser contain logic for parsing the XML/JSON body,
and the BaseRestParser contains logic for parsing out attributes that
come from other parts of the HTTP response.  Classes like the
``RestXMLParser`` inherit from the ``BaseXMLResponseParser`` to get the
XML body parsing logic and the ``BaseRestParser`` to get the HTTP
header/status code/query string parsing.

Additionally, there are event stream parsers that are used by the other parsers
to wrap streaming bodies that represent a stream of events. The
BaseEventStreamParser extends from ResponseParser and defines the logic for
parsing values from the headers and payload of a message from the underlying
binary encoding protocol. Currently, event streams support parsing bodies
encoded as JSON and XML through the following hierarchy.


                                  +--------------+
                                  |ResponseParser|
                                  +--------------+
                                    ^    ^    ^
               +--------------------+    |    +------------------+
               |                         |                       |
    +----------+----------+   +----------+----------+    +-------+------+
    |BaseXMLResponseParser|   |BaseEventStreamParser|    |BaseJSONParser|
    +---------------------+   +---------------------+    +--------------+
                     ^                ^        ^                 ^
                     |                |        |                 |
                     |                |        |                 |
                   +-+----------------+-+    +-+-----------------+-+
                   |EventStreamXMLParser|    |EventStreamJSONParser|
                   +--------------------+    +---------------------+

Return Values
=============

Each call to ``parse()`` returns a dict has this form::

    Standard Response

    {
      "ResponseMetadata": {"RequestId": <requestid>}
      <response keys>
    }

    Error response

    {
      "ResponseMetadata": {"RequestId": <requestid>}
      "Error": {
        "Code": <string>,
        "Message": <string>,
        "Type": <string>,
        <additional keys>
      }
    }

    N)ETreeXMLParseError)EventStreamNoInitialResponseError)CachedPropertyensure_booleanis_json_value_headerlowercase_dictmerge_dictsparse_timestampc                   @   s$   e Zd Zdd Zdd Zdd ZdS )ResponseParserFactoryc                 C   s
   i | _ d S N)	_defaultsself r   W/home/aprabhat/apps/x.techxrdev.in/venv/lib/python3.8/site-packages/botocore/parsers.py__init__   s    zResponseParserFactory.__init__c                 K   s   | j | dS )aO  Set default arguments when a parser instance is created.

        You can specify any kwargs that are allowed by a ResponseParser
        class.  There are currently two arguments:

            * timestamp_parser - A callable that can parse a timestamp string
            * blob_parser - A callable that can parse a blob type

        N)r   update)r   kwargsr   r   r   set_parser_defaults   s    
z)ResponseParserFactory.set_parser_defaultsc                 C   s   t | }|f | jS r   )PROTOCOL_PARSERSr   )r   Zprotocol_nameZ
parser_clsr   r   r   create_parser   s    z#ResponseParserFactory.create_parserN)__name__
__module____qualname__r   r   r   r   r   r   r   r      s   r   c                 C   s   t  | S r   )r   r   )protocolr   r   r   r      s    r   c                    s    fdd}|S )Nc                    s.   t |dr|j}|d kr"d}n|} | ||S )Ntext )hasattrr   )r   shapenode_or_stringr   funcr   r   _get_text_content   s    
z(_text_content.<locals>._get_text_contentr   )r#   r$   r   r"   r   _text_content   s    r%   c                   @   s   e Zd ZdS )ResponseParserErrorN)r   r   r   r   r   r   r   r&      s   r&   c                   @   s   e Zd ZdZdZ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 Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' ZdS ))ResponseParserao  Base class for response parsing.

    This class represents the interface that all ResponseParsers for the
    various protocols must implement.

    This class will take an HTTP response and a model shape and parse the
    HTTP response into a dictionary.

    There is a single public method exposed: ``parse``.  See the ``parse``
    docstring for more info.

    utf-8Nc                 C   sH   |d krt }|| _|d kr | j}|| _d | _| jd k	rD| ||| _d S r   )DEFAULT_TIMESTAMP_PARSER_timestamp_parser_default_blob_parser_blob_parser_event_stream_parserEVENT_STREAM_PARSER_CLSr   Ztimestamp_parserZblob_parserr   r   r   r      s    
 zResponseParser.__init__c                 C   s
   t |S r   )base64	b64decoder   valuer   r   r   r+      s    z#ResponseParser._default_blob_parserc                 C   s   t d|d  t d|d  |d dkrj| |rB| |}qv| |r\| ||}|S | ||}n| ||}|r|j	dr|S t
|tr|	di }|d |d	< |d }t||d
< ||d< | || |S )a>  Parse the HTTP response given a shape.

        :param response: The HTTP response dictionary.  This is a dictionary
            that represents the HTTP request.  The dictionary must have the
            following keys, ``body``, ``headers``, and ``status_code``.

        :param shape: The model shape describing the expected output.
        :return: Returns a dictionary representing the parsed response
            described by the model.  In addition to the shape described from
            the model, each response will also have a ``ResponseMetadata``
            which contains metadata about the response, which contains at least
            two keys containing ``RequestId`` and ``HTTPStatusCode``.  Some
            responses may populate additional keys, but ``RequestId`` will
            always be present.

        zResponse headers: %rheaderszResponse body:
%rbodystatus_codei-  eventstreamResponseMetadataZHTTPStatusCodeZHTTPHeaders)LOGdebug_is_generic_error_response_do_generic_error_parse_is_modeled_error_shape_do_modeled_error_parse_do_error_parse	_do_parseserializationget
isinstancedictr	   _add_checksum_response_metadata)r   responser    parsedresponse_metadatar4   r   r   r   parse   s(    


zResponseParser.parsec                 C   s.   | di  di }| d}|r*||d< d S )NcontextZchecksumZresponse_algorithmZChecksumAlgorithmrB   )r   rF   rH   Zchecksum_context	algorithmr   r   r   rE     s    
z.ResponseParser._add_checksum_response_metadatac                 C   s   |d k	o|j ddS )N	exceptionF)metadatarB   )r   r    r   r   r   r=      s    z&ResponseParser._is_modeled_error_shapec                 C   sD   |d dkr@d|ks |d d kr$dS |d   }|dp>| S d S )Nr6   i  r5   Ts   <html>)strip
startswith)r   rF   r5   r   r   r   r;   #  s
    z)ResponseParser._is_generic_error_responsec                 C   s2   t d t|d tjj|d ddi dS )NzlReceived a non protocol specific error response from the service, unable to populate error code and message.r6   r   CodeMessageErrorr8   )r9   r:   strhttpclient	responsesrB   r   rF   r   r   r   r<   6  s    
 z&ResponseParser._do_generic_error_parsec                 C   s   t | jj dd S )Nz
._do_parseNotImplementedError	__class__r   r   rF   r    r   r   r   r@   G  s    zResponseParser._do_parsec                 C   s   t | jj dd S )Nz._do_error_parser[   r^   r   r   r   r?   J  s    zResponseParser._do_error_parsec                 C   s   t | jj dd S )Nz._do_modeled_error_parser[   )r   rF   r    rG   r   r   r   r>   M  s    z&ResponseParser._do_modeled_error_parsec                 C   s    t | d|j | j}|||S )NZ_handle_)getattr	type_name_default_handle)r   r    nodehandlerr   r   r   _parse_shapeR  s     
 zResponseParser._parse_shapec                 C   s*   g }|j }|D ]}|| || q|S r   )memberappendrd   )r   r    rb   rG   member_shapeitemr   r   r   _handle_listX  s
    zResponseParser._handle_listc                 C   s   |S r   r   r   r    r3   r   r   r   ra   a  s    zResponseParser._default_handlec                 C   s&   | j }|d d}t|d |||S )NrJ   Zoperation_namer5   )r-   rB   r   )r   rF   r    parsernamer   r   r   _create_event_streamd  s    z#ResponseParser._create_event_streamc                 C   s   t |d S Nr   )listr2   r   r   r   _get_first_keyi  s    zResponseParser._get_first_keyc                    s    j r| }|dd  dd | D }t|dkrJd}t| j | |} fdd jD }||krd}t	
||  d	S d
S )N__typec                 S   s   i | ]\}}|d k	r||qS r   r   .0kvr   r   r   
<dictcomp>p  s      zCResponseParser._has_unknown_tagged_union_member.<locals>.<dictcomp>   CInvalid service response: %s must have one and only one member set.c                    s    g | ]} j | jd |qS )rl   )membersrA   rB   )rs   re   r    r   r   
<listcomp>z  s   zCResponseParser._has_unknown_tagged_union_member.<locals>.<listcomp>zqReceived a tagged union response with member unknown to client: %s. Please upgrade SDK for full response support.TF)is_tagged_unioncopypopitemslenr&   rl   rp   ry   r9   info)r   r    r3   cleaned_value	error_msgtagZserialized_member_namesmsgr   rz   r    _has_unknown_tagged_union_memberl  s(    

z/ResponseParser._has_unknown_tagged_union_memberc                 C   s   dd|iiS )NZSDK_UNKNOWN_MEMBERrl   r   )r   r   r   r   r   #_handle_unknown_tagged_union_member  s    z2ResponseParser._handle_unknown_tagged_union_memberc                 C   sN   |d }| d}t|dkrJ|d rJ||d d< |d |d d< |d S |S )	z
        Error response may contain an x-amzn-query-error header to translate
        errors codes from former `query` services into other protocols. We use this
        to do our lookup in the errorfactory for modeled errors.
        x-amzn-query-error;   r   rU   ZQueryErrorCoderw   Type)splitr   )r   coder4   errorZquery_errorZquery_error_componentsr   r   r    _do_query_compatible_error_parse  s    
z/ResponseParser._do_query_compatible_error_parse)NN)r   r   r   __doc__DEFAULT_ENCODINGr.   r   r+   rI   rE   r=   r;   r<   r@   r?   r>   rd   ri   ra   rm   rp   r   r   r   r   r   r   r   r'      s*   
1	r'   c                       s   e Zd Zd" fdd	Zdd Zdd Z fdd	Zd
d Zdd Zdd Z	dd Z
dd Zdd Zedd Zedd Zedd Zedd Zedd Zed d! ZeZeZeZ  ZS )#BaseXMLResponseParserNc                    s   t  || td| _d S )Nz{.*})superr   recompile_namespace_rer/   r]   r   r   r     s    zBaseXMLResponseParser.__init__c                 C   s   i }|j }|j}|jdpd}|jdp.d}|jdrLt|tsL|g}|D ]Z}|D ]H}	| |	}
|
|kr|| ||	}qX|
|kr| ||	}qXtd|
 qX|||< qP|S )Nrl   keyr3   	flattenedzUnknown tag: )	r   r3   rA   rB   rC   ro   	_node_tagrd   r&   )r   r    rb   rG   	key_shapevalue_shapeZkey_location_nameZvalue_location_nameZkeyval_nodeZsingle_pairZtag_nameZkey_nameZval_namer   r   r   _handle_map  s"    

z!BaseXMLResponseParser._handle_mapc                 C   s   | j d|jS Nr   )r   subr   )r   rb   r   r   r   r     s    zBaseXMLResponseParser._node_tagc                    s*   |j drt|ts|g}t ||S )Nr   )rA   rB   rC   ro   r   ri   )r   r    rb   r   r   r   ri     s    z"BaseXMLResponseParser._handle_listc                 C   s  i }|j }|jddr"| |}| |}| ||rL| |}| |S |D ]}|| }d|jksP|jdrtqP| 	||}	||	}
|
d k	r| 
||
||< qP|jdrPi }|jd }|j D ],\}}| j|dd d |}|||< q||krP|| ||< qP|S )	NrM   FlocationeventheaderZxmlAttributerl   :r   )ry   rN   rB   _get_error_root_build_name_to_xml_noder   rp   r   rA   _member_key_namerd   Zattribr   r   r   r   )r   r    rb   rG   ry   xml_dictr   member_namerg   Zxml_namemember_nodeattribsZlocation_namer   r3   Znew_keyr   r   r   _handle_structure  sD    





 

 
z'BaseXMLResponseParser._handle_structurec                 C   s2   |  |dkr.|D ]}|  |dkr|  S q|S )NZErrorResponserU   r   )r   original_rootchildr   r   r   r     s
    
z%BaseXMLResponseParser._get_error_rootc                 C   sL   |j dkr0|jdr0|jjd}|d k	r0|S |jd}|d k	rH|S |S )Nro   r   rl   )r`   rA   rB   re   )r   r    r   Zlist_member_serialized_nameZserialized_namer   r   r   r     s    z&BaseXMLResponseParser._member_key_namec                 C   st   t |tr| |d S i }|D ]N}| |}||krft || trT|| | qn|| |g||< q |||< q |S rn   )rC   ro   r   r   rf   )r   Zparent_noder   rh   r   r   r   r   r     s    


z-BaseXMLResponseParser._build_name_to_xml_nodec              
   C   sf   z*t jt  | jd}|| | }W n6 tk
r` } ztd| d| W 5 d }~X Y nX |S )N)targetencodingzUnable to parse response (z6), invalid XML received. Further retries may succeed:
)r   Z	XMLParserZTreeBuilderr   feedcloser   r&   )r   
xml_stringrk   rooter   r   r   _parse_xml_string_to_dom  s     
z.BaseXMLResponseParser._parse_xml_string_to_domc                 C   sB   |  D ]4\}}t|r2| |}| |||< q|j||< q|S r   )r   ro   r   _replace_nodesr   )r   rG   r   r3   Zsub_dictr   r   r   r   "  s    
z$BaseXMLResponseParser._replace_nodesc                 C   s   |dkrdS dS d S )NtrueTFr   r   r    r   r   r   r   _handle_boolean+  s    z%BaseXMLResponseParser._handle_booleanc                 C   s   t |S r   floatr   r   r   r   _handle_float2  s    z#BaseXMLResponseParser._handle_floatc                 C   s
   |  |S r   r*   r   r   r   r   _handle_timestamp6  s    z'BaseXMLResponseParser._handle_timestampc                 C   s   t |S r   intr   r   r   r   _handle_integer:  s    z%BaseXMLResponseParser._handle_integerc                 C   s   |S r   r   r   r   r   r   _handle_string>  s    z$BaseXMLResponseParser._handle_stringc                 C   s
   |  |S r   r,   r   r   r   r   _handle_blobB  s    z"BaseXMLResponseParser._handle_blob)NN)r   r   r   r   r   r   ri   r   r   r   r   r   r   r%   r   r   r   r   r   r   Z_handle_character_handle_double_handle_long__classcell__r   r   r   r   r     s2   
$	





r   c                   @   s>   e Zd Zdd Zdd Zdd Zddd	Zd
d Zdd ZdS )QueryParserc                 C   s\   |d }|  |}| |}| | d|kr>||d d|krXd|di|d< |S )Nr5   Errors	RequestIdr8   )r   r   r   r   r~   )r   rF   r    xml_contentsr   rG   r   r   r   r?   L  s    


zQueryParser._do_error_parsec                 C   s   | j ||ddS )NFinject_metadata_parse_body_as_xmlr^   r   r   r   r>   \  s    z#QueryParser._do_modeled_error_parsec                 C   s   | j ||ddS )NTr   r   r^   r   r   r   r@   _  s    zQueryParser._do_parseTc                 C   s^   |d }|  |}i }|d k	rJ|}d|jkr>| |jd |}| ||}|rZ| || |S )Nr5   ZresultWrapper)r   rA   _find_result_wrapped_shaperd   _inject_response_metadata)r   rF   r    r   r   r   rG   startr   r   r   r   b  s    

 zQueryParser._parse_body_as_xmlc                 C   s   |  |}|| S r   )r   )r   Zelement_nameZxml_root_nodemappingr   r   r   r   q  s    
z&QueryParser._find_result_wrapped_shapec                 C   sN   |  |}|d}|d k	rJ|  |}| D ]\}}|j||< q.||d< d S Nr8   )r   rB   r   r   )r   rb   inject_intor   
child_nodeZsub_mappingr   r3   r   r   r   r   u  s    


z%QueryParser._inject_response_metadataN)T)	r   r   r   r?   r>   r@   r   r   r   r   r   r   r   r   K  s   
r   c                       s,   e Zd Zdd Z fddZdd Z  ZS )EC2QueryParserc                 C   s.   |  |}|d}|d k	r*d|ji|d< d S )NZ	requestIdr   r8   )r   rB   r   )r   rb   r   r   r   r   r   r   r     s    

z(EC2QueryParser._inject_response_metadatac                    s,   t  ||}d|kr(d|di|d< |S )NZ	RequestIDr   r8   )r   r?   r~   )r   rF   r    originalr   r   r   r?     s     zEC2QueryParser._do_error_parsec                 C   s@   |D ]6}|  |dkr|D ]}|  |dkr|    S qq|S )Nr   rU   r   )r   r   r   Zerrors_childr   r   r   r     s    zEC2QueryParser._get_error_root)r   r   r   r   r?   r   r   r   r   r   r   r     s   r   c                   @   sD   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dS )BaseJSONParserc           
      C   s   i }|j r|}n||j}|d kr"d S i }| ||rF| |}| |S |D ]@}|| }|jd|}||}	|	d k	rJ| || |	||< qJ|S )Nrl   )Zis_document_typery   r   rp   r   rA   rB   rd   )
r   r    r3   final_parsedmember_shapesr   r   rg   	json_name	raw_valuer   r   r   r     s(    


 
z BaseJSONParser._handle_structurec           	      C   sF   i }|j }|j}| D ](\}}| ||}| ||}|||< q|S r   )r   r3   r   rd   )	r   r    r3   rG   r   r   r   Z
actual_keyZactual_valuer   r   r   r     s    
zBaseJSONParser._handle_mapc                 C   s
   |  |S r   r   rj   r   r   r   r     s    zBaseJSONParser._handle_blobc                 C   s
   |  |S r   r   rj   r   r   r   r     s    z BaseJSONParser._handle_timestampc                 C   s   |  |d }dddi d}|d }|d|dd|d d< |d	}|d
|o\t|}|d k	rd|kr|ddd }d|kr|ddd }d|kr| |||}||d d< | ||d  |S )Nr5   r   rS   rR   rT   r4   messagerS   rU   r6   rq   r   rw   r   #r   rR   )_parse_body_as_jsonrB   rV   r   rsplitr   r   )r   rF   r    r5   r   r4   response_coder   r   r   r   r?     s.    	 

  zBaseJSONParser._do_error_parsec                 C   s    d|kr|d | di d< d S )Nx-amzn-requestidr8   r   )
setdefault)r   rG   r4   r   r   r   r     s    z(BaseJSONParser._inject_response_metadatac                 C   sF   |si S | | j}zt|}|W S  tk
r@   d|i Y S X d S )Nr   )decoder   jsonloads
ValueError)r   body_contentsr5   original_parsedr   r   r   r     s    
z"BaseJSONParser._parse_body_as_jsonN)
r   r   r   r   r   r   r   r?   r   r   r   r   r   r   r     s   
$r   c                   @   s   e Zd ZdZdZedd Zdd Zdd Zd	d
 Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#S )$BaseCBORParser      c              	   C   s&   | j | j| j| j| j| j| j| jdS )N)r   rw   r                  )_parse_unsigned_integer_parse_negative_integer_parse_byte_string_parse_text_string_parse_array
_parse_map
_parse_tag_parse_simple_and_floatr   r   r   r    major_type_to_parsing_method_map  s    z/BaseCBORParser.major_type_to_parsing_method_mapc                 C   s   t t |S r   )ioBufferedReaderBytesIO)r   bytesr   r   r   get_peekable_stream_from_bytes  s    z-BaseCBORParser.get_peekable_stream_from_bytesc                 C   sR   |  |d}|d? }|d@ }|| jkr:| j| }|||S td| d| d S )Nrw   r   r   z8Unsupported inital byte found for data item- Major type:z, Additional info: )_read_bytes_as_intr   r&   )r   streaminitial_byteZ
major_typeadditional_infomethodr   r   r   parse_data_item  s    


zBaseCBORParser.parse_data_itemc                 C   sH   ddddd}|dk r|S ||kr6|| }|  ||S td| d S )Nrw   r   r      )            r	  zhInvalid CBOR integer returned from the service; unparsable additional info found for major type 0 or 1: )r  r&   )r   r  r  Zadditional_info_to_num_bytes	num_bytesr   r   r   r   -  s    z&BaseCBORParser._parse_unsigned_integerc                 C   s   d|  || S )N)r   r   r  r  r   r   r   r   B  s    z&BaseCBORParser._parse_negative_integerc                 C   st   || j kr"| ||}| ||S g }| |r2qf| |d}|d@ }| ||}|| || q&d|S d S )Nrw   r       )INDEFINITE_ITEM_ADDITIONAL_INFOr   _read_from_stream_handle_break_coder  rf   join)r   r  r  lengthchunksr  r   r   r   r   F  s    

z!BaseCBORParser._parse_byte_stringc                 C   s   |  ||dS )Nr(   )r   r   r  r   r   r   r   V  s    z!BaseCBORParser._parse_text_stringc                    sV   | j kr. |} fddt|D S g } sN|  q2|S d S )Nc                    s   g | ]}  qS r   r  )rs   _r   r  r   r   r{   ]  s     z/BaseCBORParser._parse_array.<locals>.<listcomp>)r  r   ranger  rf   r  )r   r  r  r  r   r   r  r   r   Z  s    

zBaseCBORParser._parse_arrayc                 C   sX   i }|| j kr8| ||}t|D ]}| || q"|S | |sP| || q8|S d S r   )r  r   r  _parse_key_value_pairr  )r   r  r  r   r  r  r   r   r   r   e  s    

zBaseCBORParser._parse_mapc                 C   s(   |  |}|  |}|d k	r$|||< d S r   r  )r   r  r   r   r3   r   r   r   r  r  s    

z$BaseCBORParser._parse_key_value_pairc                 C   s:   |  ||}| |}|dkr(| |S td| d S )Nrw   z*Found CBOR tag not supported by botocore: )r   r  _parse_datetimer&   )r   r  r  r   r3   r   r   r   r   z  s    

zBaseCBORParser._parse_tagc                 C   s*   t |ttfr| |S td| d S )Nz Unable to parse datetime value: )rC   r   r   r*   r&   r2   r   r   r   r    s
    
zBaseCBORParser._parse_datetimec                 C   sj   ddd d d}||kr|| S dddd}||krV|| \}}t || ||d S td	| d
d S )NFT)            )z>er   )z>fr   )z>dr  )r
  r  r  r   z0Invalid additional info found for major type 7: zI.  This indicates an unsupported simple type or an indefinite float value)structunpackr  r&   )r   r  r  Zadditional_info_simple_valuesZfloat_formatsZfloat_formatr  r   r   r   r     s,     

z&BaseCBORParser._parse_simple_and_floatc                 C   s6   t |dd d d| jkr2|dtj dS d S )Nrw   bigT)r   
from_bytespeek
BREAK_CODEseekosSEEK_CURr  r   r   r   r    s     z!BaseCBORParser._handle_break_codec                 C   s   |  ||}t|dS )Nr#  )r  r   r$  )r   r  r  byter   r   r   r    s    z!BaseCBORParser._read_bytes_as_intc                 C   s"   | |}t||krtd|S )NzgEnd of stream reached; this indicates a malformed CBOR response from the server or an issue in botocore)readr   r&   )r   r  r  r3   r   r   r   r    s    
z BaseCBORParser._read_from_streamN)r   r   r   r  r&  r   r   r  r  r   r   r   r   r   r   r  r   r  r   r  r  r  r   r   r   r   r     s&   

"r   c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )BaseEventStreamParserc                 C   sh   i }|j dr@|d d}|j|}|rd| ||||< n$| |||j| | |||j| |S )Nr7   r4   z:event-type)rA   rB   ry   r@   _parse_non_payload_attrs_parse_payload)r   rF   r    r   Z
event_typeZevent_shaper   r   r   r@     s"     
   zBaseEventStreamParser._do_parsec              	   C   s   |d  d}|j |}|d k	r\| |d }| ||}d|| d| dddi}n&d|d  d	d|d  d
ddi}|S )Nr4   z:exception-typer5   rU   rS   r   r   rQ   z:error-codez:error-message)rB   ry   _initial_body_parserd   )r   rF   r    Zexception_typeZexception_shaper   r5   r   r   r   r   r?     s     z%BaseEventStreamParser._do_error_parsec                 C   s   |j dr|D ]l}|| }|j dr|d }|jdkr@|}n.|jdkrX|| j}n| |}	| ||	}|||<  d S q| |d }
| ||
}|| d S )NeventZeventpayloadr5   blobstring)rA   rB   r`   r   r   r/  rd   r   )r   rF   r    r   r   rl   rg   r5   Zparsed_bodyZ	raw_parser   body_parsedr   r   r   r.    s&    


 z$BaseEventStreamParser._parse_payloadc           	      C   sZ   |d }|D ]H}|| }|j dr||kr|| }|jdkrL| |d }|||< qd S )Nr4   r   	timestampg     @@)rA   rB   r`   r*   )	r   rF   r    r   r   r4   rl   rg   r3   r   r   r   r-    s    
z.BaseEventStreamParser._parse_non_payload_attrsc                 C   s   t dd S Nr/  r\   r   r   r   r   r   r/    s    z)BaseEventStreamParser._initial_body_parseN)r   r   r   r@   r?   r.  r-  r/  r   r   r   r   r,    s
   r,  c                   @   s   e Zd Zdd ZdS )EventStreamJSONParserc                 C   s
   |  |S r   r   r7  r   r   r   r/    s    z)EventStreamJSONParser._initial_body_parseNr   r   r   r/  r   r   r   r   r8    s   r8  c                   @   s   e Zd Zdd ZdS )EventStreamXMLParserc                 C   s   |st dS | |S r   r   ZElementr   r   r   r   r   r   r/    s    
z(EventStreamXMLParser._initial_body_parseNr:  r   r   r   r   r;    s   r;  c                   @   s   e Zd Zdd ZdS )EventStreamCBORParserc                 C   s   |dkri S |  | |S Nr  )r  r  r7  r   r   r   r/  %  s
    z)EventStreamCBORParser._initial_body_parseNr:  r   r   r   r   r>  $  s   r>  c                   @   s0   e Zd ZeZdd Zdd Zdd Zdd Zd	S )

JSONParserc                 C   sJ   i }|d k	r6|j }|r&| |||}n| |d |}| ||d  |S )Nr5   r4   )event_stream_name_handle_event_stream_handle_json_bodyr   )r   rF   r    rG   
event_namer   r   r   r@   2  s    zJSONParser._do_parsec                 C   s   |  |d |S Nr5   )rC  r^   r   r   r   r>   =  s    z"JSONParser._do_modeled_error_parsec           	      C   s^   |j | }| ||}z| }W n  tk
rB   d}t|Y nX | |j|}|||< |S Nz,First event was not of type initial-response)ry   rm   get_initial_responser   r&   rC  payload	r   rF   r    rD  Zevent_stream_shapeZevent_streamr0  r   rG   r   r   r   rB  @  s    
zJSONParser._handle_event_streamc                 C   s   |  |}| ||S r   )r   rd   )r   Zraw_bodyr    Zparsed_jsonr   r   r   rC  L  s    
zJSONParser._handle_json_bodyN)	r   r   r   r8  r.   r@   r>   rB  rC  r   r   r   r   r@  -  s
   r@  c                       sd   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Z fddZ  ZS )BaseRestParserc                 C   s$   i }|  ||d< | ||| |S r   )_populate_response_metadata_add_modeled_parser   rF   r    r   r   r   r   r@   U  s    zBaseRestParser._do_parsec                 C   s6   |d kr|S |j }| |||| | |||| d S r   )ry   r-  r.  )r   rF   r    r   r   r   r   r   rL  ]  s       z!BaseRestParser._add_modeled_parsec                 C   s   i }|  ||| |S r   rL  rM  r   r   r   r>   f  s    z&BaseRestParser._do_modeled_error_parsec                 C   sJ   i }|d }d|kr"|d |d< n$d|krF|d |d< | dd|d< |S )Nr4   r   r   x-amz-request-id
x-amz-id-2r   HostIdrK   r   rF   rN   r4   r   r   r   rK  k  s    z*BaseRestParser._populate_response_metadatac           
      C   s   d|j kr|j d }|| }|j dr>| ||}|||< q|jdkrp|d }t|trf|| j}|||< q| |d }| 	||||< n$| |d }| 	||}	|
|	 d S )NrH  r7   )r2  r1  r5   )rA   rB   rm   r`   rC   r   r   r   r/  rd   r   )
r   rF   r    r   r   Zpayload_member_nameZ
body_shaper5   r   r3  r   r   r   r.  x  s&    





 
zBaseRestParser._parse_payloadc           
      C   s   |d }|D ]}|| }|j d}|d kr0qq|dkrN| ||d ||< q|dkrh| ||||< q|dkr|j d|}	|	|kr| |||	 ||< qd S )Nr4   r   Z
statusCoder6   headerrl   )rA   rB   rd   _parse_header_map)
r   rF   r    r   r   r4   rl   rg   r   header_namer   r   r   r-    s.     
 
 z'BaseRestParser._parse_non_payload_attrsc                 C   sN   i }|j dd }|D ].}| |r|t|d  }|| ||< q|S )Nrl   r   )rA   rB   lowerrP   r   )r   r    r4   rG   prefixrU  rl   r   r   r   rT    s    z BaseRestParser._parse_header_mapc                 C   s   t dd S r5  r6  r7  r   r   r   r/    s    z"BaseRestParser._initial_body_parsec                 C   s,   |}t |r(t|| j}t|}|S r   )r   r0   r1   r   r   r   r   )r   r    r3   rG   decodedr   r   r   r     s
    
zBaseRestParser._handle_stringc                    s@   |j d}|dkr2t|ts2dd |dD }t ||S )Nr   rS  c                 S   s   g | ]}|  qS r   )rO   )rs   r   r   r   r   r{     s     z/BaseRestParser._handle_list.<locals>.<listcomp>,)rA   rB   rC   ro   r   r   ri   )r   r    rb   r   r   r   r   ri     s    zBaseRestParser._handle_list)r   r   r   r@   rL  r>   rK  r.  r-  rT  r/  r   ri   r   r   r   r   r   rJ  T  s   	rJ  c                   @   sD   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dS )BaseRpcV2Parserc                 C   sJ   i }|d k	rF|j }|r&| |||}ni }| ||| | ||d< |S r   )rA  rB  r.  rK  )r   rF   r    rG   rA  r   r   r   r@     s      zBaseRpcV2Parser._do_parsec                 C   s   |d kr|S |  ||| d S r   )r.  rM  r   r   r   rL    s    z"BaseRpcV2Parser._add_modeled_parsec                 C   s   i }|  ||| |S r   rN  rM  r   r   r   r>     s    z'BaseRpcV2Parser._do_modeled_error_parsec                 C   s$   i }|d }d|kr |d |d< |S )Nr4   r   r   r   rR  r   r   r   rK    s
    z+BaseRpcV2Parser._populate_response_metadatac           
      C   s   i }|j }|jrT| }|dd  dd | D }t|dkrTd}t||j |D ].}|| }||}	|	d k	rX| 	||	||< qX|S )Nrq   c                 S   s   i | ]\}}|d k	r||qS r   r   rr   r   r   r   rv     s      z5BaseRpcV2Parser._handle_structure.<locals>.<dictcomp>rw   rx   )
ry   r|   r}   r~   r   r   r&   rl   rB   rd   )
r   r    rb   rG   ry   r   r   r   rg   r   r   r   r   r     s*    
 
z!BaseRpcV2Parser._handle_structurec                 C   s(   |  |d }| ||}|| d S rE  )r/  rd   r   )r   rF   r    r   r   r3  r   r   r   r.    s    zBaseRpcV2Parser._parse_payloadc                 C   s   t dd S r5  r6  r7  r   r   r   r/    s    z#BaseRpcV2Parser._initial_body_parseN)
r   r   r   r@   rL  r>   rK  r   r.  r/  r   r   r   r   rZ    s   rZ  c                       sP   e Zd ZeZdd Z fddZdd Zdd Zd	d
 Z	dd Z
e	Ze
Z  ZS )RestJSONParserc                 C   s
   |  |S r   r9  r7  r   r   r   r/    s    z"RestJSONParser._initial_body_parsec                    s   t  ||}| || |S r   )r   r?   _inject_error_code)r   rF   r    r   r   r   r   r?     s    zRestJSONParser._do_error_parsec                 C   s   |  |d }d }d|d kr,|d d }n$d|ks<d|krP|d|dd}|d kr\d S t|tr|ddd	 d
dd }||d d< d S )Nr5   zx-amzn-errortyper4   r   rR   r   r   rw   r   r   r  rU   )r/  rB   rC   rV   r   r   )r   r   rF   r5   r   r   r   r   r\    s    
z!RestJSONParser._inject_error_codec                 C   s   t |S r   )r   rj   r   r   r   r   -  s    zRestJSONParser._handle_booleanc                 C   s   t |S r   r   rj   r   r   r   r   0  s    zRestJSONParser._handle_integerc                 C   s   t |S r   r   rj   r   r   r   r   3  s    zRestJSONParser._handle_float)r   r   r   r8  r.   r/  r?   r\  r   r   r   r   r   r   r   r   r   r   r[    s   r[  c                   @   s(   e Zd ZeZdd Zdd Zdd ZdS )RpcV2CBORParserc                 C   s    |dkr|S |  |}| |S r?  )r  r  )r   r   Zbody_contents_streamr   r   r   r/  =  s    z#RpcV2CBORParser._initial_body_parsec                 C   s   |  |d }|d|ddddi d}|d }|d}|d krb|d	}|d k	rbt|}|d k	rd
|kr|d
dd }d|kr|ddd }d|kr| |||}||d d< d|kr|d |di d< |S )Nr5   r   rS   r   r   rT   r4   rq   r6   r   rw   r   r   r   rU   rR   r   r8   r   )r/  rB   rV   r   r   r   r   )r   rF   r    r5   r   r4   r   r   r   r   r   r?   E  s:    

  zRpcV2CBORParser._do_error_parsec           	      C   s\   |j | }| ||}z| }W n  tk
rB   d}t|Y nX | |j}|||< |S rF  )ry   rm   rG  r   r&   r/  rH  rI  r   r   r   rB  e  s    
z$RpcV2CBORParser._handle_event_streamN)r   r   r   r>  r.   r/  r?   rB  r   r   r   r   r]  :  s    r]  c                       sD   e Zd ZeZdd Zdd Zdd Zdd Ze	 fd	d
Z
  ZS )RestXMLParserc                 C   s   |st dS | |S r   r<  r=  r   r   r   r/  u  s    
z!RestXMLParser._initial_body_parsec                 C   sB   |d r8z|  |W S  tk
r6   tjddd Y nX | |S )Nr5   z2Exception caught when parsing error response body:T)exc_info)_parse_error_from_bodyr&   r9   r:   _parse_error_from_http_statusr^   r   r   r   r?   z  s    zRestXMLParser._do_error_parsec                 C   sF   t |d tjj|d dd|d dd|d ddddS )	Nr6   r   rQ   r4   rO  rP  )r   rQ  rT   )rV   rW   rX   rY   rB   rZ   r   r   r   ra    s    
 z+RestXMLParser._parse_error_from_http_statusc                 C   s   |d }|  |}| |}| | |jdkr\| |}|dd |dd ||dS d|krvd|di|d< ddddi}t|| |S )	Nr5   rU   r   r   rQ  rT   r8   r   )r   r   r   r   rK  r~   r
   )r   rF   r   r   rG   rN   defaultr   r   r   r`    s    






z$RestXMLParser._parse_error_from_bodyc                    s   t  ||}|S r   )r   r   r   r   r   r   r     s    zRestXMLParser._handle_string)r   r   r   r;  r.   r/  r?   ra  r`  r%   r   r   r   r   r   r   r^  r  s   r^  )Zec2queryr   z	rest-jsonzrest-xmlzsmithy-rpc-v2-cbor)1r   r0   http.clientrW   r   r   loggingr(  r   r!  Zbotocore.compatr   r   Zbotocore.eventstreamr   r   Zbotocore.utilsr   r   r   r	   r
   r   	getLoggerr   r9   r)   r   r   r%   	Exceptionr&   r'   r   r   r   r   r   r,  r8  r;  r>  r@  rJ  rZ  r[  r]  r^  r   r   r   r   r   <module>   sV   m 	
 W 14$a BS	'xG'8O