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); }
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"; }); }
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"); }
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"); }
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); }
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); }
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); }
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); }
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; }
private static bool TrySetTokenOnlyValue(NameValueHeaderValue nameValue, ref bool boolField) { if (nameValue.Value != null) { return false; } boolField = true; return true; }
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()); }
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()); }
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"; }); }
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); }
private void CheckValidParse(string?input, NameValueHeaderValue expectedResult) { var result = NameValueHeaderValue.Parse(input); Assert.Equal(expectedResult, result); }
public void SetAndEscapeValue_ThrowsOnInvalidValues(string input) { var header = new NameValueHeaderValue("test"); Assert.Throws <FormatException>(() => header.SetAndEscapeValue(input)); }
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); }
public void Ctor_NameValidFormat_SuccessfullyCreated() { var nameValue = new NameValueHeaderValue("text", null); Assert.Equal("text", nameValue.Name); }
public void GetHashCode_NameUseDifferentCasing_HashDiffersAccordingToRfc() { var nameValue1 = new NameValueHeaderValue("text"); var nameValue2 = new NameValueHeaderValue("TEXT"); Assert.Equal(nameValue1.GetHashCode(), nameValue2.GetHashCode()); }
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>."); }
public void Equals_NameUseDifferentCasing_ConsideredEqual() { var nameValue1 = new NameValueHeaderValue("text"); var nameValue2 = new NameValueHeaderValue("TEXT"); Assert.True(nameValue1.Equals(nameValue2), "text vs. TEXT."); }
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; }
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); }
private void CheckValidParse(string input, NameValueHeaderValue expectedResult) { var result = NameValueHeaderValue.Parse(input); Assert.Equal(expectedResult, result); }
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); }
private void CheckValidTryParse(string input, NameValueHeaderValue expectedResult) { NameValueHeaderValue result = null; Assert.True(NameValueHeaderValue.TryParse(input, out result)); Assert.Equal(expectedResult, result); }
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); }
private static void CheckValue(string value) { var nameValue = new NameValueHeaderValue("text", value); Assert.Equal(value, nameValue.Value); }
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); }
public static bool TryParse(string input, out NameValueHeaderValue parsedValue) { var index = 0; return SingleValueParser.TryParseValue(input, ref index, out parsedValue); }
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); }
/// <inheritdoc /> public override int GetHashCode() { // The dispositionType string is case-insensitive. return(StringSegmentComparer.OrdinalIgnoreCase.GetHashCode(_dispositionType) ^ NameValueHeaderValue.GetHashCode(_parameters)); }
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); }
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"; }); }
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; }
/// <inheritdoc /> public override string ToString() { return(_dispositionType + NameValueHeaderValue.ToString(_parameters, ';', true)); }