// ------------------------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All Rights Reserved. Licensed under the MIT License. See License in the project root for license information. // ------------------------------------------------------------------------------ namespace Microsoft.Graph { using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net.Http; using System.Threading.Tasks; /// /// Contains extension methods for /// public static class HttpRequestMessageExtensions { /// /// Checks the HTTP request's content to determine if it's buffered or streamed content. /// /// The needs to be sent. /// internal static bool IsBuffered(this HttpRequestMessage httpRequestMessage) { HttpContent requestContent = httpRequestMessage.Content; if ((httpRequestMessage.Method == HttpMethod.Put || httpRequestMessage.Method == HttpMethod.Post || httpRequestMessage.Method.Method.Equals("PATCH")) && requestContent != null && (requestContent.Headers.ContentLength == null || (int)requestContent.Headers.ContentLength == -1)) { return false; } return true; } /// /// Get's feature request header value from the incoming /// /// The object /// internal static FeatureFlag GetFeatureFlags(this HttpRequestMessage httpRequestMessage) { httpRequestMessage.Headers.TryGetValues(CoreConstants.Headers.FeatureFlag, out IEnumerable flags); if (!Enum.TryParse(flags?.FirstOrDefault(), out FeatureFlag featureFlag)) { featureFlag = FeatureFlag.None; } return featureFlag; } /// /// Create a new HTTP request by copying previous HTTP request's headers and properties from response's request message. /// /// The previous needs to be copy. /// The . /// /// Re-issue a new HTTP request with the previous request's headers and properities /// internal static async Task CloneAsync(this HttpRequestMessage originalRequest) { var newRequest = new HttpRequestMessage(originalRequest.Method, originalRequest.RequestUri); // Copy request headers. foreach (var header in originalRequest.Headers) newRequest.Headers.TryAddWithoutValidation(header.Key, header.Value); // Copy request properties. foreach (var property in originalRequest.Properties) newRequest.Properties.Add(property); // Set Content if previous request had one. if (originalRequest.Content != null) { // HttpClient doesn't rewind streams and we have to explicitly do so. await originalRequest.Content.ReadAsStreamAsync().ContinueWith(t => { if (t.Result.CanSeek) t.Result.Seek(0, SeekOrigin.Begin); newRequest.Content = new StreamContent(t.Result); }); // Copy content headers. if (originalRequest.Content.Headers != null) foreach (var contentHeader in originalRequest.Content.Headers) newRequest.Content.Headers.TryAddWithoutValidation(contentHeader.Key, contentHeader.Value); } return newRequest; } /// /// Gets a from /// /// The representation of the request. /// public static GraphRequestContext GetRequestContext(this HttpRequestMessage httpRequestMessage) { GraphRequestContext requestContext = new GraphRequestContext(); if (httpRequestMessage.Properties.TryGetValue(typeof(GraphRequestContext).ToString(), out var requestContextObject)) { requestContext = (GraphRequestContext)requestContextObject; } return requestContext; } /// /// Gets a from /// /// /// The representation of the request. /// A middleware option public static T GetMiddlewareOption(this HttpRequestMessage httpRequestMessage) where T : IMiddlewareOption { IMiddlewareOption option = null; GraphRequestContext requestContext = httpRequestMessage.GetRequestContext(); if (requestContext.MiddlewareOptions != null) { requestContext.MiddlewareOptions.TryGetValue(typeof(T).ToString(), out option); } return (T)option; } } }