public static async Task <HttpResponseMessage> GetResponseAsync(this HttpRequest request) { try { if (request == null) { throw new ArgumentNullException(nameof(request)); } int parts = Helpers.ParseRoute( request.Path, out string database, out string container, out string partitionKey, out string id, out int maxItemCount); return((request.Method.ToLowerInvariant()) switch { "get" => await CosmosService.ReadItemStreamAsync(database, container, partitionKey, id), "post" => parts == 4 ? await CosmosService.CreateItemStreamAsync(database, container, partitionKey, request.Body) : await CosmosService.GetItemQueryStreamIterator(database, container, partitionKey, request.Body, request.Headers["Continuation-Token"], maxItemCount), "put" => parts == 4 ? await CosmosService.UpsertItemStreamAsync(database, container, partitionKey, request.Body) : await CosmosService.ReplaceItemStreamAsync(database, container, partitionKey, id, request.Body), "delete" => await CosmosService.DeleteItemStreamAsync(database, container, partitionKey, id), _ => CosmosService.ErrorResponse("Request method did not match one of the Cosmos API method signatures.") }); }
internal static HttpResponseMessage ConvertHttpResponseMessage(this Response response) { if (response == null) { return(CosmosService.ErrorResponse("There was no response from Azure Cosmos.")); } // Would be really nice if we could simply pass the Cosmos response directly back, // but, alas, we must reconstruct a return response. var result = new HttpResponseMessage(); // Pass Cosmos response headers back. foreach (var headerName in response.Headers) { result.Headers.Add(headerName.Name, headerName.Value); } // Pass Cosmos status code back. result.StatusCode = (HttpStatusCode)response.Status; if (response.ContentStream != null) { // Pass stream directly to response object, without deserializing. result.Content = new StreamContent(response.ContentStream); } return(result); }