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