/// <summary> /// Parse a header /// </summary> /// <param name="name">Name of header.</param> /// <param name="reader">Reader containing value.</param> /// <returns>HTTP Header</returns> /// <exception cref="FormatException">Header value is not of the expected format.</exception> public IHeader Parse(string name, ITextReader reader) { string typeStr = reader.ReadToEnd(",;"); if (reader.Current == ',') // to get rid of the TE header. { reader.ReadToEnd(';'); } ConnectionType type; try { type = (ConnectionType)Enum.Parse(typeof(ConnectionType), typeStr.Replace("-", string.Empty), true); } catch (ArgumentException err) { throw new FormatException("Unknown connection type '" + typeStr + "'.", err); } // got parameters if (reader.Current == ';') { HeaderParameterCollection parameters = HeaderParameterCollection.Parse(reader); return(new ConnectionHeader(type, parameters)); } return(new ConnectionHeader(type)); }
/// <summary> /// An authentication response have been received from the web browser. /// Check if it's correct /// </summary> /// <param name="header">Contents from the Authorization header</param> /// <param name="realm">Realm that should be authenticated</param> /// <param name="httpVerb">GET/POST/PUT/DELETE etc.</param> /// <param name="options">First option: true if username/password is correct but not cnonce</param> /// <returns> /// Authentication object that is stored for the request. A user class or something like that. /// </returns> /// <exception cref="ArgumentException">if authenticationHeader is invalid</exception> /// <exception cref="ArgumentNullException">If any of the parameters is empty or null.</exception> public bool Authenticate(AuthorizationHeader header, string realm, string httpVerb, object[] options) { if (header == null) { throw new ArgumentNullException("header"); } lock (_nonces) { if (_timer == null) { _timer = new Timer(ManageNonces, null, 15000, 15000); } } if (!header.Scheme.Equals("digest", StringComparison.OrdinalIgnoreCase)) { return(false); } var parameters = HeaderParameterCollection.Parse(new StringReader(header.Data)); if (!IsValidNonce(parameters["nonce"]) && !DisableNonceCheck) { return(false); } // request authentication information string username = parameters["username"]; DigestContext context = new DigestContext(realm, username); if (!_authenticator(context)) { return(false); } // Encode authentication info string HA1; if (string.IsNullOrEmpty(context.HA1)) { string A1 = String.Format("{0}:{1}:{2}", username, realm, context.Password); HA1 = GetMD5HashBinHex2(A1); } else { HA1 = context.HA1; } // encode challenge info string A2 = String.Format("{0}:{1}", httpVerb, parameters["uri"]); string HA2 = GetMD5HashBinHex2(A2); string hashedDigest = Encrypt(HA1, HA2, parameters["qop"], parameters["nonce"], parameters["nc"], parameters["cnonce"]); //validate return(parameters["response"] == hashedDigest); }
public void it_should_add_parameter() { var parameters = new HeaderParameterCollection(); parameters.Add("test"); parameters["test"].Should().NotBeNull(); }
public void it_should_set_parameter_by_name() { var parameters = new HeaderParameterCollection(); parameters["some"] = new HeaderParameter("some", "test"); parameters["some"].Should().NotBeNull(); parameters["some"].Value.Should().Be("test"); }
public void it_should_override_old_parameter_when_setting_by_name() { var parameters = new HeaderParameterCollection(); parameters["some"] = new HeaderParameter("some", "test"); parameters["some"] = new HeaderParameter("some", "other"); parameters["some"].Value.Should().Be("other"); }
public void it_should_remove_parameter() { var parameters = new HeaderParameterCollection(); parameters.Add("test", 1); parameters.Remove(new HeaderParameter("test", 1)); parameters["test"].Should().BeNull(); }
public HeaderValue(string value, HeaderParameterCollection parameters) { if (value == null) { throw new ArgumentNullException("value"); } Value = value; Parameters = parameters ?? new HeaderParameterCollection(); }
/// <summary> /// An authentication response have been received from the web browser. /// Check if it's correct /// </summary> /// <param name="header">Contents from the Authorization header</param> /// <param name="realm">Realm that should be authenticated</param> /// <param name="httpVerb">GET/POST/PUT/DELETE etc.</param> /// <returns> /// Authentication object that is stored for the request. A user class or something like that. /// </returns> /// <exception cref="ArgumentException">if authenticationHeader is invalid</exception> /// <exception cref="ArgumentNullException">If any of the parameters is empty or null.</exception> public IAuthenticationUser Authenticate(AuthorizationHeader header, string realm, string httpVerb) { if (header == null) { throw new ArgumentNullException("header"); } lock (_nonces) { if (_timer == null) { _timer = new Timer(ManageNonces, null, 15000, 15000); } } if (!header.Scheme.Equals("digest", StringComparison.OrdinalIgnoreCase)) { return(null); } var parameters = HeaderParameterCollection.Parse(new StringReader(header.Data), ','); if (!IsValidNonce(parameters["nonce"]) && !DisableNonceCheck) { return(null); } // request authentication information string username = parameters["username"]; var user = _userProvider.Lookup(username, realm); if (user == null) { return(null); } // Encode authentication info string HA1 = string.IsNullOrEmpty(user.HA1) ? GetHA1(realm, username, user.Password) : user.HA1; // encode challenge info string A2 = String.Format("{0}:{1}", httpVerb, parameters["uri"]); string HA2 = GetMD5HashBinHex2(A2); string hashedDigest = Encrypt(HA1, HA2, parameters["qop"], parameters["nonce"], parameters["nc"], parameters["cnonce"]); //validate if (parameters["response"] == hashedDigest) { return(user); } return(null); }
public HeaderValue(string value, params HeaderParameter[] parameters) { if (value == null) { throw new ArgumentNullException("value"); } Value = value; Parameters = new HeaderParameterCollection(); parameters.ForEach(parameter => Parameters.Add(parameter)); }
/// <summary> /// Parse a header /// </summary> /// <param name="name">Name of header.</param> /// <param name="reader">Reader containing value.</param> /// <returns>HTTP Header</returns> /// <exception cref="FormatException">Header value is not of the expected format.</exception> public IHeader Parse(string name, ITextReader reader) { string contentType = reader.ReadToEnd(';'); // got parameters if (reader.Current == ';') { HeaderParameterCollection parameters = HeaderParameterCollection.Parse(reader); return(new ContentTypeHeader(contentType, parameters)); } return(new ContentTypeHeader(contentType)); }
/// <summary>Initializes a new instance of the <see cref="AsMediaTypeAttribute" /> class.</summary> /// <param name="mediaType">Target media type.</param> /// <param name="parameters">Optional parameters of the media type.</param> public AsMediaTypeAttribute(string mediaType, params string[] parameters) { if (mediaType == null) { throw new ArgumentNullException("mediaType"); } if (mediaType.Length == 0) { throw new ArgumentOutOfRangeException("mediaType"); } MediaType = mediaType; var headerParameters = new HeaderParameterCollection(); parameters.ForEach(parameter => headerParameters.Add(HeaderParameter.Parse(parameter))); Parameters = headerParameters; }
/// <summary> /// Initializes a new instance of the <see cref="ContentTypeHeader"/> class. /// </summary> /// <param name="contentType">Type of the content.</param> /// <param name="parameterCollection">Value parameters.</param> public ContentTypeHeader(string contentType, HeaderParameterCollection parameterCollection) { Value = contentType; _parameters = parameterCollection; }
private static HeaderValue CreateInstance(string header, string value, HeaderParameterCollection parameters) { switch (header) { case Header.ContentLength: return new HeaderValue<int>((value.Length > 0 ? Int32.Parse(value) : 0), parameters); default: return new HeaderValue(value, parameters); } }
private static void ParseSeparatorChar(char chr, ref StringBuilder currentTarget, ref bool isInString, ref bool isEscape, StringBuilder currentValue, StringBuilder currentParameter, HeaderParameterCollection parameters) { if (isEscape) { isEscape = false; currentTarget.Append("\\" + chr); } else if (isInString) { currentTarget.Append(chr); } else { if (currentTarget == currentValue) { currentTarget = currentParameter; } else { parameters.Add(HeaderParameter.Parse(currentParameter.ToString().Trim())); currentParameter.Clear(); } } }
/// <summary> /// Initializes a new instance of the <see cref="ConnectionHeader"/> class. /// </summary> /// <param name="type">Connection type.</param> /// <param name="parameters">The parameters.</param> public ConnectionHeader(ConnectionType type, HeaderParameterCollection parameters) { Parameters = parameters; Type = type; }
/// <summary> /// Initializes a new instance of the <see cref="ConnectionHeader"/> class. /// </summary> /// <param name="type">The type.</param> public ConnectionHeader(ConnectionType type) { Type = type; Parameters = new HeaderParameterCollection(); }
/// <summary> /// Initializes a new instance of the <see cref="ContentTypeHeader"/> class. /// </summary> /// <param name="contentType">Type of the content.</param> public ContentTypeHeader(string contentType) { Value = contentType; _parameters = new HeaderParameterCollection(); }
internal static HeaderValue ParseInternal(string header, string value) { if (value == null) { throw new ArgumentNullException("value"); } HeaderParameterCollection parameters = new HeaderParameterCollection(); StringBuilder currentValue = new StringBuilder(64); StringBuilder currentParameter = new StringBuilder(128); StringBuilder currentTarget = currentValue; bool isInString = false; bool isEscape = false; foreach (char letter in value) { switch (letter) { default: ParseOtherChars(letter, currentTarget, ref isInString, ref isEscape); break; case '\\': ParseEscapeChar(letter, currentTarget, ref isInString, ref isEscape); break; case '"': ParseStringChar(letter, currentTarget, ref isInString, ref isEscape); break; case ';': ParseSeparatorChar(letter, ref currentTarget, ref isInString, ref isEscape, currentValue, currentParameter, parameters); break; } } if (currentParameter.Length > 0) { parameters.Add(HeaderParameter.Parse(currentParameter.ToString().Trim())); } return CreateInstance(header, currentValue.ToString(), parameters); }