예제 #1
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);
        }
예제 #2
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);
        }