
    Pe'                        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'y)%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y)ResponseParserFactoryc                     i | _         y N)	_defaults)selfs    2/usr/lib/python3/dist-packages/botocore/parsers.py__init__zResponseParserFactory.__init__   s	        c                 :    | j                   j                  |       y)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                 8    t         |   } |di | j                  S )N )PROTOCOL_PARSERSr   )r   protocol_name
parser_clss      r   create_parserz#ResponseParserFactory.create_parser   s    %m4
+DNN++r   N)__name__
__module____qualname__r   r   r   r   r   r   r   r      s    
&,r   r   c                 4    t               j                  |       S r   )r   r   )protocols    r   r   r      s     "00::r   c                       fd}|S )Nc                 V    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   s8    >6*!&&D| !DD%&&r   r   )r*   r+   s   ` r   _text_contentr,      s    
' r   c                       e Zd Zy)ResponseParserErrorN)r   r   r    r   r   r   r.   r.      s    r   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y)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
                  | j                  ||      | _        y y 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__   s`    #7!133K'$(!''3(,(D(D +)D% 4r   c                 ,    t        j                  |      S r   )base64	b64decoder   values     r   r4   z#ResponseParser._default_blob_parser   s     &&r   c                 :   t         j                  d|d          t         j                  d|d          |d   dk\  r[| j                  |      r| j                  |      }nJ| j	                  |      r| j                  ||      }|S | j                  ||      }n| j                  ||      }|r|j                  j                  d      r|S t        |t              rD|j                  di       }|d   |d	<   |d   }t        |      |d
<   ||d<   | j                  ||       |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   s'   " 			((9*=>		&(89M"c)..x855h?--e455hF--h>^^He4F U((,,];M fd# &

+=r B2:=2I./ y)G/=g/Fm,):F%&00;LMr   c                 z    |j                  di       j                  di       }|j                  d      }|r||d<   y y )Ncontextchecksumresponse_algorithmChecksumAlgorithmrP   )r   rT   rV   checksum_context	algorithms        r   rS   z.ResponseParser._add_checksum_response_metadata  sE    #<<	26:::rJ$(()=>	5>12 r   c                 F    |d uxr |j                   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Kr   c                 z    |d   dk\  r3d|vs|d   y|d   j                         }|j                  d      xs | S y )NrB   i  rA   Ts   <html>)strip
startswith)r   rT   rA   s      r   rI   z)ResponseParser._is_generic_error_response  sT     M"c)X%&)9)AF#))+D??9-9T9 *r   c                     t         j                  d       t        |d         t        j                  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,  s[     			B	
 H]34;;0044]+R !#
 	
r   c                 F    t        d| j                  j                  z        )Nz%s._do_parseNotImplementedError	__class__r   r   rT   r(   s      r   rN   zResponseParser._do_parse=  s    !.4>>3J3J"JKKr   c                 F    t        | j                  j                   d      )Nz._do_error_parserr   ru   s      r   rM   zResponseParser._do_error_parse@  s     !T^^%<%<$==M"NOOr   c                 F    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                 \    t        | d|j                   | j                        } |||      S )N_handle_)getattr	type_name_default_handle)r   r(   nodehandlers       r   _parse_shapezResponseParser._parse_shapeH  s4    HU__-.0D0D
 ud##r   c                 r    g }|j                   }|D ]#  }|j                  | j                  ||             % |S r   )memberappendr   )r   r(   r}   rU   member_shapeitems         r   _handle_listzResponseParser._handle_listN  sA     || 	ADMM$++L$?@	Ar   c                     |S r   r   r   r(   r>   s      r   r|   zResponseParser._default_handleW  s    r   c                 d    | j                   }|d   j                  d      }t        |d   |||      S )NrY   operation_namerA   )r6   rP   r   )r   rT   r(   parsernames        r   _create_event_streamz#ResponseParser._create_event_streamZ  s9    **	"&&'788F+UFDAAr   c                     t        |      d   S Nr   )listr=   s     r   _get_first_keyzResponseParser._get_first_key_  s    E{1~r   c                 $   |j                   r|j                         }|j                  dd        t        |      dk7  rd}t	        ||j
                  z        | j                  |      }||j                  vrd}t        j                  ||z         yy)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      !JJLMh-=!Q&&  *)ejj*@AA%%m4C%--'( 
 s#r   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      so     "'/b?L:&
"LP

$B
*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 )BaseXMLResponseParserc                 Z    t         |   ||       t        j                  d      | _        y )Nz{.*})superr   recompile_namespace_re)r   r8   r9   rt   s      r   r   zBaseXMLResponseParser.__init__|  s$    );7ZZ/r   c                    i }|j                   }|j                  }|j                  j                  d      xs d}|j                  j                  d      xs d}|j                  j                  d      rt	        |t
              s|g}|D ]\  }|D ]P  }	| j                  |	      }
|
|k(  r| j                  ||	      },|
|k(  r| j                  ||	      }Dt        d|
z         |<   ^ |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    II	kk%3377?H5)77;;FCNw"";/
48N6D 
	(K* L>>+600#00KHH!44#00kJH-.?(.JKKL  (F8
	( r   c                 N    | j                   j                  d|j                        S Nr&   )r   subr   )r   r}   s     r   r   zBaseXMLResponseParser._node_tag  s    !!%%b$((33r   c                     |j                   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  s;     "";/
48N6Dw#E400r   c                    i }|j                   }|j                  j                  dd      r| j                  |      }| j	                  |      }| j                  ||      r"| j                  |      }| j                  |      S |D ]  }||   }d|j                  v s|j                  j                  d      r2| j                  ||      }	|j                  |	      }
|
| j                  ||
      ||<   m|j                  j                  d      si }|j                  d   }|j                  j                         D ];  \  }}| j                  j                  |j                  d      d   dz   |      }|||<   = ||v s||   ||<    |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''-D//500A%%h/C;;C@@" 	AK";/Ll888--11-@ ,,\;GH",,x0K&&*&7&7 +'{# ++//? , : :6 B"&++"3"3"5 -JC"0044%++C03c93G (-GG$	-
 !G+*1-*@F;'1	A2 r   c                 l    | j                  |      dk(  r|D ]  }| j                  |      dk(  s|c S  |S )NErrorResponserk   r   )r   original_rootchilds      r   r   z%BaseXMLResponseParser._get_error_root  s@    >>-(O;& !>>%(G3 L! r   c                     |j                   dk(  rD|j                  j                  d      r)|j                  j                  j                  d      }||S |j                  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  sw    
 ??f$)<)<)@)@)M*/,,*D*D*H*H+' +622--11&9&""r   c                     t        |t              r| j                  |d         S i }|D ]O  }| j                  |      }||v r3t        ||   t              r||   j	                  |       @||   |g||<   K|||<   Q |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SM((. &.c]D$9HSM $	% r   c                     	 t        j                  t        j                         | j                        }|j	                  |       |j                         }|S # t        $ r}t        d|d|      d }~ww xY 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es        r   _parse_xml_string_to_domz.BaseXMLResponseParser._parse_xml_string_to_dom  st    	__((*T5J5JF KK
#<<>D   	% j" 	s   AA 	A7!A22A7c                     |j                         D ]E  \  }}t        |      r&| j                  |      }| j                  |      ||<   7|j                  ||<   G |S r   )r   r   r   _replace_nodesr%   )r   rU   r   r>   sub_dicts        r   r   z$BaseXMLResponseParser._replace_nodes  sZ     ,,. 	)JCE{77>"11(;s#jjs	) r   c                     |dk(  ryy)NtrueTFr   r   r(   r%   s      r   _handle_booleanz%BaseXMLResponseParser._handle_boolean  s    6>r   c                     t        |      S r   )floatr   s      r   _handle_floatz#BaseXMLResponseParser._handle_float  s    T{r   c                 $    | j                  |      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    4yr   c                     |S r   r   r   s      r   _handle_stringz$BaseXMLResponseParser._handle_string  s    r   c                 $    | j                  |      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   {  s    0*41"H .     , ,     ' ' '"N"Lr   r   c                   2    e Zd Zd Zd Zd ZddZd Zd Zy)	QueryParserc                     |d   }| j                  |      }| j                  |      }| j                  |       d|v r |j                  |j	                  d             d|v rd|j	                  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F# vMM&**X./& *5vzz+7N)OF%&r   c                 *    | j                  ||d      S )NFinject_metadata_parse_body_as_xmlru   s      r   rL   z#QueryParser._do_modeled_error_parse=  s    &&x&NNr   c                 *    | j                  ||d      S )NTr  r
  ru   s      r   rN   zQueryParser._do_parse@  s    &&x&MMr   c                     |d   }| j                  |      }i }|A|}d|j                  v r| j                  |j                  d   |      }| j                  ||      }|r| j	                  ||       |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4F**48r   c                 .    | j                  |      }||   S r   )r   )r   element_namexml_root_nodemappings       r   r  z&QueryParser._find_result_wrapped_shapeR  s    ..}=|$$r   c                     | j                  |      }|j                  d      }|>| j                  |      }|j                         D ]  \  }}|j                  ||<    ||d<   y y NrD   )r   rP   r   r%   )r   r}   inject_intor  
child_nodesub_mappingr   r>   s           r   r  z%QueryParser._inject_response_metadataV  sq    ..t4[[!34
!66zBK)//1 .
U#(::C ..9K*+	 "r   N)T)	r   r   r    rM   rL   rN   r  r  r  r   r   r   r  r  ,  s"     ON%:r   r  c                   *     e Zd Zd Z fdZd Z xZS )EC2QueryParserc                 p    | j                  |      }|j                  d      }|d|j                  i|d<   y y )N	requestIdr  rD   )r   rP   r%   )r   r}   r  r  r  s        r   r  z(EC2QueryParser._inject_response_metadataa  s?    ..t4[[-
!/:JOO.LK*+ "r   c                 \    t         |   ||      }d|v rd|j                  d      i|d<   |S )N	RequestIDr  rD   )r   rM   r   )r   rT   r(   originalrt   s       r   rM   zEC2QueryParser._do_error_parseg  s@     7*8U;("X\\+6,H'( r   c                     |D ]8  }| j                  |      dk(  s|D ]  }| j                  |      dk(  s|c c S  : |S )Nr  rk   r   )r   r   r   errors_childs       r   r   zEC2QueryParser._get_error_root{  sP    " 	,E~~e$0$) ,L~~l3w>++,	,
 r   )r   r   r    r  rM   r   r   r   s   @r   r  r  `  s    M(r   r  c                   <    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
y	)
BaseJSONParserc                 \   i }|j                   r|}|S |j                  }|y i }| j                  ||      r"| j                  |      }| j	                  |      S |D ]O  }||   }|j
                  j                  d|      }|j                  |      }	|	8| j                  ||   |	      ||<   Q |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    !! L( % "MMM} L44UEB))%0??DD, ,[9(66::6;O	!IIi0	(040A0A%k2I1L- r   c                     i }|j                   }|j                  }|j                         D ].  \  }}| j                  ||      }| j                  ||      }|||<   0 |S r   )r   r>   r   r   )	r   r(   r>   rU   r   r   r   
actual_keyactual_values	            r   r   zBaseJSONParser._handle_map  sg    II	kk++- 	.JC**9c:J,,[%@L!-F:	. r   c                 $    | j                  |      S r   r   r   s      r   r   zBaseJSONParser._handle_blob  s      ''r   c                 $    | j                  |      S r   r   r   s      r   r   z BaseJSONParser._handle_timestamp  s    %%e,,r   c                    | j                  |d         }dddi d}|d   }|j                  d|j                  dd            |d   d<   |j                  d	      }|j                  d
|xr t        |            }|8d|v r|j                  dd      d   }d|v r| j	                  |||      }||d   d<   | j                  ||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&("52N9% %)HHtxx	2.%
gy!
 !]3xx-"FC4FG d{{{3*1-#w.<<'5 &*E'N6"&&uhy.ABr   c                     |d   }|j                  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  sh     23!,!2!23!7%&!+0Fq0I/3E'N+,%;A%>E'N6")!,,r   c                 >    d|v r|d   |j                  di       d<   y y )Nx-amzn-requestidrD   r  )
setdefault)r   rU   r@   s      r   r  z(BaseJSONParser._inject_response_metadata  s0    (EL"FF0"5kB )r   c                     |si S |j                  | 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  sU    I##D$9$9:	%"jj.O"" 	% t$$	%s   8 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y)BaseEventStreamParserc                 H   i }|j                   j                  d      rH|d   j                  d      }|j                  j                  |      }|r| j                  ||      ||<   |S | j	                  |||j                  |       | 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!),00?J--++J7K+/>>k,Z( 	 ))% %Mr   c           	      `   |d   j                  d      }|j                  j                  |      }|O| j                  |d         }| j                  ||      }d||j                  d|j                  dd            di}|S d|d   j                  d	d      |d   j                  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--++N;&"66x7GHO$$_oFD*#xx	488Ir3JKE  $Y/33M2F'	2667GLE r   c                    |j                   j                  d      r|D ]  }||   }|j                   j                  d      s$|d   }|j                  dk(  r|}nN|j                  dk(  r|j                  | j                        }n#| j                  |      }	| j                  ||	      }|||<    y  | j                  |d         }
| j                  ||
      }|j                  |       y y )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#F+D#--7&*%//8;&*kk$2G2G&H$($<$<T$B	&*&7&7()' *5L&  #66x7GHO++E?CK,' ,r   c                     |d   }|D ]U  }||   }|j                   j                  d      s$||v s)||   }|j                  dk(  r| j                  |dz        }|||<   W y )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.  sy     9%! 		/D(.L))--m<7?#DME#--< !% 6 6uv~ F).L&		/r   c                     t        d      NrU  rs   r   rK  s     r   rU  z)BaseEventStreamParser._initial_body_parse=      
 ""788r   N)r   r   r    rN   rM   rQ  rP  rU  r   r   r   rN  rN    s     *-,/9r   rN  c                       e Zd Zd Zy)EventStreamJSONParserc                 $    | j                  |      S r   r6  re  s     r   rU  z)EventStreamJSONParser._initial_body_parseF      ''66r   Nr   r   r    rU  r   r   r   rh  rh  E  s    7r   rh  c                       e Zd Zd Zy)EventStreamXMLParserc                 R    |st        j                  d      S | j                  |      S r   r   Elementr   r   r   s     r   rU  z(EventStreamXMLParser._initial_body_parseK  %    ==$$,,Z88r   Nrl  r   r   r   rn  rn  J  s    9r   rn  c                   *    e Zd ZeZ	 d Zd Zd Zd Zy)
JSONParserc                     i }|7|j                   }|r| j                  |||      }n| j                  |d   |      }| j                  ||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  s`    00J228UJO//0@%H&&vx	/BCr   c                 ,    | j                  |d   |      S )NrA   )ry  ru   s      r   rL   z"JSONParser._do_modeled_error_parsea  s    %%hv&6>>r   c                     |j                   |   }| j                  ||      }	 |j                         }| j                  |j                  |      }|||<   |S # t        $ r d}t	        |      w xY w)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	1 557E ''u=)z & 	1FI%i00	1s   A A-c                 H    | j                  |      }| j                  ||      S r   )r6  r   )r   raw_bodyr(   parsed_jsons       r   ry  zJSONParser._handle_json_bodyp  s'     ..x8  44r   N)	r   r   r    rh  r7   rN   rL   rx  ry  r   r   r   ru  ru  Q  s    32	?
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                 X    i }| j                  |      |d<   | j                  |||       |S r  )_populate_response_metadata_add_modeled_parser   rT   r(   r(  s       r   rN   zBaseRestParser._do_parsey  s:    +/+K+K,
'( 	%>r   c                 t    ||S |j                   }| j                  ||||       | j                  ||||       y r   )r   rP  rQ  )r   rT   r(   r(  r)  s        r   r  z!BaseRestParser._add_modeled_parse  sC    =%%e]L	
 	He]LIr   c                 0    i }| j                  |||       |S r   )r  r  s       r   rL   z&BaseRestParser._do_modeled_error_parse  s    %>r   c                 r    i }|d   }d|v r
|d   |d<   |S d|v r|d   |d<   |j                  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  sf    9%($+,>$?H[!   7*$+,>$?H[! ")\2!>HXr   c                    d|j                   v r|j                   d   }||   }|j                   j                  d      r| j                  ||      }|||<   y |j                  dv r6|d   }t	        |t
              r|j                  | j                        }|||<   y | j                  |d         }| j                  ||      ||<   y | j                  |d         }| j                  ||      }	|j                  |	       y )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  s   +++ #("5"5i"@&':;J''++M:00:F4801%%);;'dE*;;t'<'<=D4801"&":":8F;K"L484E4E501 #66x7GHO++E?CK,r   c                 R   |d   }|D ]  }||   }|j                   j                  d      }|&|dk(  r| j                  ||d         ||<   D|dk(  r| j                  ||      ||<   _|dk(  se|j                   j                  d|      }	|	|v s| j                  |||	         ||<    y )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155jAH\)%)%6%6 (="9&T" Y&%)%;%; '&T" X%*88<<VTJ'))-):):$gk&:*L&!	r   c                     i }|j                   j                  dd      j                         }|D ]8  }|j                         j                  |      s#|t	        |      d  }||   ||<   : |S )Nr   r&   )rO   rP   lowerre   r   )r   r(   r@   rU   prefixr  r   s          r   r  z BaseRestParser._parse_header_map  sw     $$((4::<" 	4K  "--f5 #3v;=1&{3t	4 r   c                     t        d      rc  rd  re  s     r   rU  z"BaseRestParser._initial_body_parse  rf  r   c                     |}t        |      rCt        j                  |      j                  | j                        }t        j                  |      }|S r   )r   r;   r<   rG  r   rH  rI  )r   r(   r>   rU   decodeds        r   r   zBaseRestParser._handle_string  sC    &&&u-44T5J5JKGZZ(Fr   c                     |j                   j                  d      }|dk(  r<t        |t              s,|j	                  d      D cg c]  }|j                          }}t        |   ||      S c c}w )Nr   r  ,)rO   rP   rQ   r   r   rd   r   r   )r   r(   r}   r   r   rt   s        r   r   zBaseRestParser._handle_list  sb    &&**:6x
4(>'+zz#7!AGGI7D7w#E400 8s   A.)r   r   r    rN   r  rL   r  rQ  rP  r  rU  r   r   r   r   s   @r   r  r  x  s;    J
-209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                 $    | j                  |      S r   rj  re  s     r   rU  z"RestJSONParser._initial_body_parse  rk  r   c                 L    t         |   ||      }| j                  ||       |S r   )r   rM   _inject_error_code)r   rT   r(   r9  rt   s       r   rM   zRestJSONParser._do_error_parse  s)    '%8x0r   c                     | j                  |d         }d|d   v r%|d   d   }|j                  d      d   }||d   d<   y d|v sd|v r)|j                  d|j                  dd	            |d   d<   y y )
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)!44I&'9:D ::c?1%D%)E'N6"t^v~%)XXfdhhvr6J%KE'N6"  .r   c                     t        |      S r   r   r   s      r   r   zRestJSONParser._handle_integer  s    5zr   )r   r   r    rh  r7   rU  rM   r  r   r   r   r   s   @r   r  r    s%    37
L #Lr   r  c                   D     e Zd ZeZd Zd Zd Zd Ze	 fd       Z
 xZS )RestXMLParserc                 R    |st        j                  d      S | j                  |      S r   rp  rr  s     r   rU  z!RestXMLParser._initial_body_parse  rs  r   c                     |d   r	 | j                  |      S | j	                  |      S # t        $ r t        j                  dd       Y 3w xY w)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<< 11(;; ' 		H!  s   )  AAc                     t        |d         t        j                  j                  j	                  |d   d      d|d   j	                  dd      |d   j	                  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  st     H]34;;0044]+R &i0445GL"9-11,C!
 	
r   c                 b   |d   }| j                  |      }| j                  |      }| j                  |       |j                  dk(  r:| j	                  |      }|j                  dd       |j                  dd       ||dS d|v rd|j                  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F#88w 77AH
 JJ{B'JJx$#BBF"*5vzz+7N)OF%&B78GV$r   c                 (    t         |   ||      }|S r   )r   r   )r   r(   r%   rt   s      r   r   zRestXMLParser._handle_stringV  s    w%eT2r   )r   r   r    rn  r7   rU  rM   r  r  r,   r   r   r   s   @r   r  r    s1    2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     s0  gP     	 0 D  g!* , ,*;*	) 	}5 }5@n#N n#b1:' 1:h![ !Hk%^ k%\P9N P9f71> 7
902G 9$5 $5Nu1^ u1p#^^ #<KN$9 K^  r   