예제 #1
0
        /// <summary> default xml deserialzier for converting byte array payload to ODataPayloadElement
        /// Deserializes payload data and builds ODataPayloadElement.
        /// </summary>
        /// <param name="deserializer">The default xml payload deserializer.</param>
        /// <param name="response">The http response from the server.</param>
        /// <param name="payloadUri">The payload uri</param>
        /// <returns>The ODataPayloadElement converted from the payload.</returns>
        private ODataPayloadElement DeserializePayloadData(IPayloadDeserializer deserializer, HttpResponseData response, ODataUri payloadUri)
        {
            ExceptionUtilities.CheckObjectNotNull(response.Body, "Response has no body content");

            // Only expects HttpStatusCode.OK for normal query tests. Error sceanarios are not included.
            ExceptionUtilities.Assert(response.StatusCode == HttpStatusCode.OK, "Expected status code: OK. Actual: {0}", response.StatusCode);

            try
            {
                string charset;
                if (!response.TryGetMimeCharset(out charset))
                {
                    charset = null;
                }

                string contentType = null;
                if (!response.TryGetHeaderValueIgnoreHeaderCase(HttpHeaders.ContentType, out contentType))
                {
                    contentType = null;
                }

                var payloadContext = ODataPayloadContext.BuildODataPayloadContextFromODataUri(payloadUri);
                payloadContext.EncodingName = charset;
                payloadContext.ContentType  = contentType;
                return(deserializer.DeserializeFromBinary(response.Body, payloadContext));
            }
            catch (Exception ex)
            {
                throw new TaupoInvalidOperationException("Failed to deserialize response body", ex);
            }
        }
예제 #2
0
        public ODataPayloadElement DeserializeFromBinary(byte[] serialized, ODataPayloadContext payloadContext)
        {
            ExceptionUtilities.CheckArgumentNotNull(serialized, "serialized");
            ExceptionUtilities.CheckArgumentNotNull(payloadContext, "payloadContext");

            string encodingName = payloadContext.EncodingName;

            ODataPayloadElement errorPayload = null;

            if (this.payloadErrorDeserializer.TryDeserializeErrorPayload(serialized, encodingName, out errorPayload))
            {
                return(errorPayload);
            }

            var encoding = HttpUtilities.GetEncodingOrDefault(encodingName);

            XDocument document = null;

            using (StreamReader reader = new StreamReader(new MemoryStream(serialized), encoding))
            {
                document = XDocument.Load(reader);
            }

            ExceptionUtilities.Assert(document != null, "Deserialized document cannot be null.");

            return(this.xmlConverter.ConvertToPayloadElement(document.Root));
        }
예제 #3
0
        /// <summary>
        /// Deserializes the payload using the JsonParser, then converts the resulting clr objects into payload element form
        /// Throws an TaupoInvalidOperationException if the json does not evaluate successfully.
        /// </summary>
        /// <param name="serialized">A raw json payload</param>
        /// <param name="payloadContext">Additional payload information to aid deserialization</param>
        /// <returns>A PayloadElement representation of the payload</returns>
        public ODataPayloadElement DeserializeFromBinary(byte[] serialized, ODataPayloadContext payloadContext)
        {
            ExceptionUtilities.CheckArgumentNotNull(serialized, "serialized");
            ExceptionUtilities.CheckArgumentNotNull(payloadContext, "payloadContext");

            string encodingName = payloadContext.EncodingName;

            ODataPayloadElement errorPayload = null;

            if (this.payloadErrorDeserializer.TryDeserializeErrorPayload(serialized, encodingName, out errorPayload))
            {
                return(errorPayload);
            }

            // Evaluate the given JSON text
            Encoding encoding = HttpUtilities.GetEncodingOrDefault(encodingName);
            string   payload  = encoding.GetString(serialized, 0, serialized.Length);

            JsonValue jsonData = null;

            using (StringReader reader = new StringReader(payload))
            {
                JsonTokenizer tokenizer = new JsonTokenizer(reader);
                JsonParser    parser    = new JsonParser(tokenizer);
                jsonData = parser.ParseValue();
            }

            // convert the deserialized JsonValue objects into payload elements
            return(this.payloadConverter.ConvertToPayloadElement(jsonData));
        }
예제 #4
0
        /// <summary>
        /// Constructs an OData response to the given request using the given response data
        /// </summary>
        /// <param name="request">The odata request that was made</param>
        /// <param name="underlyingResponse">The response data</param>
        /// <returns>An odata response</returns>
        public ODataResponse BuildResponse(ODataRequest request, HttpResponseData underlyingResponse)
        {
            ExceptionUtilities.CheckArgumentNotNull(request, "request");
            ExceptionUtilities.CheckArgumentNotNull(underlyingResponse, "underlyingResponse");

            ODataResponse odataResponse = new ODataResponse(underlyingResponse);

            if (request.Uri.IsBatch())
            {
                ExceptionUtilities.CheckObjectNotNull(request.Body, "Batch request had no body");
                var batchRequestPayload = request.Body.RootElement as BatchRequestPayload;
                ExceptionUtilities.CheckObjectNotNull(batchRequestPayload, "Batch request body was not a valid batch payload");

                this.ExecuteAndCatchErrors(request, odataResponse, () => odataResponse.RootElement = this.BatchDeserializer.DeserializeBatchResponse(batchRequestPayload, underlyingResponse));

                return(odataResponse);
            }

            string contentType;

            if (underlyingResponse.TryGetHeaderValueIgnoreHeaderCase(HttpHeaders.ContentType, out contentType))
            {
                IProtocolFormatStrategy strategy = this.FormatSelector.GetStrategy(contentType, request.Uri);
                ExceptionUtilities.CheckObjectNotNull(strategy, "Strategy selector did not return a strategy for content type '{0}'", contentType);

                IPayloadDeserializer deserializer = strategy.GetDeserializer();
                ExceptionUtilities.CheckObjectNotNull(deserializer, "Strategy returned a null deserializer");

                this.ExecuteAndCatchErrors(
                    request,
                    odataResponse,
                    () =>
                {
                    var payloadContext          = ODataPayloadContext.BuildPayloadContextFromRequest(request);
                    payloadContext.ContentType  = contentType;
                    payloadContext.EncodingName = HttpUtilities.GetContentTypeCharsetOrNull(contentType);

                    odataResponse.RootElement = deserializer.DeserializeFromBinary(odataResponse.Body, payloadContext);

                    if (ShouldResolveMetadata(request.Uri, odataResponse.StatusCode, odataResponse.RootElement.ElementType))
                    {
                        // resolve the payload's metadata
                        this.MetadataResolver.ResolveMetadata(odataResponse.RootElement, request.Uri);

                        // normalize the payload
                        var normalizer = strategy.GetPayloadNormalizer();
                        ExceptionUtilities.CheckObjectNotNull(normalizer, "Strategy returned a null payload normalizer");
                        odataResponse.RootElement = normalizer.Normalize(odataResponse.RootElement);
                    }
                });
            }

            return(odataResponse);
        }
예제 #5
0
        /// <summary>
        /// Deserializes the given binary payload as a long integer value
        /// </summary>
        /// <param name="serialized">The serialized value</param>
        /// <param name="payloadContext">Additional payload information to aid deserialization</param>
        /// <returns>A primitive value containing the binary payload</returns>
        public override ODataPayloadElement DeserializeFromBinary(byte[] serialized, ODataPayloadContext payloadContext)
        {
            var value = base.DeserializeFromBinary(serialized, payloadContext) as PrimitiveValue;

            ExceptionUtilities.CheckObjectNotNull(value, "Value unexpectedly null or not a primitive value");

            var stringValue = value.ClrValue as string;

            ExceptionUtilities.CheckObjectNotNull(stringValue, "Primitive value unexpectedly null or not a string");

            value.ClrValue = this.XmlPrimitiveConverter.DeserializePrimitive(stringValue, typeof(long));
            return(value);
        }
        /// <summary>
        /// Deserializes the given binary payload as a text value
        /// </summary>
        /// <param name="serialized">The serialized value</param>
        /// <param name="payloadContext">Additional payload information to aid deserialization</param>
        /// <returns>A primitive value containing the binary payload</returns>
        public override ODataPayloadElement DeserializeFromBinary(byte[] serialized, ODataPayloadContext payloadContext)
        {
            ExceptionUtilities.CheckArgumentNotNull(serialized, "serialized");
            ExceptionUtilities.CheckArgumentNotNull(payloadContext, "payloadContext");

            string encodingName = payloadContext.EncodingName;

            ODataPayloadElement errorPayloadElement = null;

            if (this.HtmlPayloadErrorDeserializer.TryDeserializeErrorPayload(serialized, encodingName, out errorPayloadElement))
            {
                return(errorPayloadElement);
            }

            Encoding encoding = HttpUtilities.GetEncodingOrDefault(encodingName);

            // cannot guess type, must deserialize as a string
            return(new PrimitiveValue(null, encoding.GetString(serialized, 0, serialized.Length)));
        }
예제 #7
0
 /// <summary>
 /// Deserializes the given binary payload
 /// </summary>
 /// <param name="serialized">The serialized value</param>
 /// <param name="payloadContext">Additional payload information to aid deserialization</param>
 /// <returns>A primitive value containing the binary payload</returns>
 public abstract ODataPayloadElement DeserializeFromBinary(byte[] serialized, ODataPayloadContext payloadContext);
예제 #8
0
        internal MimePartData <IHttpRequest> BuildRequestFromPart(MimePartData <byte[]> mimePart, Encoding encoding)
        {
            var requestData = CreateRequest(mimePart.Body, encoding);

            var odataUri     = new ODataUri(new UnrecognizedSegment(requestData.Uri.OriginalString));
            var odataRequest = this.RequestManager.BuildRequest(odataUri, requestData.Verb, requestData.Headers);

            string contentType;

            if (requestData.TryGetHeaderValueIgnoreHeaderCase(HttpHeaders.ContentType, out contentType))
            {
                var formatStrategy = this.FormatSelector.GetStrategy(contentType, odataUri);
                var deserializer   = formatStrategy.GetDeserializer();
                var rootElement    = deserializer.DeserializeFromBinary(requestData.Body, ODataPayloadContext.BuildPayloadContextFromRequest(odataRequest));
                odataRequest.Body = new ODataPayloadBody(requestData.Body, rootElement);
            }
            else if (requestData.Body != null)
            {
                odataRequest.Body = new ODataPayloadBody(requestData.Body, new PrimitiveValue(null, requestData.Body));
            }

            var rebuiltPart = new MimePartData <IHttpRequest>();

            rebuiltPart.Headers.AddRange(mimePart.Headers);
            rebuiltPart.Body = odataRequest;

            return(rebuiltPart);
        }
예제 #9
0
 /// <summary>
 /// Deserializes the given binary payload as an html form payload
 /// </summary>
 /// <param name="serialized">The serialized value</param>
 /// <param name="payloadContext">Additional payload information to aid deserialization</param>
 /// <returns>A ODataPayloadElement corresponding to the binary payload</returns>
 public override ODataPayloadElement DeserializeFromBinary(byte[] serialized, ODataPayloadContext payloadContext)
 {
     throw new TaupoNotSupportedException("Deserialization not supported");
 }
 /// <summary>
 /// Deserializes the given binary payload as a primitive binary value
 /// </summary>
 /// <param name="serialized">The serialized value</param>
 /// <param name="payloadContext">Additional payload information to aid deserialization</param>
 /// <returns>A primitive value containing the binary payload</returns>
 public override ODataPayloadElement DeserializeFromBinary(byte[] serialized, ODataPayloadContext payloadContext)
 {
     ExceptionUtilities.CheckArgumentNotNull(serialized, "serialized");
     return(new PrimitiveValue(null, serialized));
 }