o
    Jh                     @   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   p/var/www/vedio/testing/chatpythonscript.ninositsolution.com/env/lib/python3.10/site-packages/botocore/parsers.py__init__      
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 | }|di | jS )Nr   )PROTOCOL_PARSERSr   )r   protocol_name
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         r   c                    s    fdd}|S )Nc                    s.   t |dr|j}|d u 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   sL   |d u rt }|| _|d u r| j}|| _d | _| jd ur$| ||| _d S d S r   )DEFAULT_TIMESTAMP_PARSER_timestamp_parser_default_blob_parser_blob_parser_event_stream_parserEVENT_STREAM_PARSER_CLSr   timestamp_parser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r5| |r!| |}n| |r.| ||}|S | ||}n| ||}|rE|j	drE|S t
|trj|	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ResponseMetadataHTTPStatusCode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_metadatar:   r   r   r   parse   s(   


zResponseParser.parsec                 C   s2   | di  di }| d}|r||d< d S d S )Ncontextchecksumresponse_algorithmChecksumAlgorithmrJ   )r   rN   rP   checksum_context	algorithmr   r   r   rM     s
   
z.ResponseParser._add_checksum_response_metadatac                 C   s   |d uo
|j ddS )N	exceptionF)metadatarJ   )r   r$   r   r   r   rE      s   z&ResponseParser._is_modeled_error_shapec                 C   sD   |d dkr d|vs|d d u rdS |d   }|dp| S d S )Nr<   i  r;   Ts   <html>)strip
startswith)r   rN   r;   r   r   r   rC   #  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.r<   r"   CodeMessageErrorr>   )rA   rB   strhttpclient	responsesrJ   r   rN   r   r   r   rD   6  s   
z&ResponseParser._do_generic_error_parsec                 C      t | jj d)Nz
._do_parseNotImplementedError	__class__r   r   rN   r$   r   r   r   rH   G     zResponseParser._do_parsec                 C   rg   )Nz._do_error_parserh   rk   r   r   r   rG   J  rl   zResponseParser._do_error_parsec                 C   rg   )Nz._do_modeled_error_parserh   )r   rN   r$   rO   r   r   r   rF   M  s   z&ResponseParser._do_modeled_error_parsec                 C   s    t | d|j | j}|||S )N_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appendrs   )r   r$   rq   rO   member_shapeitemr   r   r   _handle_listX  s
   zResponseParser._handle_listc                 C      |S r   r   r   r$   r9   r   r   r   rp   a  s   zResponseParser._default_handlec                 C   s&   | j }|d d}t|d |||S )NrR   operation_namer;   )r1   rJ   r   )r   rN   r$   parsernamer   r   r   _create_event_streamd  s   z#ResponseParser._create_event_streamc                 C   s   t |d S Nr   )listr8   r   r   r   _get_first_keyi  r    zResponseParser._get_first_keyc                    s    j rC| }|dd  dd | D }t|dkr%d}t| j | |} fdd jD }||vrCd}t	
||  d	S d
S )N__typec                 S      i | ]\}}|d ur||qS r   r   .0kvr   r   r   
<dictcomp>p      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 )r}   )membersrI   rJ   )r   rt   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*   r}   r   r   rA   info)r   r$   r9   cleaned_value	error_msgtagserialized_member_namesmsgr   r   r    _has_unknown_tagged_union_memberl  s(   

z/ResponseParser._has_unknown_tagged_union_memberc                 C   s   dd|iiS )NSDK_UNKNOWN_MEMBERr}   r   )r   r   r   r   r   #_handle_unknown_tagged_union_member  r    z2ResponseParser._handle_unknown_tagged_union_memberc                 C   sN   |d }| d}t|dkr%|d r%||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   ra   QueryErrorCoder   Type)splitr   )r   coder:   errorquery_errorquery_error_componentsr   r   r    _do_query_compatible_error_parse  s   
z/ResponseParser._do_query_compatible_error_parseNN)r   r   r   __doc__DEFAULT_ENCODINGr2   r   r/   rQ   rM   rE   rC   rD   rH   rG   rF   rs   rx   rp   r~   r   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_rer3   rj   r   r   r     s   zBaseXMLResponseParser.__init__c                 C   s   i }|j }|j}|jdpd}|jdpd}|jdr&t|ts&|g}|D ],}|D ]#}	| |	}
|
|kr>| ||	}q,|
|krI| ||	}q,td|
 |||< q(|S )Nr}   keyr9   	flattenedzUnknown tag: )	r   r9   rI   rJ   rK   r   	_node_tagrs   r*   )r   r$   rq   rO   	key_shapevalue_shapekey_location_namevalue_location_namekeyval_nodesingle_pairtag_namekey_nameval_namer   r   r   _handle_map  s"   

z!BaseXMLResponseParser._handle_mapc                 C   s   | j d|jS Nr"   )r   subr   )r   rq   r   r   r   r        zBaseXMLResponseParser._node_tagc                    s*   |j drt|ts|g}t ||S )Nr   )rI   rJ   rK   r   r   rx   )r   r$   rq   r   r   r   rx     s   z"BaseXMLResponseParser._handle_listc                 C   s  i }|j }|jddr| |}| |}| ||r&| |}| |S |D ]]}|| }d|jv s9|jdr:q(| 	||}	||	}
|
d urR| 
||
||< q(|jdri }|jd }|j D ]\}}| j|dd d |}|||< qd||v r|| ||< q(|S )	NrY   FlocationeventheaderxmlAttributer}   :r   )r   rZ   rJ   _get_error_root_build_name_to_xml_noder   r   r   rI   _member_key_namers   attribr   r   r   r   )r   r$   rq   rO   r   xml_dictr   member_namerv   xml_namemember_nodeattribslocation_namer   r9   new_keyr   r   r   _handle_structure  s@   









z'BaseXMLResponseParser._handle_structurec                 C   s2   |  |dkr|D ]}|  |dkr|  S q	|S )NErrorResponsera   r   )r   original_rootchildr   r   r   r     s   z%BaseXMLResponseParser._get_error_rootc                 C   sL   |j dkr|jdr|jjd}|d ur|S |jd}|d ur$|S |S )Nr   r   r}   )ro   rI   rJ   rt   )r   r$   r   list_member_serialized_nameserialized_namer   r   r   r     s   z&BaseXMLResponseParser._member_key_namec                 C   st   t |tr| |d S i }|D ]'}| |}||v r3t || tr*|| | q|| |g||< q|||< q|S r   )rK   r   r   r   ru   )r   parent_noder   rw   r   r   r   r   r     s   


z-BaseXMLResponseParser._build_name_to_xml_nodec              
   C   sZ   zt jt  | jd}|| | }W |S  ty, } z
td| d| d }~ww )N)targetencodingzUnable to parse response (z6), invalid XML received. Further retries may succeed:
)r   	XMLParserTreeBuilderr   feedcloser   r*   )r   
xml_stringr|   rooter   r   r   _parse_xml_string_to_dom  s   


z.BaseXMLResponseParser._parse_xml_string_to_domc                 C   sB   |  D ]\}}t|r| |}| |||< q|j||< q|S r   )r   r   r   _replace_nodesr!   )r   rO   r   r9   sub_dictr   r   r   r   "  s   
z$BaseXMLResponseParser._replace_nodesc                 C   s   |dkrdS dS )NtrueTFr   r   r$   r!   r   r   r   _handle_boolean+  s   z%BaseXMLResponseParser._handle_booleanc                 C      t |S r   floatr   r   r   r   _handle_float2     z#BaseXMLResponseParser._handle_floatc                 C   
   |  |S r   r.   r   r   r   r   _handle_timestamp6     
z'BaseXMLResponseParser._handle_timestampc                 C   r   r   intr   r   r   r   _handle_integer:  r   z%BaseXMLResponseParser._handle_integerc                 C   ry   r   r   r   r   r   r   _handle_string>  s   z$BaseXMLResponseParser._handle_stringc                 C   r   r   r0   r   r   r   r   _handle_blobB  r   z"BaseXMLResponseParser._handle_blobr   )r   r   r   r   r   r   rx   r   r   r   r   r   r   r)   r   r   r   r   r   r   _handle_character_handle_double_handle_long__classcell__r   r   r   r   r     s4    
$	





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|v r||d d|v r,d|di|d< |S )Nr;   Errors	RequestIdr>   )r   r   r   r   r   )r   rN   r$   xml_contentsr   rO   r   r   r   rG   L  s   


zQueryParser._do_error_parsec                 C      | j ||ddS )NFinject_metadata_parse_body_as_xmlrk   r   r   r   rF   \  r   z#QueryParser._do_modeled_error_parsec                 C   r   )NTr   r  rk   r   r   r   rH   _  r   zQueryParser._do_parseTc                 C   s^   |d }|  |}i }|d ur%|}d|jv r| |jd |}| ||}|r-| || |S )Nr;   resultWrapper)r   rI   _find_result_wrapped_shapers   _inject_response_metadata)r   rN   r$   r   r   r   rO   startr   r   r   r  b  s   


zQueryParser._parse_body_as_xmlc                 C   s   |  |}|| S r   )r   )r   element_namexml_root_nodemappingr   r   r   r  q  s   
z&QueryParser._find_result_wrapped_shapec                 C   sR   |  |}|d}|d ur'|  |}| D ]	\}}|j||< q||d< d S d S Nr>   )r   rJ   r   r!   )r   rq   inject_intor	  
child_nodesub_mappingr   r9   r   r   r   r  u  s   


z%QueryParser._inject_response_metadataN)T)	r   r   r   rG   rF   rH   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   s2   |  |}|d}|d urd|ji|d< d S d S )N	requestIdr   r>   )r   rJ   r!   )r   rq   r  r	  r  r   r   r   r    s
   

z(EC2QueryParser._inject_response_metadatac                    s,   t  ||}d|v rd|di|d< |S )N	RequestIDr   r>   )r   rG   r   )r   rN   r$   originalr   r   r   rG     s
   
zEC2QueryParser._do_error_parsec                 C   s@   |D ]}|  |dkr|D ]}|  |dkr|    S qq|S )Nr   ra   r   )r   r   r   errors_childr   r   r   r     s   zEC2QueryParser._get_error_root)r   r   r   r  rG   r   r   r   r   r   r   r    s    r  c                   @   D   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	|}|S |j}|d u rd S i }| ||r$| |}| |S |D ] }|| }|jd|}||}	|	d urF| || |	||< q&|S )Nr}   )is_document_typer   r   r   r   rI   rJ   rs   )
r   r$   r9   final_parsedmember_shapesr   r   rv   	json_name	raw_valuer   r   r   r     s*   


z BaseJSONParser._handle_structurec           	      C   sF   i }|j }|j}| D ]\}}| ||}| ||}|||< q|S r   )r   r9   r   rs   )	r   r$   r9   rO   r   r   r   
actual_keyactual_valuer   r   r   r     s   
zBaseJSONParser._handle_mapc                 C   r   r   r   rz   r   r   r   r     r   zBaseJSONParser._handle_blobc                 C   r   r   r   rz   r   r   r   r     r   z BaseJSONParser._handle_timestampc                 C   s   |  |d }dddi d}|d }|d|dd|d d< |d	}|d
|o.t|}|d ur]d|v r@|ddd }d|v rL|ddd }d|v rW| |||}||d d< | ||d  |S )Nr;   r"   r_   r^   r`   r:   messager_   ra   r<   r   r   r   r   #r   r^   )_parse_body_as_jsonrJ   rb   r   rsplitr   r  )r   rN   r$   r;   r   r:   response_coder   r   r   r   rG     s(   	
zBaseJSONParser._do_error_parsec                 C   s$   d|v r|d | di d< d S d S )Nx-amzn-requestidr>   r   )
setdefault)r   rO   r:   r   r   r   r    s
   z(BaseJSONParser._inject_response_metadatac                 C   s@   |si S | | j}zt|}|W S  ty   d|i Y S w )Nr  )decoder   jsonloads
ValueError)r   body_contentsr;   original_parsedr   r   r   r    s   
z"BaseJSONParser._parse_body_as_jsonN)
r   r   r   r   r   r   r   rG   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   r   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  r   z-BaseCBORParser.get_peekable_stream_from_bytesc                 C   sN   |  |d}|d? }|d@ }|| jv r| j| }|||S td| d| )Nr   r/  r+  z8Unsupported inital byte found for data item- Major type:z, Additional info: )_read_bytes_as_intr:  r*   )r   streaminitial_byte
major_typeadditional_infomethodr   r   r   parse_data_item  s   


zBaseCBORParser.parse_data_itemc                 C   sD   ddddd}|dk r|S ||v r|| }|  ||S td| )Nr   r   r.     )            rH  zhInvalid CBOR integer returned from the service; unparsable additional info found for major type 0 or 1: )r@  r*   )r   rA  rD  additional_info_to_num_bytes	num_bytesr   r   r   r2  -  s   z&BaseCBORParser._parse_unsigned_integerc                 C   s   d|  || S )N)r2  r   rA  rD  r   r   r   r3  B  r   z&BaseCBORParser._parse_negative_integerc                 C   sr   || j kr| ||}| ||S g }	 | |rn| |d}|d@ }| ||}|| || qd|S )NTr   r+      )INDEFINITE_ITEM_ADDITIONAL_INFOr2  _read_from_stream_handle_break_coder@  ru   join)r   rA  rD  lengthchunksrB  r   r   r   r4  F  s   


z!BaseCBORParser._parse_byte_stringc                 C   s   |  ||dS )Nr,   )r4  r$  rO  r   r   r   r5  V  rl   z!BaseCBORParser._parse_text_stringc                    sZ   | j kr |} fddt|D S g } s+|   r|S )Nc                    s   g | ]}  qS r   rF  )r   _r   rA  r   r   r   ]  s    z/BaseCBORParser._parse_array.<locals>.<listcomp>)rQ  r2  rangerS  ru   rF  )r   rA  rD  rU  r   r   rY  r   r6  Z  s   


zBaseCBORParser._parse_arrayc                 C   s\   i }|| j kr| ||}t|D ]}| || q|S | |s,| || | |r!|S r   )rQ  r2  rZ  _parse_key_value_pairrS  )r   rA  rD  r   rU  rX  r   r   r   r7  e  s   


zBaseCBORParser._parse_mapc                 C   s,   |  |}|  |}|d ur|||< d S d S r   rW  )r   rA  r   r   r9   r   r   r   r[  r  s
   

z$BaseCBORParser._parse_key_value_pairc                 C   s6   |  ||}| |}|dkr| |S td| )Nr   z*Found CBOR tag not supported by botocore: )r2  rF  _parse_datetimer*   )r   rA  rD  r   r9   r   r   r   r8  z  s   

zBaseCBORParser._parse_tagc                 C   s&   t |ttfr| |S td| )Nz Unable to parse datetime value: )rK   r   r   r.   r*   r8   r   r   r   r\    s
   
zBaseCBORParser._parse_datetimec                 C   sf   ddd d d}||v r|| S dddd}||v r+|| \}}t || ||d S td	| d
)NFT)            )z>er   )z>fr.  )z>drG  )rI  rJ  rK  r   z0Invalid additional info found for major type 7: zI.  This indicates an unsupported simple type or an indefinite float value)structunpackrR  r*   )r   rA  rD  additional_info_simple_valuesfloat_formatsfloat_formatrM  r   r   r   r9    s*   
z&BaseCBORParser._parse_simple_and_floatc                 C   s6   t |dd d d| jkr|dtj dS d S )Nr   bigT)r   
from_bytespeek
BREAK_CODEseekosSEEK_CURrY  r   r   r   rS    s    z!BaseCBORParser._handle_break_codec                 C   s   |  ||}t|dS )Nrf  )rR  r   rg  )r   rA  rM  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   rA  rM  r9   r   r   r   rR    s   
z BaseCBORParser._read_from_streamN)r   r   r   rQ  ri  r   r:  r?  rF  r2  r3  r4  r5  r6  r7  r[  r8  r\  r9  rS  r@  rR  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   sj   i }|j dr!|d d}|j|}|r| ||||< |S | |||j| | |||j| |S )Nr=   r:   z:event-type)rI   rJ   r   rH   _parse_non_payload_attrs_parse_payload)r   rN   r$   r  
event_typeevent_shaper   r   r   rH     s   
zBaseEventStreamParser._do_parsec              	   C   s   |d  d}|j |}|d ur/| |d }| ||}d|| d| dddi}|S d|d  d	d|d  d
ddi}|S )Nr:   z:exception-typer;   ra   r_   r  r"   r]   z:error-codez:error-message)rJ   r   _initial_body_parsers   )r   rN   r$   exception_typeexception_shaper)  r;   r   r   r   r   rG     s"   z%BaseEventStreamParser._do_error_parsec                 C   s   |j drS|D ]6}|| }|j dr>|d }|jdkr |}n|jdkr,|| j}n| |}	| ||	}|||<  d S q| |d }
| ||
}|| d S d S )Neventeventpayloadr;   blobstring)rI   rJ   ro   r$  r   rt  rs   r   )r   rN   r$   r  r  r}   rv   r;   parsed_body	raw_parser)  body_parsedr   r   r   rq    s(   


z$BaseEventStreamParser._parse_payloadc           	      C   sZ   |d }|D ]$}|| }|j dr*||v r*|| }|jdkr&| |d }|||< qd S )Nr:   r   	timestampg     @@)rI   rJ   ro   r.   )	r   rN   r$   r  r  r:   r}   rv   r9   r   r   r   rp    s   
z.BaseEventStreamParser._parse_non_payload_attrsc                 C      t dNrt  ri   r   r(  r   r   r   rt       z)BaseEventStreamParser._initial_body_parseN)r   r   r   rH   rG   rq  rp  rt  r   r   r   r   ro    s    ro  c                   @      e Zd Zdd ZdS )EventStreamJSONParserc                 C   
   |  |S r   r  r  r   r   r   rt    r   z)EventStreamJSONParser._initial_body_parseNr   r   r   rt  r   r   r   r   r        r  c                   @   r  )EventStreamXMLParserc                 C      |st dS | |S r   r   Elementr   r   r   r   r   r   rt       

z(EventStreamXMLParser._initial_body_parseNr  r   r   r   r   r    r  r  c                   @   r  )EventStreamCBORParserc                 C   s   |dkri S |  | |S NrP  )rF  r?  r  r   r   r   rt  %  s
   z)EventStreamCBORParser._initial_body_parseNr  r   r   r   r   r  $  r  r  c                   @   s2   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 ur|j }|r| |||}n| |d |}| ||d  |S )Nr;   r:   )event_stream_name_handle_event_stream_handle_json_bodyr  )r   rN   r$   rO   
event_namer   r   r   rH   2  s   zJSONParser._do_parsec                 C   s   |  |d |S Nr;   )r  rk   r   r   r   rF   =  r   z"JSONParser._do_modeled_error_parsec           	      C   sX   |j | }| ||}z| }W n ty   d}t|w | |j|}|||< |S Nz,First event was not of type initial-response)r   r~   get_initial_responser   r*   r  payload	r   rN   r$   r  event_stream_shapeevent_streamrw  r   rO   r   r   r   r  @  s   
zJSONParser._handle_event_streamc                 C   s   |  |}| ||S r   )r  rs   )r   raw_bodyr$   parsed_jsonr   r   r   r  L  s   
zJSONParser._handle_json_bodyN)	r   r   r   r  r2   rH   rF   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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   rN   r$   r  r   r   r   rH   U  s   zBaseRestParser._do_parsec                 C   s6   |d u r|S |j }| |||| | |||| d S r   )r   rp  rq  )r   rN   r$   r  r  r   r   r   r  ]  s   z!BaseRestParser._add_modeled_parsec                 C      i }|  ||| |S r   r  r  r   r   r   rF   f     z&BaseRestParser._do_modeled_error_parsec                 C   sL   i }|d }d|v r|d |d< |S d|v r$|d |d< | dd|d< |S )Nr:   r"  r   x-amz-request-id
x-amz-id-2r"   HostIdrV   r   rN   rZ   r:   r   r   r   r  k  s   z*BaseRestParser._populate_response_metadatac           
      C   s   d|j v rK|j d }|| }|j dr | ||}|||< d S |jdv r:|d }t|tr4|| j}|||< d S | |d }| 	||||< d S | |d }| 	||}	|
|	 d S )Nr  r=   )rz  ry  r;   )rI   rJ   r~   ro   rK   r>  r$  r   rt  rs   r   )
r   rN   r$   r  r  payload_member_name
body_shaper;   r)  r}  r   r   r   rq  x  s$   



zBaseRestParser._parse_payloadc           
      C   s   |d }|D ]F}|| }|j d}|d u rq|dkr&| ||d ||< q|dkr3| ||||< q|dkrL|j d|}	|	|v rL| |||	 ||< qd S )Nr:   r   
statusCoder<   headerr}   )rI   rJ   rs   _parse_header_map)
r   rN   r$   r  r  r:   r}   rv   r   header_namer   r   r   rp    s,   

z'BaseRestParser._parse_non_payload_attrsc                 C   sN   i }|j dd }|D ]}| |r$|t|d  }|| ||< q|S )Nr}   r"   )rI   rJ   lowerr\   r   )r   r$   r:   rO   prefixr  r}   r   r   r   r    s   z BaseRestParser._parse_header_mapc                 C   r  r  r  r  r   r   r   rt    r  z"BaseRestParser._initial_body_parsec                 C   s,   |}t |rt|| j}t|}|S r   )r   r6   r7   r$  r   r%  r&  )r   r$   r9   rO   decodedr   r   r   r     s
   
zBaseRestParser._handle_stringc                    s@   |j d}|dkrt|tsdd |dD }t ||S )Nr   r  c                 S   s   g | ]}|  qS r   )r[   )r   r   r   r   r   r     s    z/BaseRestParser._handle_list.<locals>.<listcomp>,)rI   rJ   rK   r   r   r   rx   )r   r$   rq   r   r   r   r   rx     s   zBaseRestParser._handle_list)r   r   r   rH   r  rF   r  rq  rp  r  rt  r   rx   r   r   r   r   r   r  T  s    	r  c                   @   r  )BaseRpcV2Parserc                 C   sJ   i }|d ur#|j }|r| |||}n	i }| ||| | ||d< |S r
  )r  r  rq  r  )r   rN   r$   rO   r  r   r   r   rH     s   zBaseRpcV2Parser._do_parsec                 C   s   |d u r|S |  ||| d S r   )rq  r  r   r   r   r    s   z"BaseRpcV2Parser._add_modeled_parsec                 C   r  r   r  r  r   r   r   rF     r  z'BaseRpcV2Parser._do_modeled_error_parsec                 C   s$   i }|d }d|v r|d |d< |S )Nr:   r"  r   r   r  r   r   r   r    s
   z+BaseRpcV2Parser._populate_response_metadatac           
      C   s   i }|j }|jr*| }|dd  dd | D }t|dkr*d}t||j |D ]}|| }||}	|	d urC| 	||	||< q,|S )Nr   c                 S   r   r   r   r   r   r   r   r     r   z5BaseRpcV2Parser._handle_structure.<locals>.<dictcomp>r   r   )
r   r   r   r   r   r   r*   r}   rJ   rs   )
r   r$   rq   rO   r   r   r   r   rv   r   r   r   r   r     s*   
z!BaseRpcV2Parser._handle_structurec                 C   s(   |  |d }| ||}|| d S r  )rt  rs   r   )r   rN   r$   r  r)  r}  r   r   r   rq    s   zBaseRpcV2Parser._parse_payloadc                 C   r  r  r  r  r   r   r   rt    r  z#BaseRpcV2Parser._initial_body_parseN)
r   r   r   rH   r  rF   r  r   rq  rt  r   r   r   r   r    s    r  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   r  r   r  r  r   r   r   rt    r   z"RestJSONParser._initial_body_parsec                    s   t  ||}| || |S r   )r   rG   _inject_error_code)r   rN   r$   r   r   r   r   rG     s   zRestJSONParser._do_error_parsec                 C   s   |  |d }d }d|d v r|d d }nd|v sd|v r(|d|dd}|d u r.d S t|trA|ddd	 d
dd }||d d< d S )Nr;   zx-amzn-errortyper:   r   r^   r"   r   r   r   r  rN  ra   )rt  rJ   rK   rb   r   r   )r   r   rN   r;   r   r   r   r   r    s   
z!RestJSONParser._inject_error_codec                 C   r   r   )r   rz   r   r   r   r   -     zRestJSONParser._handle_booleanc                 C   r   r   r   rz   r   r   r   r   0  r  zRestJSONParser._handle_integerc                 C   r   r   r   rz   r   r   r   r   3  r  zRestJSONParser._handle_float)r   r   r   r  r2   rt  rG   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?  rF  )r   r(  body_contents_streamr   r   r   rt  =  s   
z#RpcV2CBORParser._initial_body_parsec                 C   s   |  |d }|d|ddddi d}|d }|d}|d u r1|d	}|d ur1t|}|d ur^d
|v rA|d
dd }d|v rM|ddd }d|v rX| |||}||d d< d|v rl|d |di d< |S )Nr;   r  r_   r"   r  r`   r:   r   r<   r   r   r   r  r   ra   r^   r"  r>   r   )rt  rJ   rb   r   r   r   r#  )r   rN   r$   r;   r   r:   r   r!  r   r   r   rG   E  s6   

zRpcV2CBORParser._do_error_parsec           	      C   sV   |j | }| ||}z| }W n ty   d}t|w | |j}|||< |S r  )r   r~   r  r   r*   rt  r  r  r   r   r   r  e  s   
z$RpcV2CBORParser._handle_event_streamN)r   r   r   r  r2   rt  rG   r  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   r  r   r  r  r   r   r   rt  u  r  z!RestXMLParser._initial_body_parsec                 C   s@   |d rz|  |W S  ty   tjddd Y nw | |S )Nr;   z2Exception caught when parsing error response body:T)exc_info)_parse_error_from_bodyr*   rA   rB   _parse_error_from_http_statusrk   r   r   r   rG   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 )	Nr<   r"   r]   r:   r  r  )r   r  r`   )rb   rc   rd   re   rJ   rf   r   r   r   r    s   
z+RestXMLParser._parse_error_from_http_statusc                 C   s   |d }|  |}| |}| | |jdkr.| |}|dd |dd ||dS d|v r;d|di|d< ddddi}t|| |S )	Nr;   ra   r   r"   r  r`   r>   r  )r   r   r   r   r  r   r
   )r   rN   r   r   rO   rZ   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  r2   rt  rG   r  r  r)   r   r   r   r   r   r   r  r  s    r  )ec2queryr%  z	rest-jsonzrest-xmlzsmithy-rpc-v2-cbor)1r   r6   http.clientrc   r;  r%  loggingrk  r   ra  botocore.compatr   r   botocore.eventstreamr   r   botocore.utilsr   r   r   r	   r
   r   	getLoggerr   rA   r-   r   r   r)   	Exceptionr*   r+   r   r   r  r  r*  ro  r  r  r  r  r  r  r  r  r  r   r   r   r   r   <module>   sX   m 
	 W 14$a BS	'xG'8O
