private List<KeyValuePair> ParseQuotedHeader(string str)
        {
            List<KeyValuePair> result = new List<KeyValuePair>();

            if (str != null)
            {

                int idx = 0;

                // Read Type (Basic|Digest)
                string type = str.Read(ref idx, (ch) => !char.IsWhiteSpace(ch) && !char.IsControl(ch)).TrimAndLower();
                result.Add(new KeyValuePair(type));

                // process the rest of the text
                while (idx < str.Length)
                {
                    // Read key
                    string key = str.Read(ref idx, '=').TrimAndLower();
                    KeyValuePair qp = new KeyValuePair(key);

                    // Skip any white space
                    str.SkipWhiteSpace(ref idx);

                    qp.Value = str.ReadQuotedText(ref idx);

                    result.Add(qp);
                }
            }
            return result;
        }
 public bool TryGet(string value, out KeyValuePair @param)
 {
     @param = null;
     for (int i = 0; i < Values.Count; ++i)
         if (string.CompareOrdinal(Values[i].Key, value) == 0)
         {
             @param = Values[i];
             return true;
         }
     return false;
 }
        //deflate, gzip, x-gzip, identity, *;q=0
        internal static List<KeyValuePair> ParseQualityParams(this string str)
        {
            List<KeyValuePair> result = new List<KeyValuePair>();

            if (str == null)
                return result;

            int idx = 0;
            while (idx < str.Length)
            {
                string key = str.Read(ref idx, (ch) => ch != ',' && ch != ';').TrimAndLower();

                KeyValuePair qp = new KeyValuePair(key);

                if (str[idx - 1] == ';')
                {
                    str.Read(ref idx, '=', false);
                    qp.Value = str.Read(ref idx, ',');
                }

                result.Add(qp);
            }

            return result;
        }
        //public, max-age=2592000
        internal static List<KeyValuePair> ParseOptionalHeader(this string str)
        {
            List<KeyValuePair> result = new List<KeyValuePair>();

            if (str == null)
                return result;

            int idx = 0;

            // process the rest of the text
            while (idx < str.Length)
            {
                // Read key
                string key = str.Read(ref idx, (ch) => ch != '=' && ch != ',').TrimAndLower();
                KeyValuePair qp = new KeyValuePair(key);

                if (str[idx - 1] == '=')
                    qp.Value = str.ReadQuotedText(ref idx);

                result.Add(qp);
            }

            return result;
        }