Skip to content

Commit 68654ee

Browse files
committed
feat(parser): add fast-path rules for user agent parsing
- Introduce HttpUserAgentFastRules for efficient token matching - Update HttpUserAgentParser to utilize fast-path rules - Enhance documentation with examples for public methods - Add unit tests for new functionality and existing behavior
1 parent 783a311 commit 68654ee

15 files changed

Lines changed: 562 additions & 287 deletions

src/HttpUserAgentParser.AspNetCore/DependencyInjection/HttpUserAgentParserDependencyInjectionOptionsExtensions.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,12 @@ public static class HttpUserAgentParserDependencyInjectionOptionsExtensions
1515
/// Registers <see cref="HttpUserAgentParserAccessor"/> as <see cref="IHttpUserAgentParserAccessor"/>.
1616
/// Requires a registered <see cref="IHttpUserAgentParserProvider"/>
1717
/// </summary>
18+
/// <example>
19+
/// <code>
20+
/// IServiceCollection services = new ServiceCollection();
21+
/// services.AddHttpUserAgentParser().AddHttpUserAgentParserAccessor();
22+
/// </code>
23+
/// </example>
1824
public static HttpUserAgentParserDependencyInjectionOptions AddHttpUserAgentParserAccessor(
1925
this HttpUserAgentParserDependencyInjectionOptions options)
2026
{

src/HttpUserAgentParser.AspNetCore/HttpContextExtensions.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,11 @@ public static class HttpContextExtensions
1313
/// <summary>
1414
/// Returns the User-Agent header value
1515
/// </summary>
16+
/// <example>
17+
/// <code>
18+
/// string? userAgent = httpContext.GetUserAgentString();
19+
/// </code>
20+
/// </example>
1621
public static string? GetUserAgentString(this HttpContext httpContext)
1722
{
1823
if (httpContext.Request.Headers.TryGetValue("User-Agent", out StringValues value))

src/HttpUserAgentParser.AspNetCore/HttpUserAgentParserAccessor.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,22 @@ public class HttpUserAgentParserAccessor(IHttpUserAgentParserProvider httpUserAg
1919
/// <summary>
2020
/// User agent of current <see cref="IHttpContextAccessor"/>
2121
/// </summary>
22+
/// <example>
23+
/// <code>
24+
/// string? userAgent = accessor.GetHttpContextUserAgent(httpContext);
25+
/// </code>
26+
/// </example>
2227
public string? GetHttpContextUserAgent(HttpContext httpContext)
2328
=> httpContext.GetUserAgentString();
2429

2530
/// <summary>
2631
/// Returns current <see cref="HttpUserAgentInformation"/> of current <see cref="IHttpContextAccessor"/>
2732
/// </summary>
33+
/// <example>
34+
/// <code>
35+
/// HttpUserAgentInformation? info = accessor.Get(httpContext);
36+
/// </code>
37+
/// </example>
2838
public HttpUserAgentInformation? Get(HttpContext httpContext)
2939
{
3040
string? httpUserAgent = GetHttpContextUserAgent(httpContext);

src/HttpUserAgentParser.MemoryCache/DependencyInjection/HttpUserAgentParserMemoryCacheServiceCollectionExtensions.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,16 @@ public static class HttpUserAgentParserMemoryCacheServiceCollectionExtensions
1414
/// <summary>
1515
/// Registers <see cref="HttpUserAgentParserCachedProvider"/> as singleton to <see cref="IHttpUserAgentParserProvider"/>
1616
/// </summary>
17+
/// <example>
18+
/// <code>
19+
/// IServiceCollection services = new ServiceCollection();
20+
/// services.AddHttpUserAgentMemoryCachedParser(options =>
21+
/// {
22+
/// options.CacheOptions.SizeLimit = 512;
23+
/// options.CacheEntryOptions.SlidingExpiration = TimeSpan.FromHours(6);
24+
/// });
25+
/// </code>
26+
/// </example>
1727
public static HttpUserAgentParserDependencyInjectionOptions AddHttpUserAgentMemoryCachedParser(
1828
this IServiceCollection services, Action<HttpUserAgentParserMemoryCachedProviderOptions>? options = null)
1929
{

src/HttpUserAgentParser.MemoryCache/HttpUserAgentParserMemoryCachedProviderOptions.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,18 +26,36 @@ public class HttpUserAgentParserMemoryCachedProviderOptions
2626
/// <summary>
2727
/// Creates a new instance of <see cref="HttpUserAgentParserMemoryCachedProviderOptions"/>
2828
/// </summary>
29+
/// <example>
30+
/// <code>
31+
/// var options = new HttpUserAgentParserMemoryCachedProviderOptions(new MemoryCacheOptions { SizeLimit = 512 });
32+
/// </code>
33+
/// </example>
2934
public HttpUserAgentParserMemoryCachedProviderOptions(MemoryCacheOptions cacheOptions)
3035
: this(cacheOptions, null) { }
3136

3237
/// <summary>
3338
/// Creates a new instance of <see cref="HttpUserAgentParserMemoryCachedProviderOptions"/>
3439
/// </summary>
40+
/// <example>
41+
/// <code>
42+
/// var options = new HttpUserAgentParserMemoryCachedProviderOptions(
43+
/// new MemoryCacheEntryOptions { SlidingExpiration = TimeSpan.FromHours(6) });
44+
/// </code>
45+
/// </example>
3546
public HttpUserAgentParserMemoryCachedProviderOptions(MemoryCacheEntryOptions cacheEntryOptions)
3647
: this(null, cacheEntryOptions) { }
3748

3849
/// <summary>
3950
/// Creates a new instance of <see cref="HttpUserAgentParserMemoryCachedProviderOptions"/>
4051
/// </summary>
52+
/// <example>
53+
/// <code>
54+
/// var options = new HttpUserAgentParserMemoryCachedProviderOptions(
55+
/// new MemoryCacheOptions { SizeLimit = 512 },
56+
/// new MemoryCacheEntryOptions { SlidingExpiration = TimeSpan.FromHours(6) });
57+
/// </code>
58+
/// </example>
4159
public HttpUserAgentParserMemoryCachedProviderOptions(
4260
MemoryCacheOptions? cacheOptions = null, MemoryCacheEntryOptions? cacheEntryOptions = null)
4361
{

src/HttpUserAgentParser/DependencyInjection/HttpUserAgentParserServiceCollectionExtensions.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,12 @@ public static class HttpUserAgentParserServiceCollectionExtensions
1313
/// <summary>
1414
/// Registers <see cref="HttpUserAgentParserDefaultProvider"/> as singleton to <see cref="IHttpUserAgentParserProvider"/>
1515
/// </summary>
16+
/// <example>
17+
/// <code>
18+
/// IServiceCollection services = new ServiceCollection();
19+
/// services.AddHttpUserAgentParser();
20+
/// </code>
21+
/// </example>
1622
public static HttpUserAgentParserDependencyInjectionOptions AddHttpUserAgentParser(
1723
this IServiceCollection services)
1824
{
@@ -22,6 +28,12 @@ public static HttpUserAgentParserDependencyInjectionOptions AddHttpUserAgentPars
2228
/// <summary>
2329
/// Registers <see cref="HttpUserAgentParserCachedProvider"/> as singleton to <see cref="IHttpUserAgentParserProvider"/>
2430
/// </summary>
31+
/// <example>
32+
/// <code>
33+
/// IServiceCollection services = new ServiceCollection();
34+
/// services.AddHttpUserAgentCachedParser();
35+
/// </code>
36+
/// </example>
2537
public static HttpUserAgentParserDependencyInjectionOptions AddHttpUserAgentCachedParser(
2638
this IServiceCollection services)
2739
{
@@ -31,6 +43,12 @@ public static HttpUserAgentParserDependencyInjectionOptions AddHttpUserAgentCach
3143
/// <summary>
3244
/// Registers <typeparam name="TProvider"/> as singleton to <see cref="IHttpUserAgentParserProvider"/>
3345
/// </summary>
46+
/// <example>
47+
/// <code>
48+
/// IServiceCollection services = new ServiceCollection();
49+
/// services.AddHttpUserAgentParser&lt;HttpUserAgentParserDefaultProvider&gt;();
50+
/// </code>
51+
/// </example>
3452
public static HttpUserAgentParserDependencyInjectionOptions AddHttpUserAgentParser<TProvider>(
3553
this IServiceCollection services) where TProvider : class, IHttpUserAgentParserProvider
3654
{

0 commit comments

Comments
 (0)