Skip to content

Commit 6466c6a

Browse files
committed
feat: add docs, samples and enhancements
1 parent 68654ee commit 6466c6a

16 files changed

+258
-102
lines changed

README.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@ Parsing HTTP User Agents with .NET
44

55
## NuGet
66

7-
| NuGet |
8-
|-|
9-
| [![MyCSharp.HttpUserAgentParser](https://img.shields.io/nuget/v/MyCSharp.HttpUserAgentParser.svg?logo=nuget&label=MyCSharp.HttpUserAgentParser)](https://www.nuget.org/packages/MyCSharp.HttpUserAgentParser) |
10-
| [![MyCSharp.HttpUserAgentParser](https://img.shields.io/nuget/v/MyCSharp.HttpUserAgentParser.MemoryCache.svg?logo=nuget&label=MyCSharp.HttpUserAgentParser.MemoryCache)](https://www.nuget.org/packages/MyCSharp.HttpUserAgentParser.MemoryCache)| `dotnet add package MyCSharp.HttpUserAgentParser.MemoryCach.MemoryCache` |
7+
| NuGet | Install |
8+
|-|-|
9+
| [![MyCSharp.HttpUserAgentParser](https://img.shields.io/nuget/v/MyCSharp.HttpUserAgentParser.svg?logo=nuget&label=MyCSharp.HttpUserAgentParser)](https://www.nuget.org/packages/MyCSharp.HttpUserAgentParser) | `dotnet add package MyCSharp.HttpUserAgentParser` |
10+
| [![MyCSharp.HttpUserAgentParser.MemoryCache](https://img.shields.io/nuget/v/MyCSharp.HttpUserAgentParser.MemoryCache.svg?logo=nuget&label=MyCSharp.HttpUserAgentParser.MemoryCache)](https://www.nuget.org/packages/MyCSharp.HttpUserAgentParser.MemoryCache) | `dotnet add package MyCSharp.HttpUserAgentParser.MemoryCache` |
1111
| [![MyCSharp.HttpUserAgentParser.AspNetCore](https://img.shields.io/nuget/v/MyCSharp.HttpUserAgentParser.AspNetCore.svg?logo=nuget&label=MyCSharp.HttpUserAgentParser.AspNetCore)](https://www.nuget.org/packages/MyCSharp.HttpUserAgentParser.AspNetCore) | `dotnet add package MyCSharp.HttpUserAgentParser.AspNetCore` |
1212

1313

@@ -104,9 +104,9 @@ public void ConfigureServices(IServiceCollection services)
104104
Now you can use
105105

106106
```csharp
107-
public void MyMethod(IHttpUserAgentParserAccessor parserAccessor)
107+
public void MyMethod(IHttpUserAgentParserAccessor parserAccessor, HttpContext httpContext)
108108
{
109-
HttpUserAgentInformation info = parserAccessor.Get();
109+
HttpUserAgentInformation? info = parserAccessor.Get(httpContext);
110110
}
111111
```
112112

@@ -152,7 +152,7 @@ by [@BenjaminAbt](https://github.com/BenjaminAbt) and [@gfoidl](https://github.c
152152

153153
MIT License
154154

155-
Copyright (c) 2021-2025 MyCSharp
155+
Copyright (c) 2021-2026 MyCSharp
156156

157157
Permission is hereby granted, free of charge, to any person obtaining a copy
158158
of this software and associated documentation files (the "Software"), to deal

src/HttpUserAgentParser.AspNetCore/DependencyInjection/HttpUserAgentParserDependencyInjectionOptionsExtensions.cs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,24 @@
77
namespace MyCSharp.HttpUserAgentParser.AspNetCore.DependencyInjection;
88

99
/// <summary>
10-
/// Dependency injection extensions for ASP.NET Core environments
10+
/// Extension methods for <see cref="HttpUserAgentParserDependencyInjectionOptions"/> to add ASP.NET Core integration.
1111
/// </summary>
1212
public static class HttpUserAgentParserDependencyInjectionOptionsExtensions
1313
{
1414
/// <summary>
15-
/// Registers <see cref="HttpUserAgentParserAccessor"/> as <see cref="IHttpUserAgentParserAccessor"/>.
16-
/// Requires a registered <see cref="IHttpUserAgentParserProvider"/>
15+
/// Registers <see cref="HttpUserAgentParserAccessor"/> as a singleton implementation of <see cref="IHttpUserAgentParserAccessor"/>.
1716
/// </summary>
17+
/// <param name="options">The options instance from the parser registration.</param>
18+
/// <returns>The same options instance for method chaining.</returns>
19+
/// <remarks>
20+
/// Requires a registered <see cref="IHttpUserAgentParserProvider"/>.
21+
/// Call this after <c>AddHttpUserAgentParser()</c> or <c>AddHttpUserAgentCachedParser()</c>.
22+
/// </remarks>
1823
/// <example>
1924
/// <code>
2025
/// IServiceCollection services = new ServiceCollection();
21-
/// services.AddHttpUserAgentParser().AddHttpUserAgentParserAccessor();
26+
/// services.AddHttpUserAgentParser()
27+
/// .AddHttpUserAgentParserAccessor();
2228
/// </code>
2329
/// </example>
2430
public static HttpUserAgentParserDependencyInjectionOptions AddHttpUserAgentParserAccessor(

src/HttpUserAgentParser.AspNetCore/HttpContextExtensions.cs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,22 @@
66
namespace MyCSharp.HttpUserAgentParser.AspNetCore;
77

88
/// <summary>
9-
/// Static extensions for <see cref="HttpContext"/>
9+
/// Extension methods for <see cref="HttpContext"/> to access User-Agent information.
1010
/// </summary>
1111
public static class HttpContextExtensions
1212
{
1313
/// <summary>
14-
/// Returns the User-Agent header value
14+
/// Gets the User-Agent header value from the HTTP request.
1515
/// </summary>
16+
/// <param name="httpContext">The HTTP context.</param>
17+
/// <returns>The User-Agent string, or <see langword="null"/> if not present.</returns>
1618
/// <example>
1719
/// <code>
1820
/// string? userAgent = httpContext.GetUserAgentString();
21+
/// if (userAgent != null)
22+
/// {
23+
/// HttpUserAgentInformation info = HttpUserAgentParser.Parse(userAgent);
24+
/// }
1925
/// </code>
2026
/// </example>
2127
public static string? GetUserAgentString(this HttpContext httpContext)

src/HttpUserAgentParser.AspNetCore/HttpUserAgentParserAccessor.cs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,19 @@
66
namespace MyCSharp.HttpUserAgentParser.AspNetCore;
77

88
/// <summary>
9-
/// User Agent parser accessor. Implements <see cref="IHttpContextAccessor.HttpContext"/>
9+
/// Default implementation of <see cref="IHttpUserAgentParserAccessor"/> for ASP.NET Core applications.
1010
/// </summary>
1111
/// <remarks>
12-
/// Creates a new instance of <see cref="HttpUserAgentParserAccessor"/>
12+
/// Extracts and parses the User-Agent header from HTTP requests.
13+
/// Register via <c>services.AddHttpUserAgentParser().AddHttpUserAgentParserAccessor()</c>.
1314
/// </remarks>
15+
/// <param name="httpUserAgentParser">The parser provider to use for parsing.</param>
1416
public class HttpUserAgentParserAccessor(IHttpUserAgentParserProvider httpUserAgentParser)
1517
: IHttpUserAgentParserAccessor
1618
{
1719
private readonly IHttpUserAgentParserProvider _httpUserAgentParser = httpUserAgentParser;
1820

19-
/// <summary>
20-
/// User agent of current <see cref="IHttpContextAccessor"/>
21-
/// </summary>
21+
/// <inheritdoc/>
2222
/// <example>
2323
/// <code>
2424
/// string? userAgent = accessor.GetHttpContextUserAgent(httpContext);
@@ -27,12 +27,14 @@ public class HttpUserAgentParserAccessor(IHttpUserAgentParserProvider httpUserAg
2727
public string? GetHttpContextUserAgent(HttpContext httpContext)
2828
=> httpContext.GetUserAgentString();
2929

30-
/// <summary>
31-
/// Returns current <see cref="HttpUserAgentInformation"/> of current <see cref="IHttpContextAccessor"/>
32-
/// </summary>
30+
/// <inheritdoc/>
3331
/// <example>
3432
/// <code>
3533
/// HttpUserAgentInformation? info = accessor.Get(httpContext);
34+
/// if (info != null)
35+
/// {
36+
/// Console.WriteLine(info.Value.Name);
37+
/// }
3638
/// </code>
3739
/// </example>
3840
public HttpUserAgentInformation? Get(HttpContext httpContext)

src/HttpUserAgentParser.AspNetCore/IHttpUserAgentParserAccessor.cs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,24 @@
55
namespace MyCSharp.HttpUserAgentParser.AspNetCore;
66

77
/// <summary>
8-
/// User Agent parser accessor
8+
/// Provides access to User-Agent parsing functionality within an ASP.NET Core context.
99
/// </summary>
1010
public interface IHttpUserAgentParserAccessor
1111
{
1212
/// <summary>
13-
/// User agent value
13+
/// Gets the User-Agent header value from the specified HTTP context.
1414
/// </summary>
15+
/// <param name="httpContext">The HTTP context to extract the User-Agent from.</param>
16+
/// <returns>The User-Agent string, or <see langword="null"/> if not present.</returns>
1517
string? GetHttpContextUserAgent(HttpContext httpContext);
1618

1719
/// <summary>
18-
/// Returns current <see cref="HttpUserAgentInformation"/>
20+
/// Parses the User-Agent from the specified HTTP context.
1921
/// </summary>
22+
/// <param name="httpContext">The HTTP context to extract and parse the User-Agent from.</param>
23+
/// <returns>
24+
/// An <see cref="HttpUserAgentInformation"/> instance if the User-Agent header is present;
25+
/// otherwise, <see langword="null"/>.
26+
/// </returns>
2027
HttpUserAgentInformation? Get(HttpContext httpContext);
2128
}

src/HttpUserAgentParser.MemoryCache/DependencyInjection/HttpUserAgentParserMemoryCacheServiceCollectionExtensions.cs

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,27 @@
77
namespace MyCSharp.HttpUserAgentParser.MemoryCache.DependencyInjection;
88

99
/// <summary>
10-
/// Dependency injection extensions for IMemoryCache
10+
/// Extension methods for registering <see cref="HttpUserAgentParserMemoryCachedProvider"/> with dependency injection.
1111
/// </summary>
1212
public static class HttpUserAgentParserMemoryCacheServiceCollectionExtensions
1313
{
1414
/// <summary>
15-
/// Registers <see cref="HttpUserAgentParserCachedProvider"/> as singleton to <see cref="IHttpUserAgentParserProvider"/>
15+
/// Registers <see cref="HttpUserAgentParserMemoryCachedProvider"/> as a singleton implementation of <see cref="IHttpUserAgentParserProvider"/>.
1616
/// </summary>
17+
/// <param name="services">The service collection to add the services to.</param>
18+
/// <param name="options">Optional action to configure the cache options.</param>
19+
/// <returns>Options for further configuration.</returns>
20+
/// <remarks>
21+
/// <para>Default configuration: 256 entries maximum, 1 day sliding expiration.</para>
22+
/// <para>Use the <paramref name="options"/> parameter to customize cache behavior.</para>
23+
/// </remarks>
1724
/// <example>
1825
/// <code>
1926
/// IServiceCollection services = new ServiceCollection();
20-
/// services.AddHttpUserAgentMemoryCachedParser(options =>
27+
/// services.AddHttpUserAgentMemoryCachedParser(opts =>
2128
/// {
22-
/// options.CacheOptions.SizeLimit = 512;
23-
/// options.CacheEntryOptions.SlidingExpiration = TimeSpan.FromHours(6);
29+
/// opts.CacheOptions.SizeLimit = 512;
30+
/// opts.CacheEntryOptions.SlidingExpiration = TimeSpan.FromHours(6);
2431
/// });
2532
/// </code>
2633
/// </example>

src/HttpUserAgentParser.MemoryCache/HttpUserAgentParserMemoryCachedProvider.cs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,28 @@
55

66
namespace MyCSharp.HttpUserAgentParser.MemoryCache;
77

8-
/// <inheritdoc/>
98
/// <summary>
10-
/// Creates a new instance of <see cref="HttpUserAgentParserMemoryCachedProvider"/>.
9+
/// Implementation of <see cref="IHttpUserAgentParserProvider"/> with caching using <see cref="Microsoft.Extensions.Caching.Memory.MemoryCache"/>.
1110
/// </summary>
12-
/// <param name="options">The options used to set expiration and size limit</param>
11+
/// <remarks>
12+
/// <para>Provides sliding expiration and size limits for cached entries.</para>
13+
/// <para>Default configuration: 256 entries maximum, 1 day sliding expiration.</para>
14+
/// </remarks>
15+
/// <param name="options">The options controlling cache size and expiration.</param>
1316
public class HttpUserAgentParserMemoryCachedProvider(
1417
HttpUserAgentParserMemoryCachedProviderOptions options) : IHttpUserAgentParserProvider
1518
{
1619
private readonly Microsoft.Extensions.Caching.Memory.MemoryCache _memoryCache = new(options.CacheOptions);
1720
private readonly HttpUserAgentParserMemoryCachedProviderOptions _options = options;
1821

1922
/// <inheritdoc/>
23+
/// <example>
24+
/// <code>
25+
/// HttpUserAgentParserMemoryCachedProviderOptions options = new();
26+
/// HttpUserAgentParserMemoryCachedProvider provider = new(options);
27+
/// HttpUserAgentInformation info = provider.Parse("Mozilla/5.0 Chrome/90.0.4430.212");
28+
/// </code>
29+
/// </example>
2030
public HttpUserAgentInformation Parse(string userAgent)
2131
{
2232
CacheKey key = GetKey(userAgent);

src/HttpUserAgentParser.MemoryCache/HttpUserAgentParserMemoryCachedProviderOptions.cs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,24 @@
55
namespace MyCSharp.HttpUserAgentParser.MemoryCache;
66

77
/// <summary>
8-
/// Provider options for <see cref="HttpUserAgentParserMemoryCachedProvider"/>
8+
/// Configuration options for <see cref="HttpUserAgentParserMemoryCachedProvider"/>.
9+
/// </summary>
910
/// <remarks>
10-
/// Default of <seealso cref="MemoryCacheOptions.SizeLimit"/> is 256.
11-
/// Default of <seealso cref="MemoryCacheEntryOptions.SlidingExpiration"/> is 1 day
11+
/// <para>Default <see cref="MemoryCacheOptions.SizeLimit"/>: 256 entries.</para>
12+
/// <para>Default <see cref="MemoryCacheEntryOptions.SlidingExpiration"/>: 1 day.</para>
1213
/// </remarks>
13-
/// </summary>
1414
public class HttpUserAgentParserMemoryCachedProviderOptions
1515
{
1616
/// <summary>
17-
/// Cache options
17+
/// Gets the memory cache configuration options.
1818
/// </summary>
19+
/// <remarks>Controls size limits and compaction behavior.</remarks>
1920
public MemoryCacheOptions CacheOptions { get; }
2021

2122
/// <summary>
22-
/// Cache entry options
23+
/// Gets the options applied to each cache entry.
2324
/// </summary>
25+
/// <remarks>Controls sliding expiration for cached user agent information.</remarks>
2426
public MemoryCacheEntryOptions CacheEntryOptions { get; }
2527

2628
/// <summary>

src/HttpUserAgentParser/DependencyInjection/HttpUserAgentParserDependencyInjectionOptions.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,18 @@
55
namespace MyCSharp.HttpUserAgentParser.DependencyInjection;
66

77
/// <summary>
8-
/// Options for dependency injection
8+
/// Configuration options returned by the dependency injection registration methods.
9+
/// Used for fluent configuration of additional features.
910
/// </summary>
1011
/// <remarks>
11-
/// Creates a new instance of <see cref="HttpUserAgentParserDependencyInjectionOptions"/>
12+
/// This class provides access to the service collection for registering additional services
13+
/// such as telemetry or ASP.NET Core integrations.
1214
/// </remarks>
13-
/// <param name="services"></param>
15+
/// <param name="services">The service collection to configure.</param>
1416
public class HttpUserAgentParserDependencyInjectionOptions(IServiceCollection services)
1517
{
1618
/// <summary>
17-
/// Services container
19+
/// Gets the service collection being configured.
1820
/// </summary>
1921
public IServiceCollection Services { get; } = services;
2022
}

src/HttpUserAgentParser/DependencyInjection/HttpUserAgentParserServiceCollectionExtensions.cs

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,14 @@ namespace MyCSharp.HttpUserAgentParser.DependencyInjection;
1111
public static class HttpUserAgentParserServiceCollectionExtensions
1212
{
1313
/// <summary>
14-
/// Registers <see cref="HttpUserAgentParserDefaultProvider"/> as singleton to <see cref="IHttpUserAgentParserProvider"/>
14+
/// Registers <see cref="HttpUserAgentParserDefaultProvider"/> as a singleton implementation of <see cref="IHttpUserAgentParserProvider"/>.
1515
/// </summary>
16+
/// <param name="services">The service collection to add the services to.</param>
17+
/// <returns>Options for further configuration.</returns>
1618
/// <example>
1719
/// <code>
1820
/// IServiceCollection services = new ServiceCollection();
19-
/// services.AddHttpUserAgentParser();
21+
/// HttpUserAgentParserDependencyInjectionOptions options = services.AddHttpUserAgentParser();
2022
/// </code>
2123
/// </example>
2224
public static HttpUserAgentParserDependencyInjectionOptions AddHttpUserAgentParser(
@@ -26,12 +28,18 @@ public static HttpUserAgentParserDependencyInjectionOptions AddHttpUserAgentPars
2628
}
2729

2830
/// <summary>
29-
/// Registers <see cref="HttpUserAgentParserCachedProvider"/> as singleton to <see cref="IHttpUserAgentParserProvider"/>
31+
/// Registers <see cref="HttpUserAgentParserCachedProvider"/> as a singleton implementation of <see cref="IHttpUserAgentParserProvider"/>.
3032
/// </summary>
33+
/// <param name="services">The service collection to add the services to.</param>
34+
/// <returns>Options for further configuration.</returns>
35+
/// <remarks>
36+
/// This provider caches parsed results indefinitely using a <see cref="System.Collections.Concurrent.ConcurrentDictionary{TKey, TValue}"/>.
37+
/// For expiration-based caching, use the MemoryCache package instead.
38+
/// </remarks>
3139
/// <example>
3240
/// <code>
3341
/// IServiceCollection services = new ServiceCollection();
34-
/// services.AddHttpUserAgentCachedParser();
42+
/// HttpUserAgentParserDependencyInjectionOptions options = services.AddHttpUserAgentCachedParser();
3543
/// </code>
3644
/// </example>
3745
public static HttpUserAgentParserDependencyInjectionOptions AddHttpUserAgentCachedParser(
@@ -41,12 +49,16 @@ public static HttpUserAgentParserDependencyInjectionOptions AddHttpUserAgentCach
4149
}
4250

4351
/// <summary>
44-
/// Registers <typeparam name="TProvider"/> as singleton to <see cref="IHttpUserAgentParserProvider"/>
52+
/// Registers a custom <see cref="IHttpUserAgentParserProvider"/> implementation as a singleton.
4553
/// </summary>
54+
/// <typeparam name="TProvider">The provider type implementing <see cref="IHttpUserAgentParserProvider"/>.</typeparam>
55+
/// <param name="services">The service collection to add the services to.</param>
56+
/// <returns>Options for further configuration.</returns>
4657
/// <example>
4758
/// <code>
4859
/// IServiceCollection services = new ServiceCollection();
49-
/// services.AddHttpUserAgentParser&lt;HttpUserAgentParserDefaultProvider&gt;();
60+
/// HttpUserAgentParserDependencyInjectionOptions options = services
61+
/// .AddHttpUserAgentParser&lt;HttpUserAgentParserDefaultProvider&gt;();
5062
/// </code>
5163
/// </example>
5264
public static HttpUserAgentParserDependencyInjectionOptions AddHttpUserAgentParser<TProvider>(

0 commit comments

Comments
 (0)