File: Resilience\HttpResilienceHttpRequestMessageExtensions.cs
Web Access
Project: src\src\Libraries\Microsoft.Extensions.Http.Resilience\Microsoft.Extensions.Http.Resilience.csproj (Microsoft.Extensions.Http.Resilience)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using Microsoft.Shared.Diagnostics;
using Polly;
 
namespace System.Net.Http;
 
/// <summary>
/// The resilience extensions for <see cref="HttpRequestMessage"/>.
/// </summary>
public static class HttpResilienceHttpRequestMessageExtensions
{
#if NET6_0_OR_GREATER
    private static readonly HttpRequestOptionsKey<ResilienceContext?> _resilienceContextKey = new("Resilience.Http.ResilienceContext");
#else
    private const string ResilienceContextKey = "Resilience.Http.ResilienceContext";
#endif
 
    /// <summary>
    /// Gets the <see cref="ResilienceContext"/> from the request message.
    /// </summary>
    /// <param name="requestMessage">The request.</param>
    /// <returns>An instance of <see cref="ResilienceContext"/> or <see langword="null"/>.</returns>
    public static ResilienceContext? GetResilienceContext(this HttpRequestMessage requestMessage)
    {
        _ = Throw.IfNull(requestMessage);
 
#if NET6_0_OR_GREATER
        if (requestMessage.Options.TryGetValue(_resilienceContextKey, out var context))
        {
            return context;
        }
#else
        if (requestMessage.Properties.TryGetValue(ResilienceContextKey, out var contextRaw) && contextRaw is ResilienceContext context)
        {
            return context;
        }
#endif
 
        return null;
    }
 
    /// <summary>
    /// Sets the <see cref="ResilienceContext"/> on the request message.
    /// </summary>
    /// <param name="requestMessage">The request.</param>
    /// <param name="resilienceContext">An instance of <see cref="ResilienceContext"/>.</param>
    public static void SetResilienceContext(this HttpRequestMessage requestMessage, ResilienceContext? resilienceContext)
    {
        _ = Throw.IfNull(requestMessage);
#if NET6_0_OR_GREATER
        requestMessage.Options.Set(_resilienceContextKey, resilienceContext);
#else
        requestMessage.Properties[ResilienceContextKey] = resilienceContext;
#endif
    }
}