#region License /* * WebHeaderCollection.cs * * This code is derived from WebHeaderCollection.cs (System.Net) of Mono * (http://www.mono-project.com). * * The MIT License * * Copyright (c) 2003 Ximian, Inc. (http://www.ximian.com) * Copyright (c) 2007 Novell, Inc. (http://www.novell.com) * Copyright (c) 2012-2020 sta.blockhead * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ #endregion #region Authors /* * Authors: * - Lawrence Pit * - Gonzalo Paniagua Javier * - Miguel de Icaza */ #endregion using System; using System.Collections; using System.Collections.Generic; using System.Collections.Specialized; using System.Runtime.InteropServices; using System.Runtime.Serialization; using System.Security.Permissions; using System.Text; namespace WebSocketSharp.Net { /// /// Provides a collection of the HTTP headers associated with a request or /// response. /// [Serializable] [ComVisible (true)] public class WebHeaderCollection : NameValueCollection, ISerializable { #region Private Fields private static readonly Dictionary _headers; private bool _internallyUsed; private HttpHeaderType _state; #endregion #region Static Constructor static WebHeaderCollection () { _headers = new Dictionary ( StringComparer.InvariantCultureIgnoreCase ) { { "Accept", new HttpHeaderInfo ( "Accept", HttpHeaderType.Request | HttpHeaderType.Restricted | HttpHeaderType.MultiValue ) }, { "AcceptCharset", new HttpHeaderInfo ( "Accept-Charset", HttpHeaderType.Request | HttpHeaderType.MultiValue ) }, { "AcceptEncoding", new HttpHeaderInfo ( "Accept-Encoding", HttpHeaderType.Request | HttpHeaderType.MultiValue ) }, { "AcceptLanguage", new HttpHeaderInfo ( "Accept-Language", HttpHeaderType.Request | HttpHeaderType.MultiValue ) }, { "AcceptRanges", new HttpHeaderInfo ( "Accept-Ranges", HttpHeaderType.Response | HttpHeaderType.MultiValue ) }, { "Age", new HttpHeaderInfo ( "Age", HttpHeaderType.Response ) }, { "Allow", new HttpHeaderInfo ( "Allow", HttpHeaderType.Request | HttpHeaderType.Response | HttpHeaderType.MultiValue ) }, { "Authorization", new HttpHeaderInfo ( "Authorization", HttpHeaderType.Request | HttpHeaderType.MultiValue ) }, { "CacheControl", new HttpHeaderInfo ( "Cache-Control", HttpHeaderType.Request | HttpHeaderType.Response | HttpHeaderType.MultiValue ) }, { "Connection", new HttpHeaderInfo ( "Connection", HttpHeaderType.Request | HttpHeaderType.Response | HttpHeaderType.Restricted | HttpHeaderType.MultiValue ) }, { "ContentEncoding", new HttpHeaderInfo ( "Content-Encoding", HttpHeaderType.Request | HttpHeaderType.Response | HttpHeaderType.MultiValue ) }, { "ContentLanguage", new HttpHeaderInfo ( "Content-Language", HttpHeaderType.Request | HttpHeaderType.Response | HttpHeaderType.MultiValue ) }, { "ContentLength", new HttpHeaderInfo ( "Content-Length", HttpHeaderType.Request | HttpHeaderType.Response | HttpHeaderType.Restricted ) }, { "ContentLocation", new HttpHeaderInfo ( "Content-Location", HttpHeaderType.Request | HttpHeaderType.Response ) }, { "ContentMd5", new HttpHeaderInfo ( "Content-MD5", HttpHeaderType.Request | HttpHeaderType.Response ) }, { "ContentRange", new HttpHeaderInfo ( "Content-Range", HttpHeaderType.Request | HttpHeaderType.Response ) }, { "ContentType", new HttpHeaderInfo ( "Content-Type", HttpHeaderType.Request | HttpHeaderType.Response | HttpHeaderType.Restricted ) }, { "Cookie", new HttpHeaderInfo ( "Cookie", HttpHeaderType.Request ) }, { "Cookie2", new HttpHeaderInfo ( "Cookie2", HttpHeaderType.Request ) }, { "Date", new HttpHeaderInfo ( "Date", HttpHeaderType.Request | HttpHeaderType.Response | HttpHeaderType.Restricted ) }, { "Expect", new HttpHeaderInfo ( "Expect", HttpHeaderType.Request | HttpHeaderType.Restricted | HttpHeaderType.MultiValue ) }, { "Expires", new HttpHeaderInfo ( "Expires", HttpHeaderType.Request | HttpHeaderType.Response ) }, { "ETag", new HttpHeaderInfo ( "ETag", HttpHeaderType.Response ) }, { "From", new HttpHeaderInfo ( "From", HttpHeaderType.Request ) }, { "Host", new HttpHeaderInfo ( "Host", HttpHeaderType.Request | HttpHeaderType.Restricted ) }, { "IfMatch", new HttpHeaderInfo ( "If-Match", HttpHeaderType.Request | HttpHeaderType.MultiValue ) }, { "IfModifiedSince", new HttpHeaderInfo ( "If-Modified-Since", HttpHeaderType.Request | HttpHeaderType.Restricted ) }, { "IfNoneMatch", new HttpHeaderInfo ( "If-None-Match", HttpHeaderType.Request | HttpHeaderType.MultiValue ) }, { "IfRange", new HttpHeaderInfo ( "If-Range", HttpHeaderType.Request ) }, { "IfUnmodifiedSince", new HttpHeaderInfo ( "If-Unmodified-Since", HttpHeaderType.Request ) }, { "KeepAlive", new HttpHeaderInfo ( "Keep-Alive", HttpHeaderType.Request | HttpHeaderType.Response | HttpHeaderType.MultiValue ) }, { "LastModified", new HttpHeaderInfo ( "Last-Modified", HttpHeaderType.Request | HttpHeaderType.Response ) }, { "Location", new HttpHeaderInfo ( "Location", HttpHeaderType.Response ) }, { "MaxForwards", new HttpHeaderInfo ( "Max-Forwards", HttpHeaderType.Request ) }, { "Pragma", new HttpHeaderInfo ( "Pragma", HttpHeaderType.Request | HttpHeaderType.Response ) }, { "ProxyAuthenticate", new HttpHeaderInfo ( "Proxy-Authenticate", HttpHeaderType.Response | HttpHeaderType.MultiValue ) }, { "ProxyAuthorization", new HttpHeaderInfo ( "Proxy-Authorization", HttpHeaderType.Request ) }, { "ProxyConnection", new HttpHeaderInfo ( "Proxy-Connection", HttpHeaderType.Request | HttpHeaderType.Response | HttpHeaderType.Restricted ) }, { "Public", new HttpHeaderInfo ( "Public", HttpHeaderType.Response | HttpHeaderType.MultiValue ) }, { "Range", new HttpHeaderInfo ( "Range", HttpHeaderType.Request | HttpHeaderType.Restricted | HttpHeaderType.MultiValue ) }, { "Referer", new HttpHeaderInfo ( "Referer", HttpHeaderType.Request | HttpHeaderType.Restricted ) }, { "RetryAfter", new HttpHeaderInfo ( "Retry-After", HttpHeaderType.Response ) }, { "SecWebSocketAccept", new HttpHeaderInfo ( "Sec-WebSocket-Accept", HttpHeaderType.Response | HttpHeaderType.Restricted ) }, { "SecWebSocketExtensions", new HttpHeaderInfo ( "Sec-WebSocket-Extensions", HttpHeaderType.Request | HttpHeaderType.Response | HttpHeaderType.Restricted | HttpHeaderType.MultiValueInRequest ) }, { "SecWebSocketKey", new HttpHeaderInfo ( "Sec-WebSocket-Key", HttpHeaderType.Request | HttpHeaderType.Restricted ) }, { "SecWebSocketProtocol", new HttpHeaderInfo ( "Sec-WebSocket-Protocol", HttpHeaderType.Request | HttpHeaderType.Response | HttpHeaderType.MultiValueInRequest ) }, { "SecWebSocketVersion", new HttpHeaderInfo ( "Sec-WebSocket-Version", HttpHeaderType.Request | HttpHeaderType.Response | HttpHeaderType.Restricted | HttpHeaderType.MultiValueInResponse ) }, { "Server", new HttpHeaderInfo ( "Server", HttpHeaderType.Response ) }, { "SetCookie", new HttpHeaderInfo ( "Set-Cookie", HttpHeaderType.Response | HttpHeaderType.MultiValue ) }, { "SetCookie2", new HttpHeaderInfo ( "Set-Cookie2", HttpHeaderType.Response | HttpHeaderType.MultiValue ) }, { "Te", new HttpHeaderInfo ( "TE", HttpHeaderType.Request ) }, { "Trailer", new HttpHeaderInfo ( "Trailer", HttpHeaderType.Request | HttpHeaderType.Response ) }, { "TransferEncoding", new HttpHeaderInfo ( "Transfer-Encoding", HttpHeaderType.Request | HttpHeaderType.Response | HttpHeaderType.Restricted | HttpHeaderType.MultiValue ) }, { "Translate", new HttpHeaderInfo ( "Translate", HttpHeaderType.Request ) }, { "Upgrade", new HttpHeaderInfo ( "Upgrade", HttpHeaderType.Request | HttpHeaderType.Response | HttpHeaderType.MultiValue ) }, { "UserAgent", new HttpHeaderInfo ( "User-Agent", HttpHeaderType.Request | HttpHeaderType.Restricted ) }, { "Vary", new HttpHeaderInfo ( "Vary", HttpHeaderType.Response | HttpHeaderType.MultiValue ) }, { "Via", new HttpHeaderInfo ( "Via", HttpHeaderType.Request | HttpHeaderType.Response | HttpHeaderType.MultiValue ) }, { "Warning", new HttpHeaderInfo ( "Warning", HttpHeaderType.Request | HttpHeaderType.Response | HttpHeaderType.MultiValue ) }, { "WwwAuthenticate", new HttpHeaderInfo ( "WWW-Authenticate", HttpHeaderType.Response | HttpHeaderType.Restricted | HttpHeaderType.MultiValue ) } }; } #endregion #region Internal Constructors internal WebHeaderCollection (HttpHeaderType state, bool internallyUsed) { _state = state; _internallyUsed = internallyUsed; } #endregion #region Protected Constructors /// /// Initializes a new instance of the class /// from the specified instances of the and /// classes. /// /// /// A that contains the serialized /// object data. /// /// /// A that specifies the source for /// the deserialization. /// /// /// is . /// /// /// An element with the specified name is not found in /// . /// protected WebHeaderCollection ( SerializationInfo serializationInfo, StreamingContext streamingContext ) { if (serializationInfo == null) throw new ArgumentNullException ("serializationInfo"); try { _internallyUsed = serializationInfo.GetBoolean ("InternallyUsed"); _state = (HttpHeaderType) serializationInfo.GetInt32 ("State"); var cnt = serializationInfo.GetInt32 ("Count"); for (var i = 0; i < cnt; i++) { base.Add ( serializationInfo.GetString (i.ToString ()), serializationInfo.GetString ((cnt + i).ToString ()) ); } } catch (SerializationException ex) { throw new ArgumentException (ex.Message, "serializationInfo", ex); } } #endregion #region Public Constructors /// /// Initializes a new instance of the /// class. /// public WebHeaderCollection () { } #endregion #region Internal Properties internal HttpHeaderType State { get { return _state; } } #endregion #region Public Properties /// /// Gets all header names in the collection. /// /// /// An array of that contains all header names in /// the collection. /// public override string[] AllKeys { get { return base.AllKeys; } } /// /// Gets the number of headers in the collection. /// /// /// An that represents the number of headers in /// the collection. /// public override int Count { get { return base.Count; } } /// /// Gets or sets the specified request header. /// /// /// A that represents the value of the request header. /// /// /// /// One of the enum values. /// /// /// It specifies the request header to get or set. /// /// /// /// /// is a restricted header. /// /// /// -or- /// /// /// contains an invalid character. /// /// /// /// The length of is greater than 65,535 /// characters. /// /// /// This instance does not allow the request header. /// public string this[HttpRequestHeader header] { get { var key = header.ToString (); var name = getHeaderName (key); return Get (name); } set { Add (header, value); } } /// /// Gets or sets the specified response header. /// /// /// A that represents the value of the response header. /// /// /// /// One of the enum values. /// /// /// It specifies the response header to get or set. /// /// /// /// /// is a restricted header. /// /// /// -or- /// /// /// contains an invalid character. /// /// /// /// The length of is greater than 65,535 /// characters. /// /// /// This instance does not allow the response header. /// public string this[HttpResponseHeader header] { get { var key = header.ToString (); var name = getHeaderName (key); return Get (name); } set { Add (header, value); } } /// /// Gets a collection of header names in the collection. /// /// /// A that contains /// all header names in the collection. /// public override NameObjectCollectionBase.KeysCollection Keys { get { return base.Keys; } } #endregion #region Private Methods private void add (string name, string value, HttpHeaderType headerType) { base.Add (name, value); if (_state != HttpHeaderType.Unspecified) return; if (headerType == HttpHeaderType.Unspecified) return; _state = headerType; } private void checkAllowed (HttpHeaderType headerType) { if (_state == HttpHeaderType.Unspecified) return; if (headerType == HttpHeaderType.Unspecified) return; if (headerType != _state) { var msg = "This instance does not allow the header."; throw new InvalidOperationException (msg); } } private static string checkName (string name, string paramName) { if (name == null) { var msg = "The name is null."; throw new ArgumentNullException (paramName, msg); } if (name.Length == 0) { var msg = "The name is an empty string."; throw new ArgumentException (msg, paramName); } name = name.Trim (); if (name.Length == 0) { var msg = "The name is a string of spaces."; throw new ArgumentException (msg, paramName); } if (!name.IsToken ()) { var msg = "The name contains an invalid character."; throw new ArgumentException (msg, paramName); } return name; } private void checkRestricted (string name, HttpHeaderType headerType) { if (_internallyUsed) return; var res = headerType == HttpHeaderType.Response; if (isRestricted (name, res)) { var msg = "The header is a restricted header."; throw new ArgumentException (msg); } } private static string checkValue (string value, string paramName) { if (value == null) return String.Empty; value = value.Trim (); var len = value.Length; if (len == 0) return value; if (len > 65535) { var msg = "The length of the value is greater than 65,535 characters."; throw new ArgumentOutOfRangeException (paramName, msg); } if (!value.IsText ()) { var msg = "The value contains an invalid character."; throw new ArgumentException (msg, paramName); } return value; } private static HttpHeaderInfo getHeaderInfo (string name) { var comparison = StringComparison.InvariantCultureIgnoreCase; foreach (var headerInfo in _headers.Values) { if (headerInfo.HeaderName.Equals (name, comparison)) return headerInfo; } return null; } private static string getHeaderName (string key) { HttpHeaderInfo headerInfo; return _headers.TryGetValue (key, out headerInfo) ? headerInfo.HeaderName : null; } private static HttpHeaderType getHeaderType (string name) { var headerInfo = getHeaderInfo (name); if (headerInfo == null) return HttpHeaderType.Unspecified; if (headerInfo.IsRequest) { return !headerInfo.IsResponse ? HttpHeaderType.Request : HttpHeaderType.Unspecified; } return headerInfo.IsResponse ? HttpHeaderType.Response : HttpHeaderType.Unspecified; } private static bool isMultiValue (string name, bool response) { var headerInfo = getHeaderInfo (name); return headerInfo != null && headerInfo.IsMultiValue (response); } private static bool isRestricted (string name, bool response) { var headerInfo = getHeaderInfo (name); return headerInfo != null && headerInfo.IsRestricted (response); } private void set (string name, string value, HttpHeaderType headerType) { base.Set (name, value); if (_state != HttpHeaderType.Unspecified) return; if (headerType == HttpHeaderType.Unspecified) return; _state = headerType; } #endregion #region Internal Methods internal void InternalRemove (string name) { base.Remove (name); } internal void InternalSet (string header, bool response) { var idx = header.IndexOf (':'); if (idx == -1) { var msg = "It does not contain a colon character."; throw new ArgumentException (msg, "header"); } var name = header.Substring (0, idx); var val = idx < header.Length - 1 ? header.Substring (idx + 1) : String.Empty; name = checkName (name, "header"); val = checkValue (val, "header"); if (isMultiValue (name, response)) { base.Add (name, val); return; } base.Set (name, val); } internal void InternalSet (string name, string value, bool response) { value = checkValue (value, "value"); if (isMultiValue (name, response)) { base.Add (name, value); return; } base.Set (name, value); } internal string ToStringMultiValue (bool response) { var cnt = Count; if (cnt == 0) return "\r\n"; var buff = new StringBuilder (); for (var i = 0; i < cnt; i++) { var name = GetKey (i); if (isMultiValue (name, response)) { foreach (var val in GetValues (i)) buff.AppendFormat ("{0}: {1}\r\n", name, val); continue; } buff.AppendFormat ("{0}: {1}\r\n", name, Get (i)); } buff.Append ("\r\n"); return buff.ToString (); } #endregion #region Protected Methods /// /// Adds a header to the collection without checking if the header is on /// the restricted header list. /// /// /// A that specifies the name of the header to add. /// /// /// A that specifies the value of the header to add. /// /// /// is . /// /// /// /// is an empty string. /// /// /// -or- /// /// /// is a string of spaces. /// /// /// -or- /// /// /// contains an invalid character. /// /// /// -or- /// /// /// contains an invalid character. /// /// /// /// The length of is greater than 65,535 /// characters. /// /// /// This instance does not allow the header. /// protected void AddWithoutValidate (string headerName, string headerValue) { headerName = checkName (headerName, "headerName"); headerValue = checkValue (headerValue, "headerValue"); var headerType = getHeaderType (headerName); checkAllowed (headerType); add (headerName, headerValue, headerType); } #endregion #region Public Methods /// /// Adds the specified header to the collection. /// /// /// A that specifies the header to add, /// with the name and value separated by a colon character (':'). /// /// /// is . /// /// /// /// is an empty string. /// /// /// -or- /// /// /// does not contain a colon character. /// /// /// -or- /// /// /// The name part of is an empty string. /// /// /// -or- /// /// /// The name part of is a string of spaces. /// /// /// -or- /// /// /// The name part of contains an invalid /// character. /// /// /// -or- /// /// /// The value part of contains an invalid /// character. /// /// /// -or- /// /// /// is a restricted header. /// /// /// /// The length of the value part of is greater /// than 65,535 characters. /// /// /// This instance does not allow the header. /// public void Add (string header) { if (header == null) throw new ArgumentNullException ("header"); var len = header.Length; if (len == 0) { var msg = "An empty string."; throw new ArgumentException (msg, "header"); } var idx = header.IndexOf (':'); if (idx == -1) { var msg = "It does not contain a colon character."; throw new ArgumentException (msg, "header"); } var name = header.Substring (0, idx); var val = idx < len - 1 ? header.Substring (idx + 1) : String.Empty; name = checkName (name, "header"); val = checkValue (val, "header"); var headerType = getHeaderType (name); checkRestricted (name, headerType); checkAllowed (headerType); add (name, val, headerType); } /// /// Adds the specified request header with the specified value to /// the collection. /// /// /// /// One of the enum values. /// /// /// It specifies the request header to add. /// /// /// /// A that specifies the value of the header to add. /// /// /// /// contains an invalid character. /// /// /// -or- /// /// /// is a restricted header. /// /// /// /// The length of is greater than 65,535 /// characters. /// /// /// This instance does not allow the request header. /// public void Add (HttpRequestHeader header, string value) { value = checkValue (value, "value"); var key = header.ToString (); var name = getHeaderName (key); checkRestricted (name, HttpHeaderType.Request); checkAllowed (HttpHeaderType.Request); add (name, value, HttpHeaderType.Request); } /// /// Adds the specified response header with the specified value to /// the collection. /// /// /// /// One of the enum values. /// /// /// It specifies the response header to add. /// /// /// /// A that specifies the value of the header to add. /// /// /// /// contains an invalid character. /// /// /// -or- /// /// /// is a restricted header. /// /// /// /// The length of is greater than 65,535 /// characters. /// /// /// This instance does not allow the response header. /// public void Add (HttpResponseHeader header, string value) { value = checkValue (value, "value"); var key = header.ToString (); var name = getHeaderName (key); checkRestricted (name, HttpHeaderType.Response); checkAllowed (HttpHeaderType.Response); add (name, value, HttpHeaderType.Response); } /// /// Adds a header with the specified name and value to the collection. /// /// /// A that specifies the name of the header to add. /// /// /// A that specifies the value of the header to add. /// /// /// is . /// /// /// /// is an empty string. /// /// /// -or- /// /// /// is a string of spaces. /// /// /// -or- /// /// /// contains an invalid character. /// /// /// -or- /// /// /// contains an invalid character. /// /// /// -or- /// /// /// is a restricted header name. /// /// /// /// The length of is greater than 65,535 /// characters. /// /// /// This instance does not allow the header. /// public override void Add (string name, string value) { name = checkName (name, "name"); value = checkValue (value, "value"); var headerType = getHeaderType (name); checkRestricted (name, headerType); checkAllowed (headerType); add (name, value, headerType); } /// /// Removes all headers from the collection. /// public override void Clear () { base.Clear (); _state = HttpHeaderType.Unspecified; } /// /// Get the value of the header at the specified index in the collection. /// /// /// A that receives the value of the header. /// /// /// An that specifies the zero-based index of the header /// to find. /// /// /// is out of allowable range of indexes for /// the collection. /// public override string Get (int index) { return base.Get (index); } /// /// Get the value of the header with the specified name in the collection. /// /// /// /// A that receives the value of the header. /// /// /// if not found. /// /// /// /// A that specifies the name of the header to find. /// public override string Get (string name) { return base.Get (name); } /// /// Gets the enumerator used to iterate through the collection. /// /// /// An instance used to iterate through /// the collection. /// public override IEnumerator GetEnumerator () { return base.GetEnumerator (); } /// /// Get the name of the header at the specified index in the collection. /// /// /// A that receives the name of the header. /// /// /// An that specifies the zero-based index of the header /// to find. /// /// /// is out of allowable range of indexes for /// the collection. /// public override string GetKey (int index) { return base.GetKey (index); } /// /// Get the values of the header at the specified index in the collection. /// /// /// /// An array of that receives the values of /// the header. /// /// /// if not present. /// /// /// /// An that specifies the zero-based index of the header /// to find. /// /// /// is out of allowable range of indexes for /// the collection. /// public override string[] GetValues (int index) { var vals = base.GetValues (index); return vals != null && vals.Length > 0 ? vals : null; } /// /// Get the values of the header with the specified name in the collection. /// /// /// /// An array of that receives the values of /// the header. /// /// /// if not present. /// /// /// /// A that specifies the name of the header to find. /// public override string[] GetValues (string name) { var vals = base.GetValues (name); return vals != null && vals.Length > 0 ? vals : null; } /// /// Populates a instance with the data /// needed to serialize this instance. /// /// /// A to populate with the data. /// /// /// A that specifies the destination for /// the serialization. /// /// /// is . /// [ SecurityPermission ( SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.SerializationFormatter ) ] public override void GetObjectData ( SerializationInfo serializationInfo, StreamingContext streamingContext ) { if (serializationInfo == null) throw new ArgumentNullException ("serializationInfo"); serializationInfo.AddValue ("InternallyUsed", _internallyUsed); serializationInfo.AddValue ("State", (int) _state); var cnt = Count; serializationInfo.AddValue ("Count", cnt); for (var i = 0; i < cnt; i++) { serializationInfo.AddValue (i.ToString (), GetKey (i)); serializationInfo.AddValue ((cnt + i).ToString (), Get (i)); } } /// /// Determines whether the specified HTTP header can be set for the request. /// /// /// true if the header cannot be set; otherwise, false. /// /// /// A that specifies the name of the header to test. /// /// /// is . /// /// /// /// is an empty string. /// /// /// -or- /// /// /// is a string of spaces. /// /// /// -or- /// /// /// contains an invalid character. /// /// public static bool IsRestricted (string headerName) { return IsRestricted (headerName, false); } /// /// Determines whether the specified HTTP header can be set for the request /// or the response. /// /// /// true if the header cannot be set; otherwise, false. /// /// /// A that specifies the name of the header to test. /// /// /// A : true if the test is for the response; /// otherwise, false. /// /// /// is . /// /// /// /// is an empty string. /// /// /// -or- /// /// /// is a string of spaces. /// /// /// -or- /// /// /// contains an invalid character. /// /// public static bool IsRestricted (string headerName, bool response) { headerName = checkName (headerName, "headerName"); return isRestricted (headerName, response); } /// /// Implements the interface and raises /// the deserialization event when the deserialization is complete. /// /// /// An instance that represents the source of /// the deserialization event. /// public override void OnDeserialization (object sender) { } /// /// Removes the specified request header from the collection. /// /// /// /// One of the enum values. /// /// /// It specifies the request header to remove. /// /// /// /// is a restricted header. /// /// /// This instance does not allow the request header. /// public void Remove (HttpRequestHeader header) { var key = header.ToString (); var name = getHeaderName (key); checkRestricted (name, HttpHeaderType.Request); checkAllowed (HttpHeaderType.Request); base.Remove (name); } /// /// Removes the specified response header from the collection. /// /// /// /// One of the enum values. /// /// /// It specifies the response header to remove. /// /// /// /// is a restricted header. /// /// /// This instance does not allow the response header. /// public void Remove (HttpResponseHeader header) { var key = header.ToString (); var name = getHeaderName (key); checkRestricted (name, HttpHeaderType.Response); checkAllowed (HttpHeaderType.Response); base.Remove (name); } /// /// Removes the specified header from the collection. /// /// /// A that specifies the name of the header to remove. /// /// /// is . /// /// /// /// is an empty string. /// /// /// -or- /// /// /// is a string of spaces. /// /// /// -or- /// /// /// contains an invalid character. /// /// /// -or- /// /// /// is a restricted header name. /// /// /// /// This instance does not allow the header. /// public override void Remove (string name) { name = checkName (name, "name"); var headerType = getHeaderType (name); checkRestricted (name, headerType); checkAllowed (headerType); base.Remove (name); } /// /// Sets the specified request header to the specified value. /// /// /// /// One of the enum values. /// /// /// It specifies the request header to set. /// /// /// /// A that specifies the value of the request header /// to set. /// /// /// /// contains an invalid character. /// /// /// -or- /// /// /// is a restricted header. /// /// /// /// The length of is greater than 65,535 /// characters. /// /// /// This instance does not allow the request header. /// public void Set (HttpRequestHeader header, string value) { value = checkValue (value, "value"); var key = header.ToString (); var name = getHeaderName (key); checkRestricted (name, HttpHeaderType.Request); checkAllowed (HttpHeaderType.Request); set (name, value, HttpHeaderType.Request); } /// /// Sets the specified response header to the specified value. /// /// /// /// One of the enum values. /// /// /// It specifies the response header to set. /// /// /// /// A that specifies the value of the response header /// to set. /// /// /// /// contains an invalid character. /// /// /// -or- /// /// /// is a restricted header. /// /// /// /// The length of is greater than 65,535 /// characters. /// /// /// This instance does not allow the response header. /// public void Set (HttpResponseHeader header, string value) { value = checkValue (value, "value"); var key = header.ToString (); var name = getHeaderName (key); checkRestricted (name, HttpHeaderType.Response); checkAllowed (HttpHeaderType.Response); set (name, value, HttpHeaderType.Response); } /// /// Sets the specified header to the specified value. /// /// /// A that specifies the name of the header to set. /// /// /// A that specifies the value of the header to set. /// /// /// is . /// /// /// /// is an empty string. /// /// /// -or- /// /// /// is a string of spaces. /// /// /// -or- /// /// /// contains an invalid character. /// /// /// -or- /// /// /// contains an invalid character. /// /// /// -or- /// /// /// is a restricted header name. /// /// /// /// The length of is greater than 65,535 /// characters. /// /// /// This instance does not allow the header. /// public override void Set (string name, string value) { name = checkName (name, "name"); value = checkValue (value, "value"); var headerType = getHeaderType (name); checkRestricted (name, headerType); checkAllowed (headerType); set (name, value, headerType); } /// /// Converts the current instance to an array of byte. /// /// /// An array of converted from a string that represents /// the current instance. /// public byte[] ToByteArray () { return Encoding.UTF8.GetBytes (ToString ()); } /// /// Returns a string that represents the current instance. /// /// /// A that represents all headers in the collection. /// public override string ToString () { var cnt = Count; if (cnt == 0) return "\r\n"; var buff = new StringBuilder (); for (var i = 0; i < cnt; i++) buff.AppendFormat ("{0}: {1}\r\n", GetKey (i), Get (i)); buff.Append ("\r\n"); return buff.ToString (); } #endregion #region Explicit Interface Implementations /// /// Populates a instance with the data /// needed to serialize this instance. /// /// /// A to populate with the data. /// /// /// A that specifies the destination for /// the serialization. /// /// /// is . /// [ SecurityPermission ( SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.SerializationFormatter, SerializationFormatter = true ) ] void ISerializable.GetObjectData ( SerializationInfo serializationInfo, StreamingContext streamingContext ) { GetObjectData (serializationInfo, streamingContext); } #endregion } }