B ݁[o@sdZddlZddlZddlZddlZddlmZddlmZddlm Z m Z ddl m Z ddl m Z ddl mZdd lmZd Zd Zd ZdddZGdddeZGdddeZGdddeZGdddeZGdddeZGdddeeZGdddeZeeeeedZdS) aProtocol input serializes. This module contains classes that implement input serialization for the various AWS protocol types. These classes essentially take user input, a model object that represents what the expected input should look like, and it returns a dictionary that contains the various parts of a request. A few high level design decisions: * Each protocol type maps to a separate class, all inherit from ``Serializer``. * The return value for ``serialize_to_request`` (the main entry point) returns a dictionary that represents a request. This will have keys like ``url_path``, ``query_string``, etc. This is done so that it's a) easy to test and b) not tied to a particular HTTP library. See the ``serialize_to_request`` docstring for more details. Unicode ------- The input to the serializers should be text (str/unicode), not bytes, with the exception of blob types. Those are assumed to be binary, and if a str/unicode type is passed in, it will be encoded as utf-8. N) ElementTree)six)json formatdate)parse_to_aware_datetime)percent_encode)is_json_value_header)validateiso8601z%Y-%m-%dT%H:%M:%SZz%Y-%m-%dT%H:%M:%S.%fZTcCs&t|}|r"t}t||}|S)N) SERIALIZERSr ZParamValidatorZParamValidationDecorator)Z protocol_nameZinclude_validation serializerZ validatorr S/Users/kashii/Desktop/Projects/Workshops/worker-safety/lambda/botocore/serialize.pycreate_serializer>s   rc@sZeZdZdZeZdZddZddZddZ d d Z d d Z dddZ ddZ ddZd S) SerializerPOSTzutf-8cCs tddS)aSerialize parameters into an HTTP request. This method takes user provided parameters and a shape model and serializes the parameters to an HTTP request. More specifically, this method returns information about parts of the HTTP request, it does not enforce a particular interface or standard for an HTTP request. It instead returns a dictionary of: * 'url_path' * 'query_string' * 'headers' * 'body' * 'method' It is then up to consumers to decide how to map this to a Request object of their HTTP library of choice. Below is an example return value:: {'body': {'Action': 'OperationName', 'Bar': 'val2', 'Foo': 'val1', 'Version': '2014-01-01'}, 'headers': {}, 'method': 'POST', 'query_string': '', 'url_path': '/'} :param parameters: The dictionary input parameters for the operation (i.e the user input). :param operation_model: The OperationModel object that describes the operation. serialize_to_requestN)NotImplementedError)self parametersoperation_modelr r rrPs"zSerializer.serialize_to_requestcCsdd|jidd}|S)N/)url_path query_stringmethodheadersbody)DEFAULT_METHOD)r serializedr r r_create_default_requestts z"Serializer._create_default_requestcCs|jdkrt}nt}||S)Nr) microsecond ISO8601_MICROISO8601strftime)rvaluetimestamp_formatr r r_timestamp_iso8601s zSerializer._timestamp_iso8601cCstt|S)N)intcalendartimegm timetuple)rr&r r r_timestamp_unixtimestampsz#Serializer._timestamp_unixtimestampcCs"t|tjr||}t|ddS)NT)usegmt) isinstancedatetimer-r)rr&r r r_timestamp_rfc822s  zSerializer._timestamp_rfc822NcCs8|dkr|j}|}t|}t|d|}||}|S)Nz _timestamp_%s)TIMESTAMP_FORMATlowerrgetattr)rr&r' datetime_obj converterZ final_valuer r r_convert_timestamp_to_strs z$Serializer._convert_timestamp_to_strcCs|jd|S)Nname) serializationget)rshape default_namer r r_get_serialized_nameszSerializer._get_serialized_namecCs.t|tjr||j}t||jS)N) r/r text_typeencodeDEFAULT_ENCODINGbase64 b64encodestripdecode)rr&r r r _get_base64s  zSerializer._get_base64)N)__name__ __module__ __qualname__rdictMAP_TYPEr@rr!r(r-r1r7r=rEr r r rrGs$ rc@speZdZdZddZdddZdddZdd d Zdd d Zdd dZ dddZ dddZ dddZ ddZ dS) QuerySerializerr cCsp|j}|}|jd|j|d<ddi|d<|}|j|d<|jd|d<|dk rd||||||d<|S) Nrz Content-Typez0application/x-www-form-urlencoded; charset=utf-8rZAction apiVersionVersionr) input_shaper!httpr:rrJr8metadata _serialize)rrrr;r body_paramsr r rrs   z$QuerySerializer.serialize_to_requestrcCs(t|d|j|j}|||||ddS)Nz_serialize_type_%s)prefix)r4 type_name_default_serialize)rr r&r;rSrr r rrQs zQuerySerializer._serializec CsT|j}xH|D]<\}}||}|||}|rx8t|dD]*\}}d||f}|j}|||||q WdS)Nr^z%s.%s)rbr]rQ) rr r&r;rSrcrdrerfr r rrg%s z"EC2Serializer._serialize_type_listN)r)rFrGrH__doc__r=rgr r r rrus ruc@sReZdZdZddZdddZddZd d Zd d Zd dZ ddZ ddZ dS)JSONSerializerZ unixtimestampcCsd|jd|jf}|jd}|}|jd|j|d<|d|d|d<|}|j}|dk rp||||t | |j |d<|S) Nz%s.%sZ targetPrefixZ jsonVersionrzapplication/x-amz-json-%s)z X-Amz-Targetz Content-Typerr) rPr8r!rOr:rrJrNrQrdumpsr?r@)rrrtargetZ json_versionr rrNr r rr/s    z#JSONSerializer.serialize_to_requestNcCs&t|d|j|j}|||||dS)Nz_serialize_type_%s)r4rTrU)rr r&r;rXrr r rrQAs zJSONSerializer._serializec Csh|dk r|}|||<|}|j}x@|D]4\}}||} d| jkrP| jd}|||| |q,WdS)Nr8)rJrVrWr9rQ) rr r&r;rXZnew_serializedrVZ member_key member_valuerYr r rrZFs  z(JSONSerializer._serialize_type_structurecCs<|}|||<x&|D]\}}||||j|qWdS)N)rJrWrQr&)rr r&r;rXZmap_objZsub_keyZ sub_valuer r rrmWsz"JSONSerializer._serialize_type_mapcCsBg}|||<x0|D](}i}||||jd||dqWdS)NZ __current__)rQr]append)rr r&r;rXZlist_objZ list_itemwrapperr r rrg]s  z#JSONSerializer._serialize_type_listcCs |||<dS)Nr )rr r&r;rXr r rrUisz!JSONSerializer._default_serializecCs|||jd||<dS)Nro)r7r9r:)rr r&r;rXr r rrplsz(JSONSerializer._serialize_type_timestampcCs||||<dS)N)rE)rr r&r;rXr r rrnpsz#JSONSerializer._serialize_type_blob)N) rFrGrHr2rrQrZrmrgrUrprnr r r rry,s  ryc@sdeZdZdZdZdZddddgZdd Zd d Zd d Z ddZ ddZ ddZ ddZ ddZdS)BaseRestSerializera=Base class for rest protocols. The only variance between the various rest protocols is the way that the body is serialized. All other aspects (headers, uri, etc.) are the same and logic for serializing those aspects lives here. Subclasses must implement the ``_serialize_body_params`` method. r Zrfc822uri querystringheaderrc Cs|}|jd|j|d<|j}|dkr<|jd|d<|S|j}||||d}x.|D]"\}}|dkr|qj|||||qjW| |jd|d|d<|d|d<|dr|d|d<| ||||||S) NrZ requestUrir)uri_path_kwargsquery_string_kwargs body_kwargsrrrrr) r!rOr:rrNrVrJrW_partition_parameters_render_uri_template_serialize_payload) rrrr r; shape_members partitioned param_name param_valuer r rrs4        z'BaseRestSerializer.serialize_to_requestcCs^i}xLtd|D]<}|dr>t||dddd||<qt||||<qW|jf|S)Nz{(.*?)}+r\z/~)safe)refindallendswithrri)rZ uri_templateparamsZencoded_paramsZtemplate_paramr r rrs z'BaseRestSerializer._render_uri_templatec Cs|jd}|dk rB||jdkrB||d}||}||d<nL|dk rr||}|dk r|||||d<n|dr||d||d<dS)Npayload)blobstringrrr)r9r:rT_encode_payload_serialize_body_params) rrrr r;rZpayload_memberZ body_payloadrRr r rrs     z%BaseRestSerializer._serialize_payloadcCst|tjr||jS|S)N)r/rr>r?r@)rrr r rrs  z"BaseRestSerializer._encode_payloadc Cs||}|jd}|jd|}|dkr8||d|<n|dkrt|trZ|d|n\t|trzt||d|<n<|jdkr|jd|j }| |||d|<n ||d|<n\|d kr||} | | |} t| |d |<n.|d kr|} | | |d |n ||d |<dS) Nlocationr8rrrr timestamprorrr) r9r:r/rIupdateboolstrr3rTQUERY_STRING_TIMESTAMP_FORMATr7_convert_header_value_do_serialize_header_map) rrrrrr]rkey_namer'r;r& header_prefixr r rrs4       z(BaseRestSerializer._partition_parameterscCs*x$|D]\}}||}|||<q WdS)N)rW)rrrZ user_inputrXvalfull_keyr r rrsz+BaseRestSerializer._do_serialize_header_mapcCs tddS)Nr)r)rrr;r r rrsz)BaseRestSerializer._serialize_body_paramscCs`|jdkr|d|d7}|d|j|<xj|D]^\}} |j|} | jd|} | dkrdS| jdr| jd} | |j| <qV|| | || qVWdS)N xmlNamespaceZxmlnsrSz:%srr8 xmlAttribute)r SubElementr9r:attribrWrVrQ) rrrr;r8Zstructure_nodeZnamespace_metadataZattribute_namerXr&rY member_nameZxml_attribute_namer r rrZ<s"        z+RestXMLSerializer._serialize_type_structurec CsX|j}|jdr|}|}n|jdd}t||}x|D]}|||||qr)rrrr;r8rr r rrUs z$RestXMLSerializer._default_serializeN) rFrGrHr2rrQrZrgrmrsrnrprUr r r rr-s  r)Zec2queryrz rest-jsonzrest-xml)T)rxrrAr*r0Z xml.etreerbotocore.compatrrrbotocore.utilsrrrbotocorer ZDEFAULT_TIMESTAMP_FORMATr$r#robjectrrKruryrrrr r r r r's8       dcH2a