using System; using System.Collections.Generic; using System.Linq; using MediaBrowser.Model.Dto; namespace MediaBrowser.Model.Services { // Remove this garbage class, it's just a bastard copy of NameValueCollection public class QueryParamCollection : List { public QueryParamCollection() { } private static StringComparison GetStringComparison() { return StringComparison.OrdinalIgnoreCase; } private static StringComparer GetStringComparer() { return StringComparer.OrdinalIgnoreCase; } /// /// Adds a new query parameter. /// public void Add(string key, string value) { Add(new NameValuePair(key, value)); } private void Set(string key, string value) { if (string.IsNullOrEmpty(value)) { var parameters = GetItems(key); foreach (var p in parameters) { Remove(p); } return; } foreach (var pair in this) { var stringComparison = GetStringComparison(); if (string.Equals(key, pair.Name, stringComparison)) { pair.Value = value; return; } } Add(key, value); } private string Get(string name) { var stringComparison = GetStringComparison(); foreach (var pair in this) { if (string.Equals(pair.Name, name, stringComparison)) { return pair.Value; } } return null; } private List GetItems(string name) { var stringComparison = GetStringComparison(); var list = new List(); foreach (var pair in this) { if (string.Equals(pair.Name, name, stringComparison)) { list.Add(pair); } } return list; } public virtual List GetValues(string name) { var stringComparison = GetStringComparison(); var list = new List(); foreach (var pair in this) { if (string.Equals(pair.Name, name, stringComparison)) { list.Add(pair.Value); } } return list; } public IEnumerable Keys { get { var keys = new string[this.Count]; for (var i = 0; i < keys.Length; i++) { keys[i] = this[i].Name; } return keys; } } /// /// Gets or sets a query parameter value by name. A query may contain multiple values of the same name /// (i.e. "x=1&x=2"), in which case the value is an array, which works for both getting and setting. /// /// The query parameter name /// The query parameter value or array of values public string this[string name] { get => Get(name); set => Set(name, value); } private string GetQueryStringValue(NameValuePair pair) { return pair.Name + "=" + pair.Value; } public override string ToString() { var vals = this.Select(GetQueryStringValue).ToArray(); return string.Join("&", vals); } } }