/// <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); } }
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)); }
/// <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)); }
/// <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); }
/// <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))); }
/// <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);
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); }
/// <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)); }