| File: Http\WebAssemblyHttpRequestMessageExtensions.cs | Web Access |
| Project: src\aspnetcore\src\Components\WebAssembly\WebAssembly\src\Microsoft.AspNetCore.Components.WebAssembly.csproj (Microsoft.AspNetCore.Components.WebAssembly) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System.Net.Http; namespace Microsoft.AspNetCore.Components.WebAssembly.Http; /// <summary> /// Extension methods for configuring an instance of <see cref="HttpRequestMessage"/> with browser-specific options. /// </summary> public static class WebAssemblyHttpRequestMessageExtensions { private static readonly HttpRequestOptionsKey<IDictionary<string, object>> FetchRequestOptionsKey = new HttpRequestOptionsKey<IDictionary<string, object>>("WebAssemblyFetchOptions"); private static readonly HttpRequestOptionsKey<bool> WebAssemblyEnableStreamingRequestKey = new HttpRequestOptionsKey<bool>("WebAssemblyEnableStreamingRequest"); private static readonly HttpRequestOptionsKey<bool> WebAssemblyEnableStreamingResponseKey = new HttpRequestOptionsKey<bool>("WebAssemblyEnableStreamingResponse"); /// <summary> /// Configures a value for the 'credentials' option for the HTTP request. /// </summary> /// <param name="requestMessage">The <see cref="HttpRequestMessage"/>.</param> /// <param name="requestCredentials">The <see cref="BrowserRequestCredentials"/> option.</param> /// <returns>The <see cref="HttpRequestMessage"/>.</returns> /// <remarks> /// See <see href="https://developer.mozilla.org/en-US/docs/Web/API/Request/credentials"/>. /// </remarks> public static HttpRequestMessage SetBrowserRequestCredentials(this HttpRequestMessage requestMessage, BrowserRequestCredentials requestCredentials) { ArgumentNullException.ThrowIfNull(requestMessage); var stringOption = requestCredentials switch { BrowserRequestCredentials.Omit => "omit", BrowserRequestCredentials.SameOrigin => "same-origin", BrowserRequestCredentials.Include => "include", _ => throw new InvalidOperationException($"Unsupported enum value {requestCredentials}.") }; return SetBrowserRequestOption(requestMessage, "credentials", stringOption); } /// <summary> /// Configures a value for the 'cache' option for the HTTP request. /// </summary> /// <param name="requestMessage">The <see cref="HttpRequestMessage"/>.</param> /// <param name="requestCache">The <see cref="BrowserRequestCache"/> option.</param> /// <returns>The <see cref="HttpRequestMessage"/>.</returns>\ /// <remarks> /// See <see href="https://developer.mozilla.org/en-US/docs/Web/API/Request/cache"/>. /// </remarks> public static HttpRequestMessage SetBrowserRequestCache(this HttpRequestMessage requestMessage, BrowserRequestCache requestCache) { ArgumentNullException.ThrowIfNull(requestMessage); var stringOption = requestCache switch { BrowserRequestCache.Default => "default", BrowserRequestCache.NoStore => "no-store", BrowserRequestCache.Reload => "reload", BrowserRequestCache.NoCache => "no-cache", BrowserRequestCache.ForceCache => "force-cache", BrowserRequestCache.OnlyIfCached => "only-if-cached", _ => throw new InvalidOperationException($"Unsupported enum value {requestCache}.") }; return SetBrowserRequestOption(requestMessage, "cache", stringOption); } /// <summary> /// Configures a value for the 'mode' option for the HTTP request. /// </summary> /// <param name="requestMessage">The <see cref="HttpRequestMessage"/>.</param> /// <param name="requestMode">The <see cref="BrowserRequestMode"/>.</param> /// <returns>The <see cref="HttpRequestMessage"/>.</returns>\ /// <remarks> /// See <see href="https://developer.mozilla.org/en-US/docs/Web/API/Request/mode"/>. /// </remarks> public static HttpRequestMessage SetBrowserRequestMode(this HttpRequestMessage requestMessage, BrowserRequestMode requestMode) { ArgumentNullException.ThrowIfNull(requestMessage); var stringOption = requestMode switch { BrowserRequestMode.SameOrigin => "same-origin", BrowserRequestMode.NoCors => "no-cors", BrowserRequestMode.Cors => "cors", BrowserRequestMode.Navigate => "navigate", _ => throw new InvalidOperationException($"Unsupported enum value {requestMode}.") }; return SetBrowserRequestOption(requestMessage, "mode", stringOption); } /// <summary> /// Configures a value for the 'integrity' option for the HTTP request. /// </summary> /// <param name="requestMessage">The <see cref="HttpRequestMessage"/>.</param> /// <param name="integrity">The subresource integrity descriptor.</param> /// <returns>The <see cref="HttpRequestMessage"/>.</returns> /// <remarks> /// See <see href="https://developer.mozilla.org/en-US/docs/Web/API/Request/integrity"/>. /// </remarks> public static HttpRequestMessage SetBrowserRequestIntegrity(this HttpRequestMessage requestMessage, string integrity) => SetBrowserRequestOption(requestMessage, "integrity", integrity); /// <summary> /// Configures a value for the HTTP request. /// </summary> /// <param name="requestMessage">The <see cref="HttpRequestMessage"/>.</param> /// <param name="name">The name of the option, which should correspond to a key defined on <see href="https://fetch.spec.whatwg.org/#requestinit"/>.</param> /// <param name="value">The value, which must be JSON-serializable.</param> /// <returns>The <see cref="HttpRequestMessage"/>.</returns> /// <remarks> /// See <see href="https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch"/>. /// </remarks> public static HttpRequestMessage SetBrowserRequestOption(this HttpRequestMessage requestMessage, string name, object value) { ArgumentNullException.ThrowIfNull(requestMessage); IDictionary<string, object> fetchOptions; if (requestMessage.Options.TryGetValue(FetchRequestOptionsKey, out var entry)) { fetchOptions = entry; } else { fetchOptions = new Dictionary<string, object>(StringComparer.Ordinal); requestMessage.Options.Set(FetchRequestOptionsKey, fetchOptions); } fetchOptions[name] = value; return requestMessage; } /// <summary> /// Configures streaming request for the HTTP request. /// </summary> /// <param name="requestMessage">The <see cref="HttpRequestMessage"/>.</param> /// <param name="streamingEnabled"><see langword="true"/> if streaming is enabled; otherwise <see langword="false"/>.</param> /// <returns>The <see cref="HttpRequestMessage"/>.</returns> /// <remarks> /// This API is only effective when the browser HTTP Fetch supports request streaming. /// Requires HTTP/2 or higher server support. /// See <see href="https://developer.mozilla.org/en-US/docs/Web/API/Request"/>. /// </remarks> public static HttpRequestMessage SetBrowserRequestStreamingEnabled(this HttpRequestMessage requestMessage, bool streamingEnabled) { ArgumentNullException.ThrowIfNull(requestMessage); requestMessage.Options.Set(WebAssemblyEnableStreamingRequestKey, streamingEnabled); return requestMessage; } /// <summary> /// Configures streaming response for the HTTP request. /// </summary> /// <param name="requestMessage">The <see cref="HttpRequestMessage"/>.</param> /// <param name="streamingEnabled"><see langword="true"/> if streaming is enabled; otherwise <see langword="false"/>.</param> /// <returns>The <see cref="HttpRequestMessage"/>.</returns> /// <remarks> /// This API is only effective when the browser HTTP Fetch supports response streaming. /// See <see href="https://developer.mozilla.org/en-US/docs/Web/API/Response"/>. /// </remarks> public static HttpRequestMessage SetBrowserResponseStreamingEnabled(this HttpRequestMessage requestMessage, bool streamingEnabled) { ArgumentNullException.ThrowIfNull(requestMessage); requestMessage.Options.Set(WebAssemblyEnableStreamingResponseKey, streamingEnabled); return requestMessage; } }