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