DocSpace-buildtools/thirdparty/Microsoft.Graph.Core/Extensions/HttpRequestMessageExtensions.cs
2020-07-10 18:37:02 +03:00

127 lines
5.6 KiB
C#

// ------------------------------------------------------------------------------
// 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;
/// <summary>
/// Contains extension methods for <see cref="HttpRequestMessage"/>
/// </summary>
public static class HttpRequestMessageExtensions
{
/// <summary>
/// Checks the HTTP request's content to determine if it's buffered or streamed content.
/// </summary>
/// <param name="httpRequestMessage">The <see cref="HttpRequestMessage"/>needs to be sent.</param>
/// <returns></returns>
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;
}
/// <summary>
/// Get's feature request header value from the incoming <see cref="HttpRequestMessage"/>
/// </summary>
/// <param name="httpRequestMessage">The <see cref="HttpRequestMessage"/> object</param>
/// <returns></returns>
internal static FeatureFlag GetFeatureFlags(this HttpRequestMessage httpRequestMessage)
{
httpRequestMessage.Headers.TryGetValues(CoreConstants.Headers.FeatureFlag, out IEnumerable<string> flags);
if (!Enum.TryParse(flags?.FirstOrDefault(), out FeatureFlag featureFlag))
{
featureFlag = FeatureFlag.None;
}
return featureFlag;
}
/// <summary>
/// Create a new HTTP request by copying previous HTTP request's headers and properties from response's request message.
/// </summary>
/// <param name="originalRequest">The previous <see cref="HttpRequestMessage"/> needs to be copy.</param>
/// <returns>The <see cref="HttpRequestMessage"/>.</returns>
/// <remarks>
/// Re-issue a new HTTP request with the previous request's headers and properities
/// </remarks>
internal static async Task<HttpRequestMessage> 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;
}
/// <summary>
/// Gets a <see cref="GraphRequestContext"/> from <see cref="HttpRequestMessage"/>
/// </summary>
/// <param name="httpRequestMessage">The <see cref="HttpRequestMessage"/> representation of the request.</param>
/// <returns></returns>
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;
}
/// <summary>
/// Gets a <see cref="IMiddlewareOption"/> from <see cref="HttpRequestMessage"/>
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="httpRequestMessage">The <see cref="HttpRequestMessage"/> representation of the request.</param>
/// <returns>A middleware option</returns>
public static T GetMiddlewareOption<T>(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;
}
}
}