
    /Jf'                     6   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mZm	Z	 ddl
mZmZ ddlmZmZmZmZ  ej        e          ZeZ G d d          Zd Zd	 Z G d
 de          Z G d d          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z  G d de e          Z! G d de e          Z" G d de          Z# G d de          Z$ G d  d!e$e          Z% G d" d#e$e          Z&eee#e%e&d$Z'd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|
    +---------------------+       +--------------+        +--------------+
              ^         ^          ^           ^           ^        ^
              |         |          |           |           |        |
              |         |          |           |           |        |
              |        ++----------+-+       +-+-----------++       |
              |        |RestXMLParser|       |RestJSONParser|       |
        +-----+-----+  +-------------+       +--------------+  +----+-----+
        |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``).  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)is_json_value_headerlowercase_dictmerge_dictsparse_timestampc                        e Zd Zd Zd Zd ZdS )ResponseParserFactoryc                     i | _         d S N)	_defaults)selfs    S/home/alex/cs2snipeproduction/venv/lib/python3.11/site-packages/botocore/parsers.py__init__zResponseParserFactory.__init__   s        c                 :    | 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   kwargss     r   set_parser_defaultsz)ResponseParserFactory.set_parser_defaults   s      	f%%%%%r   c                 6    t           |         } |di | j        S )N )PROTOCOL_PARSERSr   )r   protocol_name
parser_clss      r   create_parserz#ResponseParserFactory.create_parser   s$    %m4
z++DN+++r   N)__name__
__module____qualname__r   r   r   r   r   r   r   r      sA          
& 
& 
&, , , , ,r   r   c                 D    t                                          |           S r   )r   r   )protocols    r   r   r      s     ""00:::r   c                       fd}|S )Nc                 Z    t          |d          r|j        }|d}n|} | ||          S )Ntext )hasattrr%   )r   shapenode_or_stringr%   funcs       r   _get_text_contentz(_text_content.<locals>._get_text_content   sC    >6** 	"!&D| !DtD%&&&r   r   )r*   r+   s   ` r   _text_contentr,      s$    
' 
' 
' 
' 
' r   c                       e Zd ZdS )ResponseParserErrorN)r   r   r    r   r   r   r.   r.      s        Dr   r.   c                       e Zd ZdZdZdZddZd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Z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.

    zutf-8Nc                     |t           }|| _        || j        }|| _        d | _        | j        |                     ||          | _        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_parsers      r   r   zResponseParser.__init__   sh    #7!13K'$(!'3(,(D(D +) )D%%% 43r   c                 *    t          j        |          S r   )base64	b64decoder   values     r   r4   z#ResponseParser._default_blob_parser   s     &&&r   c                    t                               d|d                    t                               d|d                    |d         dk    ro|                     |          r|                     |          }nZ|                     |          r|                     ||          }|S |                     ||          }n|                     ||          }|r|j        	                    d          r|S t          |t                    rV|	                    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@   s         r   parsezResponseParser.parse   su   " 			((9*=>>>		&(8999M"c))..x88 ?55h??--e44 ?55hFF--h>>^^He44F  	U(,,];; 	M fd## 		N &

+=r B B2:=2I./ y)G/=g/F/Fm,):F%&00;LMMMr   c                     |                     di                                di           }|                     d          }|r||d<   d S d S )Ncontextchecksumresponse_algorithmChecksumAlgorithmrP   )r   rT   rV   checksum_context	algorithms        r   rS   z.ResponseParser._add_checksum_response_metadata  s^    #<<	266:::rJJ$(()=>>	 	?5>1222	? 	?r   c                 @    |d uo|j                             dd          S )N	exceptionF)metadatarP   )r   r(   s     r   rK   z&ResponseParser._is_modeled_error_shape  s$    D KU^%7%7U%K%KKr   c                     |d         dk    r@d|vs|d         dS |d                                          }|                    d          p| S d S )NrB   i  rA   Ts   <html>)strip
startswith)r   rT   rA   s      r   rI   z)ResponseParser._is_generic_error_response  se     M"c))X%%&)9)AtF#))++D??9--9T9 *)r   c                     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.rB   r&   CodeMessageErrorrD   )rG   rH   strhttpclient	responsesrP   r   rT   s     r   rJ   z&ResponseParser._do_generic_error_parse,  sr     			B	
 	
 	
 H]344;044]+R   !#
 
 	
r   c                 :    t          d| j        j        z            )Nz%s._do_parseNotImplementedError	__class__r   r   rT   r(   s      r   rN   zResponseParser._do_parse=  s    !.4>3J"JKKKr   c                 :    t          | j        j         d          )Nz._do_error_parserr   ru   s      r   rM   zResponseParser._do_error_parse@  s    !T^%<"N"N"NOOOr   c                 :    t          | j        j         d          )Nz._do_modeled_error_parserr   )r   rT   r(   rU   s       r   rL   z&ResponseParser._do_modeled_error_parseC  s%    !~&@@@
 
 	
r   c                 V    t          | d|j         | j                  } |||          S )N_handle_)getattr	type_name_default_handle)r   r(   nodehandlers       r   _parse_shapezResponseParser._parse_shapeH  s:    .U_..0D
 
 wud###r   c                 t    g }|j         }|D ]+}|                    |                     ||                     ,|S r   )memberappendr   )r   r(   r}   rU   member_shapeitems         r   _handle_listzResponseParser._handle_listN  sK     | 	A 	ADMM$++L$??@@@@r   c                     |S r   r   r   r(   r>   s      r   r|   zResponseParser._default_handleW  s    r   c                 v    | j         }|d                             d          }t          |d         |||          S )NrY   operation_namerA   )r6   rP   r   )r   rT   r(   parsernames        r   _create_event_streamz#ResponseParser._create_event_streamZ  s<    *	"&&'7888F+UFDAAAr   c                 ,    t          |          d         S Nr   )listr=   s     r   _get_first_keyzResponseParser._get_first_key_  s    E{{1~r   c                 >   |j         r|                                }|                    dd            t          |          dk    rd}t	          ||j        z            |                     |          }||j        vr!d}t          	                    ||z             dS dS )N__type   zCInvalid service response: %s must have one and only one member set.zqReceived a tagged union response with member unknown to client: %s. Please upgrade SDK for full response support.TF)
is_tagged_unioncopypoplenr.   r   r   membersrG   info)r   r(   r>   cleaned_value	error_msgtagmsgs          r    _has_unknown_tagged_union_memberz/ResponseParser._has_unknown_tagged_union_memberb  s      	!JJLLMh---=!!Q&&&  *)ej*@AAA%%m44C%-''( 
 s###tur   c                     dd|iiS )NSDK_UNKNOWN_MEMBERr   r   )r   r   s     r   #_handle_unknown_tagged_union_memberz2ResponseParser._handle_unknown_tagged_union_memberw  s    $vsm44r   NN)r   r   r    __doc__DEFAULT_ENCODINGr7   r   r4   rW   rS   rK   rI   rJ   rN   rM   rL   r   r   r|   r   r   r   r   r   r   r   r0   r0      s=         "   ' ' '/ / /b? ? ?L L L: : :&
 
 
"L L LP P P
 
 

$ $ $    B B B
    *5 5 5 5 5r   r0   c                        e Zd Zd fd	Zd Zd Z fdZd Zd Zd Z	d	 Z
d
 Zd Zed             Zed             Zed             Zed             Zed             Zed             ZeZeZeZ xZS )BaseXMLResponseParserNc                 ~    t                                          ||           t          j        d          | _        d S )Nz{.*})superr   recompile_namespace_re)r   r8   r9   rt   s      r   r   zBaseXMLResponseParser.__init__|  s6    );777Z//r   c                    i }|j         }|j        }|j                            d          pd}|j                            d          pd}|j                            d          rt	          |t
                    s|g}|D ]l}|D ]b}	|                     |	          }
|
|k    r|                     ||	          }4|
|k    r|                     ||	          }Qt          d|
z            |||<   m|S )Nr   keyr>   	flattenedzUnknown tag: %s)	r   r>   rO   rP   rQ   r   	_node_tagr   r.   )r   r(   r}   rU   	key_shapevalue_shapekey_location_namevalue_location_namekeyval_nodesingle_pairtag_namekey_nameval_names                r   _handle_mapz!BaseXMLResponseParser._handle_map  s   I	k%377??H5)7;;FCCNw"";// 	
48N8N 	6D 
	( 
	(K* L L>>+66000#00KHHHH!444#00kJJHH-.?(.JKKK'F8r   c                 B    | j                             d|j                  S Nr&   )r   subr   )r   r}   s     r   r   zBaseXMLResponseParser._node_tag  s    !%%b$(333r   c                     |j                             d          rt          |t                    s|g}t	                                          ||          S )Nr   )rO   rP   rQ   r   r   r   )r   r(   r}   rt   s      r   r   z"BaseXMLResponseParser._handle_list  sP     "";// 	
48N8N 	6Dww##E4000r   c                 <   i }|j         }|j                            dd          r|                     |          }|                     |          }|                     ||          r*|                     |          }|                     |          S |D ]	}||         }d|j        v s|j                            d          r/| 	                    ||          }	|                    |	          }
|
| 
                    ||
          ||<   v|j                            d          ryi }|j        d         }|j                                        D ]A\  }}| j                            |                    d          d         dz   |          }|||<   B||v r||         ||<   |S )	Nra   FlocationeventheaderxmlAttributer   :r   )r   rb   rP   _get_error_root_build_name_to_xml_noder   r   r   rO   _member_key_namer   attribitemsr   r   split)r   r(   r}   rU   r   xml_dictr   member_namer   xml_namemember_nodeattribslocation_namer   r>   new_keys                   r   _handle_structurez'BaseXMLResponseParser._handle_structure  s   ->k511 	.''--D//5500AA 	A%%h//C;;C@@@" 	A 	AK";/Ll888-11-@@ 9
 ,,\;GGH",,x00K&&*&7&7 +' '{## +//?? 	A , :6 B"&+"3"3"5"5 - -JC"044%++C003c93 G (-GG$$ G++*1-*@F;'r   c                 |    |                      |          dk    r"|D ]}|                      |          dk    r|c S  |S )NErrorResponserk   r   )r   original_rootchilds      r   r   z%BaseXMLResponseParser._get_error_root  sS    >>-((O;;& ! !>>%((G33 LLL 4r   c                     |j         dk    r=|j                            d          r#|j        j                            d          }||S |j                            d          }||S |S )Nr   r   r   )r{   rO   rP   r   )r   r(   r   list_member_serialized_nameserialized_names        r   r   z&BaseXMLResponseParser._member_key_name  s{    
 ?f$$)<)@)@)M)M$*/,*D*H*H+ +' +622-11&99&""r   c                 :   t          |t                    r|                     |d                   S i }|D ]e}|                     |          }||v rEt          ||         t                    r||                             |           R||         |g||<   `|||<   f|S r   )rQ   r   r   r   r   )r   parent_noder   r   r   s        r   r   z-BaseXMLResponseParser._build_name_to_xml_node  s     k4(( 	@//A??? 	% 	%D..&&Ch
 hsmT22 :SM((.... &.c]D$9HSMM $r   c                    	 t          j        t          j                    | j                  }|                    |           |                                }n'# t          $ r}t          d|d|          d }~ww xY w|S )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es        r   _parse_xml_string_to_domz.BaseXMLResponseParser._parse_xml_string_to_dom  s    	_(**T5J  F KK
###<<>>DD 	 	 	%% 11jj"  	 s   AA 
A<"A77A<c                     |                                 D ]L\  }}t          |          r.|                     |          }|                     |          ||<   B|j        ||<   M|S r   )r   r   r   _replace_nodesr%   )r   rU   r   r>   sub_dicts        r   r   z$BaseXMLResponseParser._replace_nodes  si     ,,.. 	) 	)JCE{{ )77>>"11(;;s#jsr   c                     |dk    rdS dS )NtrueTFr   r   r(   r%   s      r   _handle_booleanz%BaseXMLResponseParser._handle_boolean  s    6>>45r   c                      t          |          S r   )floatr   s      r   _handle_floatz#BaseXMLResponseParser._handle_float  s    T{{r   c                 ,    |                      |          S r   r3   r   s      r   _handle_timestampz'BaseXMLResponseParser._handle_timestamp  s    %%d+++r   c                      t          |          S r   intr   s      r   _handle_integerz%BaseXMLResponseParser._handle_integer  s    4yyr   c                     |S r   r   r   s      r   _handle_stringz$BaseXMLResponseParser._handle_string  s    r   c                 ,    |                      |          S r   r5   r   s      r   _handle_blobz"BaseXMLResponseParser._handle_blob#  s      &&&r   r   )r   r   r    r   r   r   r   r   r   r   r   r   r   r,   r   r   r   r   r   r   _handle_character_handle_double_handle_long__classcell__rt   s   @r   r   r   {  sw       0 0 0 0 0 0  *4 4 41 1 1 1 1" " "H       .       ]   ] , , ],   ]   ] ' ' ]' '"N"LLLLLr   r   c                   4    e Zd Zd Zd Zd Zd	dZd Zd ZdS )
QueryParserc                 (   |d         }|                      |          }|                     |          }|                     |           d|v r(|                    |                    d                     d|v rd|                    d          i|d<   |S )NrA   Errors	RequestIdrD   )r   r   r   r   r   )r   rT   r(   xml_contentsr   rU   s         r   rM   zQueryParser._do_error_parse-  s    ',,\::--d33F### vMM&**X..///&  *5vzz+7N7N)OF%&r   c                 2    |                      ||d          S )NFinject_metadata_parse_body_as_xmlru   s      r   rL   z#QueryParser._do_modeled_error_parse=  s    &&x&NNNr   c                 2    |                      ||d          S )NTr  r
  ru   s      r   rN   zQueryParser._do_parse@  s    &&x&MMMr   Tc                     |d         }|                      |          }i }|B|}d|j        v r!|                     |j        d         |          }|                     ||          }|r|                     ||           |S )NrA   resultWrapper)r   rO   _find_result_wrapped_shaper   _inject_response_metadata)r   rT   r(   r	  r  r   rU   starts           r   r  zQueryParser._parse_body_as_xmlC  s    ',,\::E%"55577'8$  &&ue44F 	9**4888r   c                 <    |                      |          }||         S r   )r   )r   element_namexml_root_nodemappings       r   r  z&QueryParser._find_result_wrapped_shapeR  s     ..}==|$$r   c                     |                      |          }|                    d          }|@|                      |          }|                                D ]\  }}|j        ||<   ||d<   d S d S NrD   )r   rP   r   r%   )r   r}   inject_intor  
child_nodesub_mappingr   r>   s           r   r  z%QueryParser._inject_response_metadataV  s    ..t44[[!344
!66zBBK)//11 . .
U#(:C  .9K*+++	 "!r   N)T)	r   r   r    rM   rL   rN   r  r  r  r   r   r   r  r  ,  sy           O O ON N N   % % %: : : : :r   r  c                   *     e Zd Zd Z fdZd Z xZS )EC2QueryParserc                 z    |                      |          }|                    d          }|d|j        i|d<   d S d S )N	requestIdr  rD   )r   rP   r%   )r   r}   r  r  r  s        r   r  z(EC2QueryParser._inject_response_metadataa  sL    ..t44[[--
!/:JO.LK*+++ "!r   c                     t                                          ||          }d|v rd|                    d          i|d<   |S )N	RequestIDr  rD   )r   rM   r   )r   rT   r(   originalrt   s       r   rM   zEC2QueryParser._do_error_parseg  sN     77**8U;;(""X\\+66,H'( r   c                     |D ]?}|                      |          dk    r$|D ]!}|                      |          dk    r|c c S "@|S )Nr  rk   r   )r   r   r   errors_childs       r   r   zEC2QueryParser._get_error_root{  sl    " 	, 	,E~~e$$00$) , ,L~~l33w>>++++++ ?r   )r   r   r    r  rM   r   r   r   s   @r   r  r  `  sY        M M M    (      r   r  c                   >    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	S )
BaseJSONParserc                 t   i }|j         r|}n|j        }|d S i }|                     ||          r*|                     |          }|                     |          S |D ][}||         }|j                            d|          }|                    |          }	|	|                     ||         |	          ||<   \|S )Nr   )is_document_typer   r   r   r   rO   rP   r   )
r   r(   r>   final_parsedmember_shapesr   r   r   	json_name	raw_values
             r   r   z BaseJSONParser._handle_structure  s    ! 	 LL!MM} tL44UEBB E))%00??DDD,  ,[9(6::6;OO	!IIi00	(040A0A%k2I1 1L- r   c                     i }|j         }|j        }|                                D ]6\  }}|                     ||          }|                     ||          }|||<   7|S r   )r   r>   r   r   )	r   r(   r>   rU   r   r   r   
actual_keyactual_values	            r   r   zBaseJSONParser._handle_map  sl    I	k++-- 	. 	.JC**9c::J,,[%@@L!-F:r   c                 ,    |                      |          S r   r   r   s      r   r   zBaseJSONParser._handle_blob  s      '''r   c                 ,    |                      |          S r   r   r   s      r   r   z BaseJSONParser._handle_timestamp  s    %%e,,,r   c                    |                      |d                   }dddi d}|d         }|                    d|                    dd                    |d         d<   |                    d	          }|                    d
|ot          |                    }|Fd|v r|                    dd          d         }d|v r|                     |||          }||d         d<   |                     ||d                    |S )NrA   r&   ri   rh   rj   r@   messageri   rk   rB   r   #r   x-amzn-query-errorrh   )_parse_body_as_jsonrP   rl   rsplit _do_query_compatible_error_parser  )r   rT   r(   rA   errorr@   response_codecodes           r   rM   zBaseJSONParser._do_error_parse  s   ''(899&("552NN9% %)HHtxx	2..%
 %
gy!
 !]33xx-"FC4F4FGG d{{{{3**1-#w..<<'5  &*E'N6"&&uhy.ABBBr   c                     |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 `json`. We use this to
        do our lookup in the errorfactory for modeled errors.
        r5  ;   r   rk   QueryErrorCoder   Type)r   r   )r   r;  r@   r9  query_errorquery_error_componentss         r   r8  z/BaseJSONParser._do_query_compatible_error_parse  st     23!,!2!23!7!7%&&!++0Fq0I+/3E'N+,%;A%>E'N6")!,,r   c                 P    d|v r!|d         |                     di           d<   d S d S )Nx-amzn-requestidrD   r  )
setdefault)r   rU   r@   s      r   r  z(BaseJSONParser._inject_response_metadata  s?    ((EL"FF0"55kBBB )(r   c                     |si S |                     | j                  }	 t          j        |          }|S # t          $ r d|icY S w xY w)Nr3  )decoder   jsonloads
ValueError)r   body_contentsrA   original_parseds       r   r6  z"BaseJSONParser._parse_body_as_json  sm     	I##D$9::	%"j..O"" 	% 	% 	% t$$$$	%s   6 AAN)r   r   r    r   r   r   r   rM   r8  r  r6  r   r   r   r%  r%    s          2  ( ( (- - -     D    
% 
% 
% 
% 
%r   r%  c                   ,    e Zd Zd Zd Zd Zd Zd ZdS )BaseEventStreamParserc                 T   i }|j                             d          rQ|d                             d          }|j                            |          }|r|                     ||          ||<   n:|                     |||j        |           |                     |||j        |           |S )NrC   r@   z:event-type)rO   rP   r   rN   _parse_non_payload_attrs_parse_payload)r   rT   r(   r(  
event_typeevent_shapes         r   rN   zBaseEventStreamParser._do_parse  s    ""=11 	N!),00??J-++J77K +/>>k, ,Z( ))%   %MMMr   c           	         |d                              d          }|j                             |          }|a|                     |d                   }|                     ||          }d||                     d|                     dd                    di}n;d|d                              d	d          |d                              d
d          di}|S )Nr@   z:exception-typerA   rk   ri   r3  r&   rg   z:error-codez:error-message)rP   r   _initial_body_parser   )r   rT   r(   exception_typeexception_shaperL  rA   r9  s           r   rM   z%BaseEventStreamParser._do_error_parse  s    !),001BCC-++N;;&"66x7GHHO$$_oFFD*#xx	488Ir3J3JKK EE $Y/33M2FF'	2667GLL E r   c                    |j                             d          r|D ]}||         }|j                             d          ro|d         }|j        dk    r|}nQ|j        dk    r|                    | j                  }n+|                     |          }	|                     ||	          }|||<    d S |                     |d                   }
|                     ||
          }|                    |           d S d S )NeventeventpayloadrA   blobstring)rO   rP   r{   rG  r   rU  r   r   )r   rT   r(   r)  r(  r   r   rA   parsed_body	raw_parserL  body_parseds               r   rQ  z$BaseEventStreamParser._parse_payload  s(   ""7++ 	-%  ,T2-11.AA #F+D#-77&*%/8;;&*kk$2G&H&H$($<$<T$B$B	&*&7&7()' ' *5L&FF #66x7GHHO++E?CCK,,,,,'	- 	-r   c                     |d         }|D ]X}||         }|j                             d          r4||v r0||         }|j        dk    r|                     |dz            }|||<   Yd S )Nr@   r   	timestampg     @@)rO   rP   r{   r3   )	r   rT   r(   r)  r(  r@   r   r   r>   s	            r   rP  z.BaseEventStreamParser._parse_non_payload_attrs.  s     9%! 		/ 		/D(.L)--m<< /7??#DME#-<< !% 6 6uv~ F F).L&		/ 		/r   c                      t          d          NrU  rs   r   rK  s     r   rU  z)BaseEventStreamParser._initial_body_parse=      
 ""7888r   N)r   r   r    rN   rM   rQ  rP  rU  r   r   r   rN  rN    s_             *- - -,/ / /9 9 9 9 9r   rN  c                       e Zd Zd ZdS )EventStreamJSONParserc                 ,    |                      |          S r   r6  re  s     r   rU  z)EventStreamJSONParser._initial_body_parseF      ''666r   Nr   r   r    rU  r   r   r   rh  rh  E  s#        7 7 7 7 7r   rh  c                       e Zd Zd ZdS )EventStreamXMLParserc                 X    |st          j        d          S |                     |          S r   r   Elementr   r   r   s     r   rU  z(EventStreamXMLParser._initial_body_parseK  .     	%=$$$,,Z888r   Nrl  r   r   r   rn  rn  J  s#        9 9 9 9 9r   rn  c                   ,    e Zd ZeZ	 d Zd Zd Zd ZdS )
JSONParserc                     i }|=|j         }|r|                     |||          }n|                     |d         |          }|                     ||d                    |S )NrA   r@   )event_stream_name_handle_event_stream_handle_json_bodyr  )r   rT   r(   rU   
event_names        r   rN   zJSONParser._do_parseV  sq    0J I228UJOO//0@%HH&&vx	/BCCCr   c                 :    |                      |d         |          S )NrA   )ry  ru   s      r   rL   z"JSONParser._do_modeled_error_parsea  s    %%hv&6>>>r   c                     |j         |         }|                     ||          }	 |                                }n# t          $ r d}t	          |          w xY w|                     |j        |          }|||<   |S )Nz,First event was not of type initial-response)r   r   get_initial_responser   r.   ry  payload)	r   rT   r(   rz  event_stream_shapeevent_streamrY  r   rU   s	            r   rx  zJSONParser._handle_event_streamd  s    "]:600;MNN	1 5577EE% 	1 	1 	1FI%i000	1 ''u==)zs	   : Ac                 X    |                      |          }|                     ||          S r   )r6  r   )r   raw_bodyr(   parsed_jsons       r   ry  zJSONParser._handle_json_bodyp  s-     ..x88  444r   N)	r   r   r    rh  r7   rN   rL   rx  ry  r   r   r   ru  ru  Q  sY        32	 	 	? ? ?
 
 
5 5 5 5 5r   ru  c                   T     e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Z fd
Z xZS )BaseRestParserc                 h    i }|                      |          |d<   |                     |||           |S r  )_populate_response_metadata_add_modeled_parser   rT   r(   r(  s       r   rN   zBaseRestParser._do_parsey  sE    +/+K+K,
 ,
'( 	%>>>r   c                 |    ||S |j         }|                     ||||           |                     ||||           d S r   )r   rP  rQ  )r   rT   r(   r(  r)  s        r   r  z!BaseRestParser._add_modeled_parse  sW    =%%e]L	
 	
 	
 	He]LIIIIIr   c                 8    i }|                      |||           |S r   )r  r  s       r   rL   z&BaseRestParser._do_modeled_error_parse  s%    %>>>r   c                     i }|d         }d|v r|d         |d<   n(d|v r$|d         |d<   |                     dd          |d<   |S )Nr@   rD  r  x-amz-request-id
x-amz-id-2r&   HostIdr]   )r   rT   rb   r@   s       r   r  z*BaseRestParser._populate_response_metadata  si    9%(($+,>$?H[!!7**$+,>$?H[! ")\2!>!>HXr   c                 6   d|j         v r|j         d         }||         }|j                             d          r|                     ||          }|||<   d S |j        dv r>|d         }t	          |t
                    r|                    | j                  }|||<   d S |                     |d                   }| 	                    ||          ||<   d S |                     |d                   }| 	                    ||          }	|
                    |	           d S )Nr~  rC   )r\  r[  rA   )rO   rP   r   r{   rQ   bytesrG  r   rU  r   r   )
r   rT   r(   r)  r(  payload_member_name
body_shaperA   rL  r_  s
             r   rQ  zBaseRestParser._parse_payload  sA   +++ #("5i"@&':;J'++M:: 00:FF480111%);;;'dE** >;;t'<==D480111"&":":8F;K"L"L484E4E5 50111 #66x7GHHO++E?CCK,,,,,r   c                 ~   |d         }|D ]}||         }|j                             d          }|'|dk    r |                     ||d                   ||<   M|dk    r|                     ||          ||<   m|dk    r>|j                             d|          }	|	|v r|                     |||	                   ||<   d S )Nr@   r   
statusCoderB   headerr   )rO   rP   r   _parse_header_map)
r   rT   r(   r)  r(  r@   r   r   r   header_names
             r   rP  z'BaseRestParser._parse_non_payload_attrs  s    9%! 	 	D(.L#155jAAH\))%)%6%6 (="9& &T"" Y&&%)%;%; '& &T"" X%%*8<<VTJJ')))-):):$gk&:* *L&!	 	r   c                     i }|j                             dd                                          }|D ]K}|                                                    |          r"|t	          |          d          }||         ||<   L|S )Nr   r&   )rO   rP   lowerre   r   )r   r(   r@   rU   prefixr  r   s          r   r  z BaseRestParser._parse_header_map  s     $((44::<<" 	4 	4K  ""--f55 4 #3v;;==1&{3tr   c                      t          d          rc  rd  re  s     r   rU  z"BaseRestParser._initial_body_parse  rf  r   c                     |}t          |          r@t          j        |                              | j                  }t          j        |          }|S r   )r   r;   r<   rG  r   rH  rI  )r   r(   r>   rU   decodeds        r   r   zBaseRestParser._handle_string  sL    && 	)&u--44T5JKKGZ((Fr   c                     |j                             d          }|dk    r4t          |t                    sd |                    d          D             }t                                          ||          S )Nr   r  c                 6    g | ]}|                                 S r   )rd   ).0r   s     r   
<listcomp>z/BaseRestParser._handle_list.<locals>.<listcomp>  s     777!AGGII777r   ,)rO   rP   rQ   r   r   r   r   )r   r(   r}   r   rt   s       r   r   zBaseRestParser._handle_list  sj    &**:66x
4(>(>77tzz#777Dww##E4000r   )r   r   r    rN   r  rL   r  rQ  rP  r  rU  r   r   r   r   s   @r   r  r  x  s          J J J  
  - - -2  0  9 9 9  1 1 1 1 1 1 1 1 1r   r  c                   8     e Zd ZeZd Z fdZd Zd ZeZ	 xZ
S )RestJSONParserc                 ,    |                      |          S r   rj  re  s     r   rU  z"RestJSONParser._initial_body_parse  rk  r   c                 x    t                                          ||          }|                     ||           |S r   )r   rM   _inject_error_code)r   rT   r(   r9  rt   s       r   rM   zRestJSONParser._do_error_parse  s7    ''%88x000r   c                 6   |                      |d                   }d|d         v r6|d         d         }|                    d          d         }||d         d<   d S d|v sd|v r5|                    d|                    dd	                    |d         d<   d S d S )
NrA   zx-amzn-errortyper@   r   r   rk   rh   r;  r&   )rU  r   rP   )r   r9  rT   rA   r;  s        r   r  z!RestJSONParser._inject_error_code  s     ''(899)!444I&'9:D ::c??1%D%)E'N6"""t^^v~~%)XXfdhhvr6J6J%K%KE'N6"""  .~r   c                      t          |          S r   r   r   s      r   r   zRestJSONParser._handle_integer  s    5zzr   )r   r   r    rh  r7   rU  rM   r  r   r   r   r   s   @r   r  r    si        37 7 7    
L L L   #LLLLLr   r  c                   J     e Zd ZeZd Zd Zd Zd Ze	 fd            Z
 xZS )RestXMLParserc                 X    |st          j        d          S |                     |          S r   rp  rr  s     r   rU  z!RestXMLParser._initial_body_parse  rs  r   c                     |d         rB	 |                      |          S # t          $ r t                              dd           Y nw xY w|                     |          S )NrA   z2Exception caught when parsing error response body:T)exc_info)_parse_error_from_bodyr.   rG   rH   _parse_error_from_http_statusru   s      r   rM   zRestXMLParser._do_error_parse  s     F 
	228<<<&   		H!      
 11(;;;s    &AAc                     t          |d                   t          j        j                            |d         d          d|d                             dd          |d                             dd          ddS )	NrB   r&   rg   r@   r  r  )r  r  rj   )rl   rm   rn   ro   rP   rp   s     r   r  z+RestXMLParser._parse_error_from_http_status1  s     H]344;044]+R   &i0445GLL"9-11,CC! !
 
 	
r   c                    |d         }|                      |          }|                     |          }|                     |           |j        dk    rF|                     |          }|                    dd           |                    dd           ||dS d|v rd|                    d          i|d<   ddddi}t          ||           |S )	NrA   rk   r  r&   r  rj   rD   r2  )r   r   r   r   r  r   r	   )r   rT   r  r   rU   rb   defaults          r   r  z$RestXMLParser._parse_error_from_body?  s    ',,\::--d33F###8w 77AAH
 JJ{B'''JJx$$$#BBBF""*5vzz+7N7N)OF%&B778GV$$$r   c                 L    t                                          ||          }|S r   )r   r   )r   r(   r%   rt   s      r   r   zRestXMLParser._handle_stringV  s!    ww%%eT22r   )r   r   r    rn  r7   rU  rM   r  r  r,   r   r   r   s   @r   r  r    s        29 9 9
< < <6
 
 
  .     ]    r   r  )ec2queryrH  z	rest-jsonzrest-xml)(r   r;   http.clientrm   rH  loggingr   botocore.compatr   r   botocore.eventstreamr   r   botocore.utilsr   r   r	   r
   	getLoggerr   rG   r2   r   r   r,   	Exceptionr.   r0   r   r  r  r%  rN  rh  rn  ru  r  r  r  r   r   r   r   <module>r     s  g gP        				 0 0 0 0 0 0 0 0 D D D D D D D D            g!!* , , , , , , , ,*; ; ;  *	 	 	 	 	) 	 	 	}5 }5 }5 }5 }5 }5 }5 }5@n# n# n# n# n#N n# n# n#b1: 1: 1: 1: 1:' 1: 1: 1:h! ! ! ! ![ ! ! !Hk% k% k% k% k%^ k% k% k%\P9 P9 P9 P9 P9N P9 P9 P9f7 7 7 7 71> 7 7 7
9 9 9 9 902G 9 9 9$5 $5 $5 $5 $5 $5 $5 $5Nu1 u1 u1 u1 u1^ u1 u1 u1p# # # # #^^ # # #<K K K K KN$9 K K K^     r   