QueryParamCollection.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using MediaBrowser.Model.Dto;
  5. namespace MediaBrowser.Model.Services
  6. {
  7. // Remove this garbage class, it's just a bastard copy of NameValueCollection
  8. public class QueryParamCollection : List<NameValuePair>
  9. {
  10. public QueryParamCollection()
  11. {
  12. }
  13. private static StringComparison GetStringComparison()
  14. {
  15. return StringComparison.OrdinalIgnoreCase;
  16. }
  17. private static StringComparer GetStringComparer()
  18. {
  19. return StringComparer.OrdinalIgnoreCase;
  20. }
  21. /// <summary>
  22. /// Adds a new query parameter.
  23. /// </summary>
  24. public virtual void Add(string key, string value)
  25. {
  26. if (string.Equals(key, "content-length", StringComparison.OrdinalIgnoreCase))
  27. {
  28. return;
  29. }
  30. Add(new NameValuePair(key, value));
  31. }
  32. public virtual void Set(string key, string value)
  33. {
  34. if (string.IsNullOrEmpty(value))
  35. {
  36. var parameters = GetItems(key);
  37. foreach (var p in parameters)
  38. {
  39. Remove(p);
  40. }
  41. return;
  42. }
  43. foreach (var pair in this)
  44. {
  45. var stringComparison = GetStringComparison();
  46. if (string.Equals(key, pair.Name, stringComparison))
  47. {
  48. pair.Value = value;
  49. return;
  50. }
  51. }
  52. Add(key, value);
  53. }
  54. public string Get(string name)
  55. {
  56. var stringComparison = GetStringComparison();
  57. foreach (var pair in this)
  58. {
  59. if (string.Equals(pair.Name, name, stringComparison))
  60. {
  61. return pair.Value;
  62. }
  63. }
  64. return null;
  65. }
  66. public virtual List<NameValuePair> GetItems(string name)
  67. {
  68. var stringComparison = GetStringComparison();
  69. var list = new List<NameValuePair>();
  70. foreach (var pair in this)
  71. {
  72. if (string.Equals(pair.Name, name, stringComparison))
  73. {
  74. list.Add(pair);
  75. }
  76. }
  77. return list;
  78. }
  79. public virtual List<string> GetValues(string name)
  80. {
  81. var stringComparison = GetStringComparison();
  82. var list = new List<string>();
  83. foreach (var pair in this)
  84. {
  85. if (string.Equals(pair.Name, name, stringComparison))
  86. {
  87. list.Add(pair.Value);
  88. }
  89. }
  90. return list;
  91. }
  92. public Dictionary<string, string> ToDictionary()
  93. {
  94. var stringComparer = GetStringComparer();
  95. var headers = new Dictionary<string, string>(stringComparer);
  96. foreach (var pair in this)
  97. {
  98. headers[pair.Name] = pair.Value;
  99. }
  100. return headers;
  101. }
  102. public IEnumerable<string> Keys
  103. {
  104. get
  105. {
  106. var keys = new string[this.Count];
  107. for (var i = 0; i < keys.Length; i++)
  108. {
  109. keys[i] = this[i].Name;
  110. }
  111. return keys;
  112. }
  113. }
  114. /// <summary>
  115. /// Gets or sets a query parameter value by name. A query may contain multiple values of the same name
  116. /// (i.e. "x=1&amp;x=2"), in which case the value is an array, which works for both getting and setting.
  117. /// </summary>
  118. /// <param name="name">The query parameter name</param>
  119. /// <returns>The query parameter value or array of values</returns>
  120. public string this[string name]
  121. {
  122. get => Get(name);
  123. set => Set(name, value);
  124. }
  125. private string GetQueryStringValue(NameValuePair pair)
  126. {
  127. return pair.Name + "=" + pair.Value;
  128. }
  129. public override string ToString()
  130. {
  131. var vals = this.Select(GetQueryStringValue).ToArray();
  132. return string.Join("&", vals);
  133. }
  134. }
  135. }