/// <summary> /// Reads a token or token=(token|quoted-string) from the <paramref name="lexer"/>, convert it to a key value pair and advances the <paramref name="lexer"/>. /// </summary> /// <param name="lexer">The lexer to read from.</param> /// <returns>The converted key value pair.</returns> private static KeyValuePair<string, string> ReadKeyValuePair(ref HttpHeaderValueLexer lexer) { Debug.Assert(lexer.Type == HttpHeaderValueItemType.Token, "lexer.Type == HttpHeaderValueItemType.Token"); string name = lexer.OriginalText; string value = null; lexer = lexer.ReadNext(); if (lexer.Type == HttpHeaderValueItemType.ValueSeparator) { lexer = lexer.ReadNext(); Debug.Assert( lexer.Type == HttpHeaderValueItemType.Token || lexer.Type == HttpHeaderValueItemType.QuotedString, "lexer.Type == HttpHeaderValueItemType.Token || lexer.Type == HttpHeaderValueItemType.QuotedString"); value = lexer.OriginalText; lexer = lexer.ReadNext(); } Debug.Assert( lexer.Type == HttpHeaderValueItemType.End || lexer.Type == HttpHeaderValueItemType.ElementSeparator || lexer.Type == HttpHeaderValueItemType.ParameterSeparator, "lexer.Type == HttpHeaderValueItemType.End || lexer.Type == HttpHeaderValueItemType.ElementSeparator || lexer.Type == HttpHeaderValueItemType.ParameterSeparator"); return new KeyValuePair<string, string>(name, value); }
/// <summary> /// Parses the current preference values to a dictionary of preference and value pairs. /// </summary> /// <returns>Returns a dictionary of preference and value pairs; null if the preference header has not been set.</returns> private HttpHeaderValue ParsePreferences() { string preferenceHeaderValue = this.message.GetHeader(this.preferenceHeaderName); HttpHeaderValueLexer preferenceHeaderLexer = HttpHeaderValueLexer.Create(this.preferenceHeaderName, preferenceHeaderValue); return preferenceHeaderLexer.ToHttpHeaderValue(); }
/// <summary> /// Reads a <see cref="HttpHeaderValueElement"/> from <paramref name="lexer"/> and advances the <paramref name="lexer"/> forward. /// </summary> /// <param name="lexer">The lexer to read from.</param> /// <returns>The <see cref="HttpHeaderValueElement"/> that was read.</returns> private static HttpHeaderValueElement ReadHttpHeaderValueElement(ref HttpHeaderValueLexer lexer) { Debug.Assert(lexer.Type == HttpHeaderValueItemType.Token, "lexer.Type == HttpHeaderValueItemType.Token"); List<KeyValuePair<string, string>> keyValuePairs = new List<KeyValuePair<string, string>> { ReadKeyValuePair(ref lexer) }; while (lexer.Type == HttpHeaderValueItemType.ParameterSeparator) { lexer = lexer.ReadNext(); keyValuePairs.Add(ReadKeyValuePair(ref lexer)); } Debug.Assert( lexer.Type == HttpHeaderValueItemType.ElementSeparator || lexer.Type == HttpHeaderValueItemType.End, "lexer.Type == HttpHeaderValueItemType.ElementSeparator || lexer.Type == HttpHeaderValueItemType.End"); return new HttpHeaderValueElement(keyValuePairs[0].Key, keyValuePairs[0].Value, keyValuePairs.Skip(1).ToArray()); }