File: HttpRequestMessageExtensions.cs
Web Access
Project: src\src\HttpClientFactory\Polly\src\Microsoft.Extensions.Http.Polly.csproj (Microsoft.Extensions.Http.Polly)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System;
using System.Net.Http;
using Microsoft.Extensions.Http;
 
namespace Polly;
 
/// <summary>
/// Extension methods for <see cref="HttpRequestMessage"/> Polly integration.
/// </summary>
public static class HttpRequestMessageExtensions
{
#pragma warning disable CA1802 //  Use literals where appropriate. Using a static field for reference equality
    internal static readonly string PolicyExecutionContextKey = "PolicyExecutionContext";
#pragma warning restore CA1802
 
    /// <summary>
    /// Gets the <see cref="Context"/> associated with the provided <see cref="HttpRequestMessage"/>.
    /// </summary>
    /// <param name="request">The <see cref="HttpRequestMessage"/>.</param>
    /// <returns>The <see cref="Context"/> if set, otherwise <c>null</c>.</returns>
    /// <remarks>
    /// The <see cref="PolicyHttpMessageHandler"/> will attach a context to the <see cref="HttpResponseMessage"/> prior
    /// to executing a <see cref="Policy"/>, if one does not already exist. The <see cref="Context"/> will be provided
    /// to the policy for use inside the <see cref="Policy"/> and in other message handlers.
    /// </remarks>
    public static Context? GetPolicyExecutionContext(this HttpRequestMessage request)
    {
        if (request == null)
        {
            throw new ArgumentNullException(nameof(request));
        }
 
        request.Properties.TryGetValue(PolicyExecutionContextKey, out var context);
        return context as Context;
    }
 
    /// <summary>
    /// Sets the <see cref="Context"/> associated with the provided <see cref="HttpRequestMessage"/>.
    /// </summary>
    /// <param name="request">The <see cref="HttpRequestMessage"/>.</param>
    /// <param name="context">The <see cref="Context"/>, may be <c>null</c>.</param>
    /// <remarks>
    /// The <see cref="PolicyHttpMessageHandler"/> will attach a context to the <see cref="HttpResponseMessage"/> prior
    /// to executing a <see cref="Policy"/>, if one does not already exist. The <see cref="Context"/> will be provided
    /// to the policy for use inside the <see cref="Policy"/> and in other message handlers.
    /// </remarks>
    public static void SetPolicyExecutionContext(this HttpRequestMessage request, Context? context)
    {
        if (request == null)
        {
            throw new ArgumentNullException(nameof(request));
        }
 
        request.Properties[PolicyExecutionContextKey] = context;
    }
}