コード例 #1
0
        public void Copy_NameOnly_SuccesfullyCopied()
        {
            var pair0 = new NameValueHeaderValue("name");
            var pair1 = pair0.Copy();
            Assert.NotSame(pair0, pair1);
            Assert.Same(pair0.Name, pair1.Name);
            Assert.Null(pair0.Value);
            Assert.Null(pair1.Value);

            // Change one value and verify the other is unchanged.
            pair0.Value = "othervalue";
            Assert.Equal("othervalue", pair0.Value);
            Assert.Equal(null, pair1.Value);
        }
コード例 #2
0
        public void CopyAsReadOnly_NameOnly_CopiedAndReadOnly()
        {
            var pair0 = new NameValueHeaderValue("name");
            var pair1 = pair0.CopyAsReadOnly();
            Assert.NotSame(pair0, pair1);
            Assert.Same(pair0.Name, pair1.Name);
            Assert.Null(pair0.Value);
            Assert.Null(pair1.Value);
            Assert.False(pair0.IsReadOnly);
            Assert.True(pair1.IsReadOnly);

            // Change one value and verify the other is unchanged.
            pair0.Value = "othervalue";
            Assert.Equal("othervalue", pair0.Value);
            Assert.Equal(null, pair1.Value);
            Assert.Throws<InvalidOperationException>(() => { pair1.Value = "othervalue"; });
        }
コード例 #3
0
        public async Task UnauthorizedBasicRealmTestWithOptions()
        {
            using var server        = new TestServer(WebHostBuilderHelper.CreateBuilder(o => { }));
            using HttpClient client = server.CreateClient();

            // Act
            HttpResponseMessage response = await client.GetAsync("api/test");

            // Assert
            AuthenticationHeaderValue wwwAuth = response.Headers.WwwAuthenticate.Single();
            NameValueHeaderValue      nvh     = NameValueHeaderValue.Parse(wwwAuth.Parameter);

            Assert.AreEqual(HttpStatusCode.Unauthorized, response.StatusCode, "StatusCode != Unauthorized");
            Assert.AreEqual("Basic", wwwAuth.Scheme, "Scheme != Basic");
            Assert.AreEqual("realm", nvh.Name, "!realm");
            Assert.AreEqual("\"Basic Realm\"", nvh.Value, "!basic realm");
        }
コード例 #4
0
        public async Task UnauthorizedWrongHeaderTest()
        {
            using var server        = new TestServer(WebHostBuilderHelper.CreateStartupBuilder());
            using HttpClient client = server.CreateClient();

            // Arrange
            client.DefaultRequestHeaders.Add(HeaderNames.Authorization, "Basic");

            // Act
            HttpResponseMessage response = await client.GetAsync("api/test");

            // Assert
            AuthenticationHeaderValue wwwAuth = response.Headers.WwwAuthenticate.Single();
            NameValueHeaderValue      nvh     = NameValueHeaderValue.Parse(wwwAuth.Parameter);

            Assert.AreEqual(HttpStatusCode.Unauthorized, response.StatusCode, "StatusCode != Unauthorized");
            Assert.AreEqual("Basic", wwwAuth.Scheme, "Scheme != Basic");
            Assert.AreEqual("realm", nvh.Name, "!realm");
            Assert.AreEqual("\"My realm\"", nvh.Value, "!My realm");
        }
コード例 #5
0
        public void Name_AddNameParameterThenUseProperty_ParametersEntryIsOverwritten()
        {
            var contentDisposition = new ContentDispositionHeaderValue("inline");

            // Note that uppercase letters are used. Comparison should happen case-insensitive.
            NameValueHeaderValue name = new NameValueHeaderValue("NAME", "old_name");
            contentDisposition.Parameters.Add(name);
            Assert.Equal(1, contentDisposition.Parameters.Count);
            Assert.Equal("NAME", contentDisposition.Parameters.First().Name);

            contentDisposition.Name = "new_name";
            Assert.Equal("new_name", contentDisposition.Name);
            Assert.Equal(1, contentDisposition.Parameters.Count);
            Assert.Equal("NAME", contentDisposition.Parameters.First().Name);

            contentDisposition.Parameters.Remove(name);
            Assert.Null(contentDisposition.Name);
        }
コード例 #6
0
        public void Size_AddSizeParameterThenUseProperty_ParametersEntryIsOverwritten()
        {
            var contentDisposition = new ContentDispositionHeaderValue("inline");

            // Note that uppercase letters are used. Comparison should happen case-insensitive.
            var sizeParameter = new NameValueHeaderValue("SIZE", "279172874239");
            contentDisposition.Parameters.Add(sizeParameter);
            Assert.Equal(1, contentDisposition.Parameters.Count);
            Assert.Equal("SIZE", contentDisposition.Parameters.First().Name);
            Assert.Equal(279172874239, contentDisposition.Size);

            contentDisposition.Size = 279172874240;
            Assert.Equal(279172874240, contentDisposition.Size);
            Assert.Equal(1, contentDisposition.Parameters.Count);
            Assert.Equal("SIZE", contentDisposition.Parameters.First().Name);

            contentDisposition.Parameters.Remove(sizeParameter);
            Assert.Null(contentDisposition.Size);
        }
コード例 #7
0
        public void Dates_AddDateParameterThenUseProperty_ParametersEntryIsOverwritten()
        {
            string validDateString = "\"Tue, 15 Nov 1994 08:12:31 GMT\"";
            DateTimeOffset validDate = DateTimeOffset.Parse("Tue, 15 Nov 1994 08:12:31 GMT");

            var contentDisposition = new ContentDispositionHeaderValue("inline");

            // Note that uppercase letters are used. Comparison should happen case-insensitive.
            var dateParameter = new NameValueHeaderValue("Creation-DATE", validDateString);
            contentDisposition.Parameters.Add(dateParameter);
            Assert.Equal(1, contentDisposition.Parameters.Count);
            Assert.Equal("Creation-DATE", contentDisposition.Parameters.First().Name);

            Assert.Equal(validDate, contentDisposition.CreationDate);

            var newDate = validDate.AddSeconds(1);
            contentDisposition.CreationDate = newDate;
            Assert.Equal(newDate, contentDisposition.CreationDate);
            Assert.Equal(1, contentDisposition.Parameters.Count);
            Assert.Equal("Creation-DATE", contentDisposition.Parameters.First().Name);
            Assert.Equal("\"Tue, 15 Nov 1994 08:12:32 GMT\"", contentDisposition.Parameters.First().Value);

            contentDisposition.Parameters.Remove(dateParameter);
            Assert.Null(contentDisposition.CreationDate);
        }
コード例 #8
0
        public void FileNameStar_AddNameParameterThenUseProperty_ParametersEntryIsOverwritten()
        {
            var contentDisposition = new ContentDispositionHeaderValue("inline");

            // Note that uppercase letters are used. Comparison should happen case-insensitive.
            var fileNameStar = new NameValueHeaderValue("FILENAME*", "old_name");
            contentDisposition.Parameters.Add(fileNameStar);
            Assert.Equal(1, contentDisposition.Parameters.Count);
            Assert.Equal("FILENAME*", contentDisposition.Parameters.First().Name);
            Assert.Null(contentDisposition.FileNameStar); // Decode failure

            contentDisposition.FileNameStar = "new_name";
            Assert.Equal("new_name", contentDisposition.FileNameStar);
            Assert.Equal(1, contentDisposition.Parameters.Count);
            Assert.Equal("FILENAME*", contentDisposition.Parameters.First().Name);
            Assert.Equal("UTF-8\'\'new_name", contentDisposition.Parameters.First().Value);

            contentDisposition.Parameters.Remove(fileNameStar);
            Assert.Null(contentDisposition.FileNameStar);
        }
コード例 #9
0
        private static bool TrySetTimeSpan(NameValueHeaderValue nameValue, ref TimeSpan? timeSpan)
        {
            Contract.Requires(nameValue != null);

            if (nameValue.Value == null)
            {
                return false;
            }

            int seconds;
            if (!HeaderUtilities.TryParseInt32(nameValue.Value, out seconds))
            {
                return false;
            }

            timeSpan = new TimeSpan(0, 0, seconds);

            return true;
        }
コード例 #10
0
        private static bool TrySetTokenOnlyValue(NameValueHeaderValue nameValue, ref bool boolField)
        {
            if (nameValue.Value != null)
            {
                return false;
            }

            boolField = true;
            return true;
        }
コード例 #11
0
        public void GetHashCode_ValuesUseDifferentValues_HashDiffersAccordingToRfc()
        {
            var nameValue1 = new NameValueHeaderValue("text");
            var nameValue2 = new NameValueHeaderValue("text");

            nameValue1.Value = null;
            nameValue2.Value = null;
            Assert.Equal(nameValue1.GetHashCode(), nameValue2.GetHashCode());

            nameValue1.Value = "token";
            nameValue2.Value = null;
            Assert.NotEqual(nameValue1.GetHashCode(), nameValue2.GetHashCode());

            nameValue1.Value = "token";
            nameValue2.Value = string.Empty;
            Assert.NotEqual(nameValue1.GetHashCode(), nameValue2.GetHashCode());

            nameValue1.Value = null;
            nameValue2.Value = string.Empty;
            Assert.Equal(nameValue1.GetHashCode(), nameValue2.GetHashCode());

            nameValue1.Value = "token";
            nameValue2.Value = "TOKEN";
            Assert.Equal(nameValue1.GetHashCode(), nameValue2.GetHashCode());

            nameValue1.Value = "token";
            nameValue2.Value = "token";
            Assert.Equal(nameValue1.GetHashCode(), nameValue2.GetHashCode());

            nameValue1.Value = "\"quoted string\"";
            nameValue2.Value = "\"QUOTED STRING\"";
            Assert.NotEqual(nameValue1.GetHashCode(), nameValue2.GetHashCode());

            nameValue1.Value = "\"quoted string\"";
            nameValue2.Value = "\"quoted string\"";
            Assert.Equal(nameValue1.GetHashCode(), nameValue2.GetHashCode());
        }
コード例 #12
0
        public void ToString_UseNoValueAndTokenAndQuotedStringValues_SerializedCorrectly()
        {
            var nameValue = new NameValueHeaderValue("text", "token");
            Assert.Equal("text=token", nameValue.ToString());

            nameValue.Value = "\"quoted string\"";
            Assert.Equal("text=\"quoted string\"", nameValue.ToString());

            nameValue.Value = null;
            Assert.Equal("text", nameValue.ToString());

            nameValue.Value = string.Empty;
            Assert.Equal("text", nameValue.ToString());
        }
コード例 #13
0
 public void Value_CallSetterWithInvalidValues_Throw()
 {
     // Just verify that the setter calls the same validation the ctor invokes.
     Assert.Throws<FormatException>(() => { var x = new NameValueHeaderValue("name"); x.Value = " x "; });
     Assert.Throws<FormatException>(() => { var x = new NameValueHeaderValue("name"); x.Value = "x y"; });
 }
コード例 #14
0
        public void CopyFromReadOnly_NameAndValue_CopiedAsNonReadOnly()
        {
            var pair0 = new NameValueHeaderValue("name", "value");
            var pair1 = pair0.CopyAsReadOnly();
            var pair2 = pair1.Copy();
            Assert.NotSame(pair0, pair1);
            Assert.Same(pair0.Name, pair1.Name);
            Assert.Same(pair0.Value, pair1.Value);

            // Change one value and verify the other is unchanged.
            pair2.Value = "othervalue";
            Assert.Equal("othervalue", pair2.Value);
            Assert.Equal("value", pair1.Value);
        }
コード例 #15
0
        private void CheckValidParse(string?input, NameValueHeaderValue expectedResult)
        {
            var result = NameValueHeaderValue.Parse(input);

            Assert.Equal(expectedResult, result);
        }
コード例 #16
0
        public void SetAndEscapeValue_ThrowsOnInvalidValues(string input)
        {
            var header = new NameValueHeaderValue("test");

            Assert.Throws <FormatException>(() => header.SetAndEscapeValue(input));
        }
コード例 #17
0
        public void Quality_AddQualityParameterThenUseProperty_ParametersEntryIsOverwritten()
        {
            var mediaType = new MediaTypeHeaderValue("text/plain");

            var quality = new NameValueHeaderValue("q", "0.132");
            mediaType.Parameters.Add(quality);
            Assert.Equal(1, mediaType.Parameters.Count);
            Assert.Equal("q", mediaType.Parameters.First().Name);
            Assert.Equal(0.132, mediaType.Quality);

            mediaType.Quality = 0.9;
            Assert.Equal(0.9, mediaType.Quality);
            Assert.Equal(1, mediaType.Parameters.Count);
            Assert.Equal("q", mediaType.Parameters.First().Name);

            mediaType.Parameters.Remove(quality);
            Assert.Null(mediaType.Quality);
        }
コード例 #18
0
        public void Ctor_NameValidFormat_SuccessfullyCreated()
        {
            var nameValue = new NameValueHeaderValue("text", null);

            Assert.Equal("text", nameValue.Name);
        }
コード例 #19
0
 public void GetHashCode_NameUseDifferentCasing_HashDiffersAccordingToRfc()
 {
     var nameValue1 = new NameValueHeaderValue("text");
     var nameValue2 = new NameValueHeaderValue("TEXT");
     Assert.Equal(nameValue1.GetHashCode(), nameValue2.GetHashCode());
 }
コード例 #20
0
        public void Equals_ValuesUseDifferentValues_ValuesAreEqualOrDifferentAccordingToRfc()
        {
            var nameValue1 = new NameValueHeaderValue("text");
            var nameValue2 = new NameValueHeaderValue("text");

            nameValue1.Value = null;
            nameValue2.Value = null;
            Assert.True(nameValue1.Equals(nameValue2), "<null> vs. <null>.");

            nameValue1.Value = "token";
            nameValue2.Value = null;
            Assert.False(nameValue1.Equals(nameValue2), "token vs. <null>.");

            nameValue1.Value = null;
            nameValue2.Value = "token";
            Assert.False(nameValue1.Equals(nameValue2), "<null> vs. token.");

            nameValue1.Value = string.Empty;
            nameValue2.Value = "token";
            Assert.False(nameValue1.Equals(nameValue2), "string.Empty vs. token.");

            nameValue1.Value = null;
            nameValue2.Value = string.Empty;
            Assert.True(nameValue1.Equals(nameValue2), "<null> vs. string.Empty.");

            nameValue1.Value = "token";
            nameValue2.Value = "TOKEN";
            Assert.True(nameValue1.Equals(nameValue2), "token vs. TOKEN.");

            nameValue1.Value = "token";
            nameValue2.Value = "token";
            Assert.True(nameValue1.Equals(nameValue2), "token vs. token.");

            nameValue1.Value = "\"quoted string\"";
            nameValue2.Value = "\"QUOTED STRING\"";
            Assert.False(nameValue1.Equals(nameValue2), "\"quoted string\" vs. \"QUOTED STRING\".");

            nameValue1.Value = "\"quoted string\"";
            nameValue2.Value = "\"quoted string\"";
            Assert.True(nameValue1.Equals(nameValue2), "\"quoted string\" vs. \"quoted string\".");

            Assert.False(nameValue1.Equals(null), "\"quoted string\" vs. <null>.");
        }
コード例 #21
0
 public void Equals_NameUseDifferentCasing_ConsideredEqual()
 {
     var nameValue1 = new NameValueHeaderValue("text");
     var nameValue2 = new NameValueHeaderValue("TEXT");
     Assert.True(nameValue1.Equals(nameValue2), "text vs. TEXT.");
 }
コード例 #22
0
        private static bool TrySetOptionalTokenList(
            NameValueHeaderValue nameValue,
            ref bool boolField,
            ref ICollection<string> destination)
        {
            Contract.Requires(nameValue != null);

            if (nameValue.Value == null)
            {
                boolField = true;
                return true;
            }

            // We need the string to be at least 3 chars long: 2x quotes and at least 1 character. Also make sure we
            // have a quoted string. Note that NameValueHeaderValue will never have leading/trailing whitespaces.
            var valueString = nameValue.Value;
            if ((valueString.Length < 3) || (valueString[0] != '\"') || (valueString[valueString.Length - 1] != '\"'))
            {
                return false;
            }

            // We have a quoted string. Now verify that the string contains a list of valid tokens separated by ','.
            var current = 1; // skip the initial '"' character.
            var maxLength = valueString.Length - 1; // -1 because we don't want to parse the final '"'.
            var separatorFound = false;
            var originalValueCount = destination == null ? 0 : destination.Count;
            while (current < maxLength)
            {
                current = HeaderUtilities.GetNextNonEmptyOrWhitespaceIndex(valueString, current, true,
                    out separatorFound);

                if (current == maxLength)
                {
                    break;
                }

                var tokenLength = HttpRuleParser.GetTokenLength(valueString, current);

                if (tokenLength == 0)
                {
                    // We already skipped whitespaces and separators. If we don't have a token it must be an invalid
                    // character.
                    return false;
                }

                if (destination == null)
                {
                    destination = new ObjectCollection<string>(CheckIsValidTokenAction);
                }

                destination.Add(valueString.Substring(current, tokenLength));

                current = current + tokenLength;
            }

            // After parsing a valid token list, we expect to have at least one value
            if ((destination != null) && (destination.Count > originalValueCount))
            {
                boolField = true;
                return true;
            }

            return false;
        }
コード例 #23
0
 public void Ctor_NameValidFormat_SuccessfullyCreated()
 {
     var nameValue = new NameValueHeaderValue("text", null);
     Assert.Equal("text", nameValue.Name);
 }
コード例 #24
0
        public void FileName_UnknownOrBadEncoding_PropertyFails()
        {
            var contentDisposition = new ContentDispositionHeaderValue("inline");

            // Note that uppercase letters are used. Comparison should happen case-insensitive.
            var fileName = new NameValueHeaderValue("FILENAME", "\"=?utf-99?Q?R=mlsZcODTmFtZS5iYXQ=?=\"");
            contentDisposition.Parameters.Add(fileName);
            Assert.Equal(1, contentDisposition.Parameters.Count);
            Assert.Equal("FILENAME", contentDisposition.Parameters.First().Name);
            Assert.Equal("\"=?utf-99?Q?R=mlsZcODTmFtZS5iYXQ=?=\"", contentDisposition.Parameters.First().Value);
            Assert.Equal("\"=?utf-99?Q?R=mlsZcODTmFtZS5iYXQ=?=\"", contentDisposition.FileName);

            contentDisposition.FileName = "new_name";
            Assert.Equal("new_name", contentDisposition.FileName);
            Assert.Equal(1, contentDisposition.Parameters.Count);
            Assert.Equal("FILENAME", contentDisposition.Parameters.First().Name);

            contentDisposition.Parameters.Remove(fileName);
            Assert.Null(contentDisposition.FileName);
        }
コード例 #25
0
 private void CheckValidParse(string input, NameValueHeaderValue expectedResult)
 {
     var result = NameValueHeaderValue.Parse(input);
     Assert.Equal(expectedResult, result);
 }
コード例 #26
0
        public void FileNameStar_UnknownOrBadEncoding_PropertyFails()
        {
            var contentDisposition = new ContentDispositionHeaderValue("inline");

            // Note that uppercase letters are used. Comparison should happen case-insensitive.
            var fileNameStar = new NameValueHeaderValue("FILENAME*", "utf-99'lang'File%CZName.bat");
            contentDisposition.Parameters.Add(fileNameStar);
            Assert.Equal(1, contentDisposition.Parameters.Count);
            Assert.Equal("FILENAME*", contentDisposition.Parameters.First().Name);
            Assert.Equal("utf-99'lang'File%CZName.bat", contentDisposition.Parameters.First().Value);
            Assert.Null(contentDisposition.FileNameStar); // Decode failure

            contentDisposition.FileNameStar = "new_name";
            Assert.Equal("new_name", contentDisposition.FileNameStar);
            Assert.Equal(1, contentDisposition.Parameters.Count);
            Assert.Equal("FILENAME*", contentDisposition.Parameters.First().Name);

            contentDisposition.Parameters.Remove(fileNameStar);
            Assert.Null(contentDisposition.FileNameStar);
        }
コード例 #27
0
 private void CheckValidTryParse(string input, NameValueHeaderValue expectedResult)
 {
     NameValueHeaderValue result = null;
     Assert.True(NameValueHeaderValue.TryParse(input, out result));
     Assert.Equal(expectedResult, result);
 }
コード例 #28
0
        public void Dates_InvalidDates_PropertyFails()
        {
            string invalidDateString = "\"Tue, 15 Nov 94 08:12 GMT\"";

            var contentDisposition = new ContentDispositionHeaderValue("inline");

            // Note that uppercase letters are used. Comparison should happen case-insensitive.
            var dateParameter = new NameValueHeaderValue("read-DATE", invalidDateString);
            contentDisposition.Parameters.Add(dateParameter);
            Assert.Equal(1, contentDisposition.Parameters.Count);
            Assert.Equal("read-DATE", contentDisposition.Parameters.First().Name);

            Assert.Null(contentDisposition.ReadDate);

            contentDisposition.ReadDate = null;
            Assert.Null(contentDisposition.ReadDate);
            Assert.Equal(0, contentDisposition.Parameters.Count);
        }
コード例 #29
0
 private static void CheckValue(string value)
 {
     var nameValue = new NameValueHeaderValue("text", value);
     Assert.Equal(value, nameValue.Value);
 }
コード例 #30
0
        public void Size_InvalidSizes_PropertyFails()
        {
            var contentDisposition = new ContentDispositionHeaderValue("inline");

            // Note that uppercase letters are used. Comparison should happen case-insensitive.
            var sizeParameter = new NameValueHeaderValue("SIZE", "-279172874239");
            contentDisposition.Parameters.Add(sizeParameter);
            Assert.Equal(1, contentDisposition.Parameters.Count);
            Assert.Equal("SIZE", contentDisposition.Parameters.First().Name);
            Assert.Null(contentDisposition.Size);

            // Negatives not allowed
            Assert.Throws<ArgumentOutOfRangeException>(() => contentDisposition.Size = -279172874240);
            Assert.Null(contentDisposition.Size);
            Assert.Equal(1, contentDisposition.Parameters.Count);
            Assert.Equal("SIZE", contentDisposition.Parameters.First().Name);

            contentDisposition.Parameters.Remove(sizeParameter);
            Assert.Null(contentDisposition.Size);
        }
コード例 #31
0
 public static bool TryParse(string input, out NameValueHeaderValue parsedValue)
 {
     var index = 0;
     return SingleValueParser.TryParseValue(input, ref index, out parsedValue);
 }
コード例 #32
0
        public void Charset_AddCharsetParameterThenUseProperty_ParametersEntryIsOverwritten()
        {
            var mediaType = new MediaTypeHeaderValue("text/plain");

            // Note that uppercase letters are used. Comparison should happen case-insensitive.
            var charset = new NameValueHeaderValue("CHARSET", "old_charset");
            mediaType.Parameters.Add(charset);
            Assert.Equal(1, mediaType.Parameters.Count);
            Assert.Equal("CHARSET", mediaType.Parameters.First().Name);

            mediaType.Charset = "new_charset";
            Assert.Equal("new_charset", mediaType.Charset);
            Assert.Equal(1, mediaType.Parameters.Count);
            Assert.Equal("CHARSET", mediaType.Parameters.First().Name);

            mediaType.Parameters.Remove(charset);
            Assert.Null(mediaType.Charset);
        }
コード例 #33
0
 /// <inheritdoc />
 public override int GetHashCode()
 {
     // The dispositionType string is case-insensitive.
     return(StringSegmentComparer.OrdinalIgnoreCase.GetHashCode(_dispositionType) ^ NameValueHeaderValue.GetHashCode(_parameters));
 }
コード例 #34
0
        public void Quality_AddQualityParameterUpperCase_CaseInsensitiveComparison()
        {
            var mediaType = new MediaTypeHeaderValue("text/plain");

            var quality = new NameValueHeaderValue("Q", "0.132");
            mediaType.Parameters.Add(quality);
            Assert.Equal(1, mediaType.Parameters.Count);
            Assert.Equal("Q", mediaType.Parameters.First().Name);
            Assert.Equal(0.132, mediaType.Quality);
        }
コード例 #35
0
 public void Value_CallSetterWithInvalidValues_Throw()
 {
     // Just verify that the setter calls the same validation the ctor invokes.
     Assert.Throws <FormatException>(() => { var x = new NameValueHeaderValue("name"); x.Value = " x "; });
     Assert.Throws <FormatException>(() => { var x = new NameValueHeaderValue("name"); x.Value = "x y"; });
 }
コード例 #36
0
        private static int GetNameValueLength(string input, int startIndex, out NameValueHeaderValue parsedValue)
        {
            Contract.Requires(input != null);
            Contract.Requires(startIndex >= 0);

            parsedValue = null;

            if (string.IsNullOrEmpty(input) || (startIndex >= input.Length))
            {
                return 0;
            }

            // Parse the name, i.e. <name> in name/value string "<name>=<value>". Caller must remove
            // leading whitespaces.
            var nameLength = HttpRuleParser.GetTokenLength(input, startIndex);

            if (nameLength == 0)
            {
                return 0;
            }

            var name = input.Substring(startIndex, nameLength);
            var current = startIndex + nameLength;
            current = current + HttpRuleParser.GetWhitespaceLength(input, current);

            // Parse the separator between name and value
            if ((current == input.Length) || (input[current] != '='))
            {
                // We only have a name and that's OK. Return.
                parsedValue = new NameValueHeaderValue();
                parsedValue._name = name;
                current = current + HttpRuleParser.GetWhitespaceLength(input, current); // skip whitespaces
                return current - startIndex;
            }

            current++; // skip delimiter.
            current = current + HttpRuleParser.GetWhitespaceLength(input, current);

            // Parse the value, i.e. <value> in name/value string "<name>=<value>"
            int valueLength = GetValueLength(input, current);

            // Value after the '=' may be empty
            // Use parameterless ctor to avoid double-parsing of name and value, i.e. skip public ctor validation.
            parsedValue = new NameValueHeaderValue();
            parsedValue._name = name;
            parsedValue._value = input.Substring(current, valueLength);
            current = current + valueLength;
            current = current + HttpRuleParser.GetWhitespaceLength(input, current); // skip whitespaces
            return current - startIndex;
        }
コード例 #37
0
 /// <inheritdoc />
 public override string ToString()
 {
     return(_dispositionType + NameValueHeaderValue.ToString(_parameters, ';', true));
 }