< Summary

Information
Class: System.Net.Http.Headers.GenericHeaderParser
Assembly: System.Net.Http
File(s): D:\runner\runtime\src\libraries\System.Net.Http\src\System\Net\Http\Headers\GenericHeaderParser.cs
Line coverage
98%
Covered lines: 79
Uncovered lines: 1
Coverable lines: 80
Total lines: 151
Line coverage: 98.7%
Branch coverage
100%
Covered branches: 4
Total branches: 4
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
.cctor()100%11100%
.ctor(...)100%11100%
.ctor(...)100%11100%
GetParsedValueLength(...)100%11100%
ParseNameValue(...)100%11100%
ParseProduct(...)100%11100%
ParseSingleEntityTag(...)100%22100%
ParseMultipleEntityTags(...)100%11100%
ParseWithoutValidation(...)100%22100%
ParseHost(...)100%11100%
ParseTokenList(...)100%11100%

File(s)

D:\runner\runtime\src\libraries\System.Net.Http\src\System\Net\Http\Headers\GenericHeaderParser.cs

#LineLine coverage
 1// Licensed to the .NET Foundation under one or more agreements.
 2// The .NET Foundation licenses this file to you under the MIT license.
 3
 4using System.Collections;
 5using System.Diagnostics;
 6
 7namespace System.Net.Http.Headers
 8{
 9    internal sealed class GenericHeaderParser : BaseHeaderParser
 10    {
 11        private delegate int GetParsedValueLengthDelegate(string value, int startIndex, out object? parsedValue);
 12
 13        #region Parser instances
 14
 115        internal static readonly GenericHeaderParser HostParser = new GenericHeaderParser(false, ParseHost, StringCompar
 116        internal static readonly GenericHeaderParser TokenListParser = new GenericHeaderParser(true, ParseTokenList, Str
 117        internal static readonly GenericHeaderParser SingleValueNameValueWithParametersParser = new GenericHeaderParser(
 118        internal static readonly GenericHeaderParser MultipleValueNameValueWithParametersParser = new GenericHeaderParse
 119        internal static readonly GenericHeaderParser SingleValueNameValueParser = new GenericHeaderParser(false, ParseNa
 120        internal static readonly GenericHeaderParser MultipleValueNameValueParser = new GenericHeaderParser(true, ParseN
 121        internal static readonly GenericHeaderParser SingleValueParserWithoutValidation = new GenericHeaderParser(false,
 122        internal static readonly GenericHeaderParser SingleValueProductParser = new GenericHeaderParser(false, ParseProd
 123        internal static readonly GenericHeaderParser MultipleValueProductParser = new GenericHeaderParser(true, ParsePro
 124        internal static readonly GenericHeaderParser RangeConditionParser = new GenericHeaderParser(false, RangeConditio
 125        internal static readonly GenericHeaderParser SingleValueAuthenticationParser = new GenericHeaderParser(false, Au
 126        internal static readonly GenericHeaderParser MultipleValueAuthenticationParser = new GenericHeaderParser(true, A
 127        internal static readonly GenericHeaderParser RangeParser = new GenericHeaderParser(false, RangeHeaderValue.GetRa
 128        internal static readonly GenericHeaderParser RetryConditionParser = new GenericHeaderParser(false, RetryConditio
 129        internal static readonly GenericHeaderParser ContentRangeParser = new GenericHeaderParser(false, ContentRangeHea
 130        internal static readonly GenericHeaderParser ContentDispositionParser = new GenericHeaderParser(false, ContentDi
 131        internal static readonly GenericHeaderParser SingleValueStringWithQualityParser = new GenericHeaderParser(false,
 132        internal static readonly GenericHeaderParser MultipleValueStringWithQualityParser = new GenericHeaderParser(true
 133        internal static readonly GenericHeaderParser SingleValueEntityTagParser = new GenericHeaderParser(false, ParseSi
 134        internal static readonly GenericHeaderParser MultipleValueEntityTagParser = new GenericHeaderParser(true, ParseM
 135        internal static readonly GenericHeaderParser SingleValueViaParser = new GenericHeaderParser(false, ViaHeaderValu
 136        internal static readonly GenericHeaderParser MultipleValueViaParser = new GenericHeaderParser(true, ViaHeaderVal
 137        internal static readonly GenericHeaderParser SingleValueWarningParser = new GenericHeaderParser(false, WarningHe
 138        internal static readonly GenericHeaderParser MultipleValueWarningParser = new GenericHeaderParser(true, WarningH
 39
 40        #endregion
 41
 42        private readonly GetParsedValueLengthDelegate _getParsedValueLength;
 43        private readonly IEqualityComparer? _comparer;
 44
 45        public override IEqualityComparer? Comparer
 46        {
 047            get { return _comparer; }
 48        }
 49
 50        private GenericHeaderParser(bool supportsMultipleValues, GetParsedValueLengthDelegate getParsedValueLength)
 2251            : this(supportsMultipleValues, getParsedValueLength, null)
 2252        {
 2253        }
 54
 55        private GenericHeaderParser(bool supportsMultipleValues, GetParsedValueLengthDelegate getParsedValueLength,
 56            IEqualityComparer? comparer)
 2457            : base(supportsMultipleValues)
 2458        {
 2459            Debug.Assert(getParsedValueLength != null);
 60
 2461            _getParsedValueLength = getParsedValueLength;
 2462            _comparer = comparer;
 2463        }
 64
 65        protected override int GetParsedValueLength(string value, int startIndex, object? storeValue,
 66            out object? parsedValue)
 61309267        {
 61309268            return _getParsedValueLength(value, startIndex, out parsedValue);
 61309269        }
 70
 71        #region Parse methods
 72
 73        private static int ParseNameValue(string value, int startIndex, out object? parsedValue)
 23768874        {
 23768875            int resultLength = NameValueHeaderValue.GetNameValueLength(value, startIndex, out NameValueHeaderValue? temp
 76
 23768877            parsedValue = temp;
 23768878            return resultLength;
 23768879        }
 80
 81        private static int ParseProduct(string value, int startIndex, out object? parsedValue)
 1455082        {
 1455083            int resultLength = ProductHeaderValue.GetProductLength(value, startIndex, out ProductHeaderValue? temp);
 84
 1455085            parsedValue = temp;
 1455086            return resultLength;
 1455087        }
 88
 89        private static int ParseSingleEntityTag(string value, int startIndex, out object? parsedValue)
 5290        {
 5291            parsedValue = null;
 92
 5293            int resultLength = EntityTagHeaderValue.GetEntityTagLength(value, startIndex, out EntityTagHeaderValue? temp
 94
 95            // If we don't allow '*' ("Any") as valid ETag value, return false (e.g. 'ETag' header)
 5296            if (temp == EntityTagHeaderValue.Any)
 897            {
 898                return 0;
 99            }
 100
 44101            parsedValue = temp;
 44102            return resultLength;
 52103        }
 104
 105        // Note that if multiple ETag values are allowed (e.g. 'If-Match', 'If-None-Match'), according to the RFC
 106        // the value must either be '*' or a list of ETag values. It's not allowed to have both '*' and a list of
 107        // ETag values. We're not that strict: We allow both '*' and ETag values in a list. If the server sends such
 108        // an invalid list, we want to be able to represent it using the corresponding header property.
 109        private static int ParseMultipleEntityTags(string value, int startIndex, out object? parsedValue)
 1880110        {
 1880111            int resultLength = EntityTagHeaderValue.GetEntityTagLength(value, startIndex, out EntityTagHeaderValue? temp
 112
 1880113            parsedValue = temp;
 1880114            return resultLength;
 1880115        }
 116
 117        /// <summary>
 118        /// Allows for arbitrary header values without validation (aside from newline, which is always invalid in a head
 119        /// </summary>
 120        private static int ParseWithoutValidation(string value, int startIndex, out object? parsedValue)
 10121        {
 10122            if (HttpRuleParser.ContainsNewLineOrNull(value, startIndex))
 4123            {
 4124                parsedValue = null;
 4125                return 0;
 126            }
 127
 6128            string result = value.Substring(startIndex);
 129
 6130            parsedValue = result;
 6131            return result.Length;
 10132        }
 133
 134        private static int ParseHost(string value, int startIndex, out object? parsedValue)
 52135        {
 52136            int hostLength = HttpRuleParser.GetHostLength(value, startIndex, false);
 137
 52138            parsedValue = value.Substring(startIndex, hostLength);
 52139            return hostLength;
 52140        }
 141
 142        private static int ParseTokenList(string value, int startIndex, out object parsedValue)
 14223143        {
 14223144            int resultLength = HttpRuleParser.GetTokenLength(value, startIndex);
 145
 14223146            parsedValue = value.Substring(startIndex, resultLength);
 14223147            return resultLength;
 14223148        }
 149        #endregion
 150    }
 151}