< 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)
 12501167        {
 12501168            return _getParsedValueLength(value, startIndex, out parsedValue);
 12501169        }
 70
 71        #region Parse methods
 72
 73        private static int ParseNameValue(string value, int startIndex, out object? parsedValue)
 3312074        {
 3312075            int resultLength = NameValueHeaderValue.GetNameValueLength(value, startIndex, out NameValueHeaderValue? temp
 76
 3312077            parsedValue = temp;
 3312078            return resultLength;
 3312079        }
 80
 81        private static int ParseProduct(string value, int startIndex, out object? parsedValue)
 1476082        {
 1476083            int resultLength = ProductHeaderValue.GetProductLength(value, startIndex, out ProductHeaderValue? temp);
 84
 1476085            parsedValue = temp;
 1476086            return resultLength;
 1476087        }
 88
 89        private static int ParseSingleEntityTag(string value, int startIndex, out object? parsedValue)
 1490        {
 1491            parsedValue = null;
 92
 1493            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)
 1496            if (temp == EntityTagHeaderValue.Any)
 297            {
 298                return 0;
 99            }
 100
 12101            parsedValue = temp;
 12102            return resultLength;
 14103        }
 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)
 1376110        {
 1376111            int resultLength = EntityTagHeaderValue.GetEntityTagLength(value, startIndex, out EntityTagHeaderValue? temp
 112
 1376113            parsedValue = temp;
 1376114            return resultLength;
 1376115        }
 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)
 8121        {
 8122            if (HttpRuleParser.ContainsNewLineOrNull(value, startIndex))
 6123            {
 6124                parsedValue = null;
 6125                return 0;
 126            }
 127
 2128            string result = value.Substring(startIndex);
 129
 2130            parsedValue = result;
 2131            return result.Length;
 8132        }
 133
 134        private static int ParseHost(string value, int startIndex, out object? parsedValue)
 54135        {
 54136            int hostLength = HttpRuleParser.GetHostLength(value, startIndex, false);
 137
 54138            parsedValue = value.Substring(startIndex, hostLength);
 54139            return hostLength;
 54140        }
 141
 142        private static int ParseTokenList(string value, int startIndex, out object parsedValue)
 2148143        {
 2148144            int resultLength = HttpRuleParser.GetTokenLength(value, startIndex);
 145
 2148146            parsedValue = value.Substring(startIndex, resultLength);
 2148147            return resultLength;
 2148148        }
 149        #endregion
 150    }
 151}