private static void ValidateBoundary(string boundary) { // NameValueHeaderValue is too restrictive for boundary. // Instead validate it ourselves and then quote it. if (string.IsNullOrWhiteSpace(boundary)) { throw new ArgumentException(SR.net_http_argument_empty_string, nameof(boundary)); } // RFC 2046 Section 5.1.1 // boundary := 0*69<bchars> bcharsnospace // bchars := bcharsnospace / " " // bcharsnospace := DIGIT / ALPHA / "'" / "(" / ")" / "+" / "_" / "," / "-" / "." / "/" / ":" / "=" / "?" if (boundary.Length > 70) { throw new ArgumentOutOfRangeException(nameof(boundary), boundary, SR.Format(System.Globalization.CultureInfo.InvariantCulture, SR.net_http_content_field_too_long, 70)); } // Cannot end with space. if (boundary.EndsWith(' ')) { throw new ArgumentException(SR.Format(System.Globalization.CultureInfo.InvariantCulture, SR.net_http_headers_invalid_value, boundary), nameof(boundary)); } const string AllowedMarks = @"'()+_,-./:=? "; foreach (char ch in boundary) { if (!char.IsAsciiLetterOrDigit(ch) && !AllowedMarks.Contains(ch)) // Marks. { throw new ArgumentException(SR.Format(System.Globalization.CultureInfo.InvariantCulture, SR.net_http_headers_invalid_value, boundary), nameof(boundary)); } } }
private static void ValidateBoundary(string boundary) { // NameValueHeaderValue is too restrictive for boundary. // Instead validate it ourselves and then quote it. if (string.IsNullOrWhiteSpace(boundary)) { throw new ArgumentException(SR.net_http_argument_empty_string, nameof(boundary)); } // RFC 2046 Section 5.1.1 // boundary := 0*69<bchars> bcharsnospace // bchars := bcharsnospace / " " // bcharsnospace := DIGIT / ALPHA / "'" / "(" / ")" / "+" / "_" / "," / "-" / "." / "/" / ":" / "=" / "?" if (boundary.Length > 70) { throw new ArgumentOutOfRangeException(nameof(boundary), boundary, string.Format(System.Globalization.CultureInfo.InvariantCulture, SR.net_http_content_field_too_long, 70)); } // Cannot end with space. if (boundary.EndsWith(" ", StringComparison.Ordinal)) { throw new ArgumentException(string.Format(System.Globalization.CultureInfo.InvariantCulture, SR.net_http_headers_invalid_value, boundary), nameof(boundary)); } Contract.EndContractBlock(); const string AllowedMarks = @"'()+_,-./:=? "; foreach (char ch in boundary) { if (('0' <= ch && ch <= '9') || // Digit. ('a' <= ch && ch <= 'z') || // alpha. ('A' <= ch && ch <= 'Z') || // ALPHA. (AllowedMarks.IndexOf(ch) >= 0)) // Marks. { // Valid. } else { throw new ArgumentException(string.Format(System.Globalization.CultureInfo.InvariantCulture, SR.net_http_headers_invalid_value, boundary), nameof(boundary)); } } }
private static void ValidateBoundary(string boundary) { // NameValueHeaderValue is too restrictive for boundary. // Instead validate it ourselves and then quote it. Argument.AssertNotNullOrWhiteSpace(boundary, nameof(boundary)); // cspell:disable // RFC 2046 Section 5.1.1 // boundary := 0*69<bchars> bcharsnospace // bchars := bcharsnospace / " " // bcharsnospace := DIGIT / ALPHA / "'" / "(" / ")" / "+" / "_" / "," / "-" / "." / "/" / ":" / "=" / "?" // cspell:enable if (boundary.Length > 70) { throw new ArgumentOutOfRangeException(nameof(boundary), boundary, $"The field cannot be longer than {70} characters."); } // Cannot end with space. if (boundary.EndsWith(" ", StringComparison.InvariantCultureIgnoreCase)) { throw new ArgumentException($"The format of value '{boundary}' is invalid.", nameof(boundary)); } const string AllowedMarks = @"'()+_,-./:=? "; foreach (char ch in boundary) { if (('0' <= ch && ch <= '9') || // Digit. ('a' <= ch && ch <= 'z') || // alpha. ('A' <= ch && ch <= 'Z') || // ALPHA. AllowedMarks.Contains(char.ToString(ch))) // Marks. { // Valid. } else { throw new ArgumentException($"The format of value '{boundary}' is invalid.", nameof(boundary)); } } }