< Summary

Information
Class: ArturRios.Util.WebApi.Extensions.HttpContextClientExtensions
Assembly: ArturRios.Util.WebApi
File(s): /home/runner/work/dotnet-webapi-util/dotnet-webapi-util/src/Extensions/HttpContextClientExtensions.cs
Line coverage
100%
Covered lines: 4
Uncovered lines: 0
Coverable lines: 4
Total lines: 32
Line coverage: 100%
Branch coverage
100%
Covered branches: 4
Total branches: 4
Branch coverage: 100%
Method coverage
100%
Covered methods: 1
Fully covered methods: 1
Total methods: 1
Method coverage: 100%
Full method coverage: 100%

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
GetClientIpAddress(...)100%44100%

File(s)

/home/runner/work/dotnet-webapi-util/dotnet-webapi-util/src/Extensions/HttpContextClientExtensions.cs

#LineLine coverage
 1using Microsoft.AspNetCore.Http;
 2
 3namespace ArturRios.Util.WebApi.Extensions;
 4
 5/// <summary>Extension methods for identifying the client that made the current request.</summary>
 6public static class HttpContextClientExtensions
 7{
 8    /// <param name="context">The current HTTP context.</param>
 9    extension(HttpContext context)
 10    {
 11        /// <summary>Gets the IP address of the client that made the request, from
 12        /// <see cref="ConnectionInfo.RemoteIpAddress"/>. An IPv4 address carried as IPv6 (<c>::ffff:203.0.113.7</c>)
 13        /// comes back in its IPv4 form.</summary>
 14        /// <remarks>Behind a reverse proxy or load balancer this is the proxy's address. Configure ASP.NET Core's
 15        /// <c>ForwardedHeadersOptions</c> with the proxies you trust (the standard middlewares run
 16        /// <c>UseForwardedHeaders</c> first), so the address is taken from <c>X-Forwarded-For</c>. The header is not
 17        /// read here directly, since any client can forge it.</remarks>
 18        /// <returns>The client's IP address, or <see langword="null"/> when the server doesn't know it (for example on
 19        /// an in-memory test server).</returns>
 20        public string? GetClientIpAddress()
 21        {
 3422            var address = context.Connection.RemoteIpAddress;
 23
 3424            if (address is null)
 25            {
 2726                return null;
 27            }
 28
 729            return (address.IsIPv4MappedToIPv6 ? address.MapToIPv4() : address).ToString();
 30        }
 31    }
 32}