o ˆü?cU®ã@svdZddlZddlZddlZddlZddlmZmZmZddl m Z m Z ddl m Z mZmZmZe e¡ZeZGdd„dƒZdd „Zd d „ZGd d „d eƒZGdd„dƒZGdd„deƒZGdd„deƒZGdd„deƒZGdd„deƒZGdd„deƒZGdd„deeƒZ Gdd„deeƒZ!Gdd„deƒZ"Gd d!„d!eƒZ#Gd"d#„d#e#eƒZ$Gd$d%„d%e#eƒZ%eee"e$e%d&œZ&dS)'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": } } Error response { "ResponseMetadata": {"RequestId": } "Error": { "Code": , "Message": , "Type": , } } éN)ÚETreeÚ XMLParseErrorÚsix)Ú EventStreamÚNoInitialResponseError)Úis_json_value_headerÚlowercase_dictÚ merge_dictsÚparse_timestampc@s$eZdZdd„Zdd„Zdd„ZdS)ÚResponseParserFactorycCs i|_dS©N)Ú _defaults)Úself©rúk/private/var/folders/cw/wlscbxl13mj6wd668h7l9g9sllkg5j/T/pip-target-b31awkwq/lib/python/botocore/parsers.pyÚ__init__‰ó zResponseParserFactory.__init__cKs|j |¡dS)aOSet 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ÚkwargsrrrÚset_parser_defaultsŒs z)ResponseParserFactory.set_parser_defaultscCst|}|di|j¤ŽS)Nr)ÚPROTOCOL_PARSERSr )rZ protocol_nameZ parser_clsrrrÚ create_parser˜sz#ResponseParserFactory.create_parserN)Ú__name__Ú __module__Ú __qualname__rrrrrrrr ˆs r cCs tƒ |¡Sr )r r)Úprotocolrrrr�ó rcs‡fdd„}|S)Ncs.t|dƒr|j}|durd}n|}ˆ|||ƒS)NÚtextÚ)Úhasattrr)rÚshapeÚnode_or_stringr©ÚfuncrrÚ_get_text_content§s € z(_text_content.._get_text_contentr)r#r$rr"rÚ _text_content¡s  r%c@s eZdZdS)ÚResponseParserErrorN)rrrrrrrr&¶sr&c@s¢eZdZdZdZdZd&dd„Zdd„Zdd „Zd d „Z d d „Z dd„Z dd„Z dd„Z dd„Zdd„Zdd„Zdd„Zdd„Zdd„Zd d!„Zd"d#„Zd$d%„ZdS)'ÚResponseParseraoBase 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. zutf-8NcCsL|durt}||_|dur|j}||_d|_|jdur$| ||¡|_dSdSr )ÚDEFAULT_TIMESTAMP_PARSERÚ_timestamp_parserÚ_default_blob_parserÚ _blob_parserÚ_event_stream_parserÚEVENT_STREAM_PARSER_CLS©rZtimestamp_parserZ blob_parserrrrrËs  ÿÿzResponseParser.__init__cCs t |¡Sr )Úbase64Ú b64decode©rÚvaluerrrr*Øs z#ResponseParser._default_blob_parsercCsØt d|d¡t d|d¡|ddkr5| |¡r!| |¡}n| |¡r.| ||¡}|S| ||¡}n| ||¡}|rE|j  d¡rE|St |t ƒrj|  di¡}|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. zResponse headers: %sÚheaderszResponse body: %sÚbodyÚ status_codei-Ú eventstreamÚResponseMetadataZHTTPStatusCodeZ 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_metadatar3rrrÚparseÞs(           zResponseParser.parsecCs2| di¡ di¡}| d¡}|r||d<dSdS)NÚcontextZchecksumZresponse_algorithmZChecksumAlgorithm©rA)rrErGZchecksum_contextÚ algorithmrrrrDs   ÿz.ResponseParser._add_checksum_response_metadatacCs|duo |j dd¡S)NÚ exceptionF)ÚmetadatarA)rr rrrr<sz&ResponseParser._is_modeled_error_shapecCsD|ddkr d|vs|ddurdS|d ¡}| d¡p| SdS)Nr5iôr4Ts)ÚstripÚ startswith)rrEr4rrrr:s  ûz)ResponseParser._is_generic_error_responsecCs4t d¡t|dƒtjjj |dd¡dœidœS)NzlReceived a non protocol specific error response from the service, unable to populate error code and message.r5r©ÚCodeÚMessage©ÚErrorr7)r8r9ÚstrrÚmovesÚ http_clientÚ responsesrA©rrErrrr;+sÿ  ÿþùz&ResponseParser._do_generic_error_parsecCstd|jjƒ‚)Nz %s._do_parse©ÚNotImplementedErrorÚ __class__r©rrEr rrrr?<ózResponseParser._do_parsecCót|jj›d�ƒ‚)Nz._do_error_parserZr]rrrr>?szResponseParser._do_error_parsecCr_)Nz._do_modeled_error_parserZ)rrEr rFrrrr=Bs ÿz&ResponseParser._do_modeled_error_parsecCs t|d|j›�|jƒ}|||ƒS)NZ_handle_)ÚgetattrÚ type_nameÚ_default_handle)rr ÚnodeÚhandlerrrrÚ _parse_shapeGsÿ zResponseParser._parse_shapecCs*g}|j}|D] }| | ||¡¡q|Sr )ÚmemberÚappendre)rr rcrFÚ member_shapeÚitemrrrÚ _handle_listMs zResponseParser._handle_listcCó|Sr r©rr r2rrrrbVszResponseParser._default_handlecCs&|j}|d d¡}t|d|||ƒS)NrIZoperation_namer4)r,rAr)rrEr ÚparserÚnamerrrÚ_create_event_streamYsz#ResponseParser._create_event_streamcCs t|ƒdS©Nr)Úlistr1rrrÚ_get_first_key^rzResponseParser._get_first_keycCsR|jr't|ƒdkrd}t||jƒ‚| |¡}||jvr'd}t ||¡dSdS)Né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)Zis_tagged_unionÚlenr&rnrrÚmembersr8Úinfo)rr r2Ú error_msgÚtagÚmsgrrrÚ _has_unknown_tagged_union_memberas ÿ  ÿz/ResponseParser._has_unknown_tagged_union_membercCs dd|iiS)NZSDK_UNKNOWN_MEMBERrnr)rrxrrrÚ#_handle_unknown_tagged_union_membertrz2ResponseParser._handle_unknown_tagged_union_member©NN)rrrÚ__doc__ÚDEFAULT_ENCODINGr-rr*rHrDr<r:r;r?r>r=rerjrbrorrrzr{rrrrr'ºs*   1  r'cs¾eZdZd"‡fdd„ Zdd„Zdd„Z‡fdd „Zd d „Zd d „Zdd„Z dd„Z dd„Z dd„Z e dd„ƒZe dd„ƒZe dd„ƒZe dd„ƒZe dd„ƒZe d d!„ƒZeZeZeZ‡ZS)#ÚBaseXMLResponseParserNcstƒ ||¡t d¡|_dS)Nz{.*})ÚsuperrÚreÚcompileÚ _namespace_rer.©r\rrryszBaseXMLResponseParser.__init__c Cs¬i}|j}|j}|j d¡pd}|j d¡pd}|j d¡r&t|tƒs&|g}|D]+}|D]"} | | ¡} | |kr>| || ¡} q,| |krI| || ¡} q,td| ƒ‚| || <q(|S)NrnÚkeyr2Ú flattenedzUnknown tag: %s) r…r2r@rArBrqÚ _node_tagrer&) rr rcrFÚ key_shapeÚ value_shapeZkey_location_nameZvalue_location_nameZ keyval_nodeZ single_pairZtag_nameZkey_nameZval_namerrrÚ _handle_map}s"   z!BaseXMLResponseParser._handle_mapcCs|j d|j¡S©Nr)rƒÚsubrx)rrcrrrr‡’r^zBaseXMLResponseParser._node_tagcs*|j d¡rt|tƒs|g}tƒ ||¡S)Nr†)r@rArBrqr€rj)rr rcr„rrrj•sz"BaseXMLResponseParser._handle_listcCsi}|j}|j dd¡r| |¡}| |¡}| ||¡r&| |¡}| |¡S|D]]}||}d|jvs9|j d¡r:q(|  ||¡} | | ¡} | durR|  || ¡||<q(|j d¡r…i} |jd} |j   ¡D]\} }|j  |  d¡dd| ¡}|| |<qd| | vr…| | ||<q(|S) NrLFÚlocationÚ eventheaderZ xmlAttributernú:r)rurMrAÚ_get_error_rootÚ_build_name_to_xml_noderzrrr{r@Ú_member_key_namereÚattribÚitemsrƒrŒÚsplit)rr rcrFruÚxml_dictrxÚ member_namerhZxml_nameZ member_nodeÚattribsZ location_namer…r2Znew_keyrrrÚ_handle_structureŸsB     ÿ þ   ÿ  ÿ  €z'BaseXMLResponseParser._handle_structurecCs2| |¡dkr|D] }| |¡dkr|Sq |S)NZ ErrorResponserT©r‡)rÚ original_rootÚchildrrrr�Ãs ÿz%BaseXMLResponseParser._get_error_rootcCsL|jdkr|j d¡r|jj d¡}|dur|S|j d¡}|dur$|S|S)Nrqr†rn)rar@rArf)rr r—Zlist_member_serialized_nameZserialized_namerrrr’Êsÿ z&BaseXMLResponseParser._member_key_namecCstt|tƒr | |d¡Si}|D]'}| |¡}||vr3t||tƒr*|| |¡q|||g||<q|||<q|Srp)rBrqr‘r‡rg)rZ parent_noder–rir…rrrr‘Ús   z-BaseXMLResponseParser._build_name_to_xml_nodec CsVztjt ¡|jd�}| |¡| ¡}W|Sty*}ztd||fƒ‚d}~ww)N)ÚtargetÚencodingzTUnable to parse response (%s), invalid XML received. Further retries may succeed: %s)rÚ XMLParserÚ TreeBuilderr~ÚfeedÚcloserr&)rÚ xml_stringrmÚrootÚerrrÚ_parse_xml_string_to_domñs ÿ  úþÿ€ÿz.BaseXMLResponseParser._parse_xml_string_to_domcCsB| ¡D]\}}t|ƒr| |¡}| |¡||<q|j||<q|Sr )r”rqr‘Ú_replace_nodesr)rrFr…r2Zsub_dictrrrr§s   z$BaseXMLResponseParser._replace_nodescCs|dkrdSdS)NÚtrueTFr©rr rrrrÚ_handle_boolean sz%BaseXMLResponseParser._handle_booleancCót|ƒSr )Úfloatr©rrrÚ _handle_floatóz#BaseXMLResponseParser._handle_floatcCó | |¡Sr ©r)r©rrrÚ_handle_timestampó z'BaseXMLResponseParser._handle_timestampcCr«r ©Úintr©rrrÚ_handle_integerr®z%BaseXMLResponseParser._handle_integercCrkr rr©rrrÚ_handle_stringsz$BaseXMLResponseParser._handle_stringcCr¯r ©r+r©rrrÚ _handle_blob r²z"BaseXMLResponseParser._handle_blobr|)rrrrrŠr‡rjr™r�r’r‘r¦r§r%rªr­r±rµr¶r¸Z_handle_characterZ_handle_doubleÚ _handle_longÚ __classcell__rrr„rrxs4  $       rc@s>eZdZdd„Zdd„Zdd„Zddd „Zd d „Zd d „ZdS)Ú QueryParsercCs\|d}| |¡}| |¡}| |¡d|vr| | d¡¡d|vr,d| d¡i|d<|S)Nr4ÚErrorsÚ RequestIdr7)r¦r‘r§rÚpop)rrEr Ú xml_contentsr¤rFrrrr>*s   zQueryParser._do_error_parsecCó|j||dd�S)NF©Úinject_metadata©Ú_parse_body_as_xmlr]rrrr=:r^z#QueryParser._do_modeled_error_parsecCrÀ)NTrÁrÃr]rrrr?=r^zQueryParser._do_parseTcCs^|d}| |¡}i}|dur%|}d|jvr| |jd|¡}| ||¡}|r-| ||¡|S)Nr4Z resultWrapper)r¦r@Ú_find_result_wrapped_shapereÚ_inject_response_metadata)rrEr rÂr¿r¤rFÚstartrrrrÄ@s   ÿ  zQueryParser._parse_body_as_xmlcCs| |¡}||Sr )r‘)rZ element_nameZ xml_root_nodeÚmappingrrrrÅOs z&QueryParser._find_result_wrapped_shapecCsR| |¡}| d¡}|dur'| |¡}| ¡D] \}}|j||<q||d<dSdS©Nr7)r‘rAr”r)rrcÚ inject_intorÈÚ child_nodeZ sub_mappingr…r2rrrrÆSs     üz%QueryParser._inject_response_metadataN)T) rrrr>r=r?rÄrÅrÆrrrrr»)s  r»cs,eZdZdd„Z‡fdd„Zdd„Z‡ZS)ÚEC2QueryParsercCs2| |¡}| d¡}|durd|ji|d<dSdS)NZ requestIdr½r7)r‘rAr)rrcrÊrÈrËrrrrÆ^s  ÿz(EC2QueryParser._inject_response_metadatacs,tƒ ||¡}d|vrd| d¡i|d<|S)NZ RequestIDr½r7)r€r>r¾)rrEr Úoriginalr„rrr>ds   ÿzEC2QueryParser._do_error_parsecCs@|D]}| |¡dkr|D]}| |¡dkr|Sq q|S)Nr¼rTrš)rr›rœZ errors_childrrrr�xs ÿ€zEC2QueryParser._get_error_root)rrrrÆr>r�rºrrr„rrÌ]s rÌc@sDeZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd d„Z dS)ÚBaseJSONParserc Cs’i}|jr |}|S|j}|durdSi}| ||¡r$| |¡}| |¡S|D] }||}|j d|¡}| |¡} | durF| ||| ¡||<q&|S)Nrn)Zis_document_typerurzrrr{r@rAre) rr r2Ú final_parsedÚ member_shapesrxr—rhÚ json_nameZ raw_valuerrrr™‚s*î    ÿ€z BaseJSONParser._handle_structurec CsFi}|j}|j}| ¡D]\}}| ||¡}| ||¡}|||<q |Sr )r…r2r”re) rr r2rFrˆr‰r…Z actual_keyZ actual_valuerrrrŠ›s   zBaseJSONParser._handle_mapcCr¯r r·rlrrrr¸¥rzBaseJSONParser._handle_blobcCr¯r r°rlrrrr±¨rz BaseJSONParser._handle_timestampcCs˜| |d¡}dddœidœ}| d| dd¡¡|dd<| d¡}| d |o*t|ƒ¡}|durBd |vr<| d d ¡d }||dd <| ||d ¡|S)Nr4r©rRrQrSÚmessagerRrTr5Z__typeú#rsrQr3)Ú_parse_body_as_jsonrArUÚrsplitrÆ)rrEr r4ÚerrorZ response_codeÚcoderrrr>«s  ÿ  zBaseJSONParser._do_error_parsecCs$d|vr|d| di¡d<dSdS)Núx-amzn-requestidr7r½)Ú setdefault)rrFr3rrrrÆÇs ÿÿz(BaseJSONParser._inject_response_metadatacCs@|siS| |j¡}zt |¡}|WStyd|iYSw)NrÓ)Údecoder~ÚjsonÚloadsÚ ValueError)rÚ body_contentsr4Úoriginal_parsedrrrrÕÍs    ýz"BaseJSONParser._parse_body_as_jsonN) rrrr™rŠr¸r±r>rÆrÕrrrrrÎ�s  rÎc@s4eZdZdd„Zdd„Zdd„Zdd„Zd d „Zd S) ÚBaseEventStreamParsercCsji}|j d¡r!|d d¡}|j |¡}|r| ||¡||<|S| |||j|¡| |||j|¡|S)Nr6r3z :event-type)r@rArur?Ú_parse_non_payload_attrsÚ_parse_payload)rrEr rÏZ event_typeZ event_shaperrrr?Ûs  ÿü ÿzBaseEventStreamParser._do_parsec Csˆ|d d¡}|j |¡}|dur/| |d¡}| ||¡}d|| d| dd¡¡dœi}|Sd|d d d¡|d d d¡dœi}|S) Nr3z:exception-typer4rTrRrÓrrPz :error-codez:error-message)rAruÚ_initial_body_parsere)rrEr Zexception_typeZexception_shaperàr4r×rrrr>ës"  þÿ ûþÿz%BaseEventStreamParser._do_error_parsec Csª|j d¡rS|D]6}||}|j d¡r>|d}|jdkr |}n|jdkr,| |j¡}n | |¡} | || ¡}|||<dSq| |d¡} | || ¡} | | ¡dSdS)NÚeventZ eventpayloadr4ÚblobÚstring)r@rArarÛr~rärer) rrEr rÐrÏrnrhr4Z parsed_bodyZ raw_parseràÚ body_parsedrrrrãs(     ÿô íz$BaseEventStreamParser._parse_payloadc CsZ|d}|D]$}||}|j d¡r*||vr*||}|jdkr&| |d¡}|||<qdS)Nr3rŽÚ timestampg@�@)r@rArar)) rrEr rÐrÏr3rnrhr2rrrrâs  €÷z.BaseEventStreamParser._parse_non_payload_attrscCótdƒ‚©Nrä©r[©rrßrrrrä%óz)BaseEventStreamParser._initial_body_parseN)rrrr?r>rãrârärrrrráÚs  rác@óeZdZdd„ZdS)ÚEventStreamJSONParsercCó | |¡Sr ©rÕrírrrrä.rz)EventStreamJSONParser._initial_body_parseN©rrrrärrrrrð-ó rðc@rï)ÚEventStreamXMLParsercCó|st d¡S| |¡Sr‹©rÚElementr¦©rr£rrrrä3ó  z(EventStreamXMLParser._initial_body_parseNrórrrrrõ2rôrõc@s2eZdZeZ dd„Zdd„Zdd„Zdd„Zd S) Ú JSONParsercCsJi}|dur|j}|r| |||¡}n| |d|¡}| ||d¡|S)Nr4r3)Zevent_stream_nameÚ_handle_event_streamÚ_handle_json_bodyrÆ)rrEr rFÚ event_namerrrr??szJSONParser._do_parsecCs| |d|¡S)Nr4)rýr]rrrr=Jr^z"JSONParser._do_modeled_error_parsec CsX|j|}| ||¡}z| ¡}Wn tyd}t|ƒ‚w| |j|¡}|||<|S)Nz,First event was not of type initial-response)ruroZget_initial_responserr&rýÚpayload) rrEr rþZevent_stream_shapeZ event_streamrårwrFrrrrüMs    þzJSONParser._handle_event_streamcCs| |¡}| ||¡Sr )rÕre)rZraw_bodyr Z parsed_jsonrrrrýYs  zJSONParser._handle_json_bodyN) rrrrðr-r?r=rürýrrrrrû9s  rûcsdeZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd d„Z dd„Z dd„Z ‡fdd„Z ‡Z S)ÚBaseRestParsercCs$i}| |¡|d<| |||¡|SrÉ)Ú_populate_response_metadataÚ_add_modeled_parse©rrEr rÏrrrr?bs ÿzBaseRestParser._do_parsecCs6|dur|S|j}| ||||¡| ||||¡dSr )rurârã)rrEr rÏrÐrrrrjsÿz!BaseRestParser._add_modeled_parsecCsi}| |||¡|Sr )rrrrrr=ssz&BaseRestParser._do_modeled_error_parsecCsLi}|d}d|vr|d|d<|Sd|vr$|d|d<| dd¡|d<|S)Nr3rÙr½úx-amz-request-idú x-amz-id-2rÚHostIdrJ)rrErMr3rrrrxs ú z*BaseRestParser._populate_response_metadatac Cs¾d|jvrK|jd}||}|j d¡r | ||¡}|||<dS|jdvr:|d}t|tƒr4| |j¡}|||<dS| |d¡}|  ||¡||<dS| |d¡}|  ||¡} |  | ¡dS)Nrÿr6)rçrær4) r@rArorarBÚbytesrÛr~rärer) rrEr rÐrÏZpayload_member_nameZ body_shaper4ràrèrrrrã…s$          ÿ zBaseRestParser._parse_payloadc Csž|d}|D]F}||}|j d¡}|durq|dkr&| ||d¡||<q|dkr3| ||¡||<q|dkrL|j d|¡} | |vrL| ||| ¡||<qdS)Nr3r�Z statusCoder5Úheaderrn)r@rAreÚ_parse_header_map) rrEr rÐrÏr3rnrhr�Ú header_namerrrrâžs,  ÿ ÿÿ€ðz'BaseRestParser._parse_non_payload_attrscCsNi}|j dd¡ ¡}|D]}| ¡ |¡r$|t|ƒd…}||||<q |S)Nrnr)r@rAÚlowerrOrt)rr r3rFÚprefixr rnrrrr ¶s €z BaseRestParser._parse_header_mapcCrêrërìrírrrräÃrîz"BaseRestParser._initial_body_parsecCs,|}t|ƒrt |¡ |j¡}t |¡}|Sr )rr/r0rÛr~rÜrÝ)rr r2rFÚdecodedrrrr¶Ês  zBaseRestParser._handle_stringcs@|j d¡}|dkrt|tƒsdd„| d¡Dƒ}tƒ ||¡S)Nr�rcSsg|]}| ¡‘qSr)rN)Ú.0r¥rrrÚ Õsz/BaseRestParser._handle_list..ú,)r@rArBrqr•r€rj)rr rcr�r„rrrjÑs zBaseRestParser._handle_list)rrrr?rr=rrãrâr rär¶rjrºrrr„rras   rcs<eZdZeZdd„Z‡fdd„Zdd„Zdd„ZeZ ‡Z S) ÚRestJSONParsercCrñr ròrírrrräÝrz"RestJSONParser._initial_body_parsecstƒ ||¡}| ||¡|Sr )r€r>Ú_inject_error_code)rrEr r×r„rrr>às zRestJSONParser._do_error_parsecCsx| |d¡}d|dvr"|dd}| d¡d}||dd<dSd|vs*d|vr:| d| dd ¡¡|dd<dSdS) Nr4zx-amzn-errortyper3r�rrTrQrØr)rär•rA)rr×rEr4rØrrrrås   ÿz!RestJSONParser._inject_error_codecCr«r r³rlrrrrµòszRestJSONParser._handle_integer) rrrrðr-rär>rrµr¹rºrrr„rrÙs  rcsDeZdZeZdd„Zdd„Zdd„Zdd„Ze ‡fd d „ƒZ ‡Z S) Ú RestXMLParsercCrör‹r÷rùrrrräürúz!RestXMLParser._initial_body_parsecCs@|drz| |¡WStytjddd�Ynw| |¡S)Nr4z2Exception caught when parsing error response body:T)Úexc_info)Ú_parse_error_from_bodyr&r8r9Ú_parse_error_from_http_statusr]rrrr>s   þÿ zRestXMLParser._do_error_parsecCsHt|dƒtjjj |dd¡dœ|d dd¡|d dd¡dœdœS) Nr5rrPr3rr)r½rrS)rUrrVrWrXrArYrrrrs  ÿþþùz+RestXMLParser._parse_error_from_http_statuscCs’|d}| |¡}| |¡}| |¡|jdkr.| |¡}| dd¡| dd¡||dœSd|vr;d| d¡i|d<ddddœi}t||ƒ|S) Nr4rTr½rrrSr7rÒ)r¦r‘r§rxrr¾r )rrEr¿r¤rFrMÚdefaultrrrr*s         z$RestXMLParser._parse_error_from_bodycstƒ ||¡}|Sr )r€r¶r©r„rrr¶AszRestXMLParser._handle_string) rrrrõr-rär>rrr%r¶rºrrr„rrøsr)Zec2ÚqueryrÜz rest-jsonzrest-xml)'r}r/rÜÚloggingr�Zbotocore.compatrrrZbotocore.eventstreamrrZbotocore.utilsrrr r Ú getLoggerrr8r(r rr%Ú Exceptionr&r'rr»rÌrÎrárðrõrûrrrrrrrrÚsD h ?24$YS(xP û