PageRenderTime 42ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 0ms

/WCFWebApi/src/System.Net.Http/System/Net/Http/Headers/HttpGeneralHeaders.cs

#
C# | 243 lines | 216 code | 22 blank | 5 comment | 29 complexity | fbfbe59b1584aa61d4715239cd88fc09 MD5 | raw file
Possible License(s): CC-BY-SA-3.0, Apache-2.0
  1. using System.Collections.Generic;
  2. using System.Diagnostics.Contracts;
  3. namespace System.Net.Http.Headers
  4. {
  5. // The purpose of this type is to extract the handling of general headers in one place rather than duplicating
  6. // functionality in both HttpRequestHeaders and HttpResponseHeaders. The original approach was to have these two
  7. // types derive from HttpGeneralHeaders. However, in order to keep the public API surface small, it was preferred
  8. // to have HttpRequestHeaders & HttpResponseHeaders derive from HttpHeaders.
  9. internal sealed class HttpGeneralHeaders
  10. {
  11. private HttpHeaderValueCollection<string> connection;
  12. private HttpHeaderValueCollection<string> trailer;
  13. private HttpHeaderValueCollection<TransferCodingHeaderValue> transferEncoding;
  14. private HttpHeaderValueCollection<ProductHeaderValue> upgrade;
  15. private HttpHeaderValueCollection<ViaHeaderValue> via;
  16. private HttpHeaderValueCollection<WarningHeaderValue> warning;
  17. private HttpHeaderValueCollection<NameValueHeaderValue> pragma;
  18. private HttpHeaders parent;
  19. private bool transferEncodingChunkedSet;
  20. private bool connectionCloseSet;
  21. public CacheControlHeaderValue CacheControl
  22. {
  23. get { return (CacheControlHeaderValue)parent.GetParsedValues(HttpKnownHeaderNames.CacheControl); }
  24. set { parent.SetOrRemoveParsedValue(HttpKnownHeaderNames.CacheControl, value); }
  25. }
  26. public HttpHeaderValueCollection<string> Connection
  27. {
  28. get { return ConnectionCore; }
  29. }
  30. public bool? ConnectionClose
  31. {
  32. get
  33. {
  34. if (ConnectionCore.IsSpecialValueSet)
  35. {
  36. return true;
  37. }
  38. if (connectionCloseSet)
  39. {
  40. return false;
  41. }
  42. return null;
  43. }
  44. set
  45. {
  46. if (value == true)
  47. {
  48. connectionCloseSet = true;
  49. ConnectionCore.SetSpecialValue();
  50. }
  51. else
  52. {
  53. connectionCloseSet = value != null;
  54. ConnectionCore.RemoveSpecialValue();
  55. }
  56. }
  57. }
  58. public DateTimeOffset? Date
  59. {
  60. get { return HeaderUtilities.GetDateTimeOffsetValue(HttpKnownHeaderNames.Date, parent); }
  61. set { parent.SetOrRemoveParsedValue(HttpKnownHeaderNames.Date, value); }
  62. }
  63. public HttpHeaderValueCollection<NameValueHeaderValue> Pragma
  64. {
  65. get
  66. {
  67. if (pragma == null)
  68. {
  69. pragma = new HttpHeaderValueCollection<NameValueHeaderValue>(HttpKnownHeaderNames.Pragma, parent);
  70. }
  71. return pragma;
  72. }
  73. }
  74. public HttpHeaderValueCollection<string> Trailer
  75. {
  76. get
  77. {
  78. if (trailer == null)
  79. {
  80. trailer = new HttpHeaderValueCollection<string>(HttpKnownHeaderNames.Trailer,
  81. parent, HeaderUtilities.TokenValidator);
  82. }
  83. return trailer;
  84. }
  85. }
  86. public HttpHeaderValueCollection<TransferCodingHeaderValue> TransferEncoding
  87. {
  88. get { return TransferEncodingCore; }
  89. }
  90. public bool? TransferEncodingChunked
  91. {
  92. get
  93. {
  94. if (TransferEncodingCore.IsSpecialValueSet)
  95. {
  96. return true;
  97. }
  98. if (transferEncodingChunkedSet)
  99. {
  100. return false;
  101. }
  102. return null;
  103. }
  104. set
  105. {
  106. if (value == true)
  107. {
  108. transferEncodingChunkedSet = true;
  109. TransferEncodingCore.SetSpecialValue();
  110. }
  111. else
  112. {
  113. transferEncodingChunkedSet = value != null;
  114. TransferEncodingCore.RemoveSpecialValue();
  115. }
  116. }
  117. }
  118. public HttpHeaderValueCollection<ProductHeaderValue> Upgrade
  119. {
  120. get
  121. {
  122. if (upgrade == null)
  123. {
  124. upgrade = new HttpHeaderValueCollection<ProductHeaderValue>(HttpKnownHeaderNames.Upgrade, parent);
  125. }
  126. return upgrade;
  127. }
  128. }
  129. public HttpHeaderValueCollection<ViaHeaderValue> Via
  130. {
  131. get
  132. {
  133. if (via == null)
  134. {
  135. via = new HttpHeaderValueCollection<ViaHeaderValue>(HttpKnownHeaderNames.Via, parent);
  136. }
  137. return via;
  138. }
  139. }
  140. public HttpHeaderValueCollection<WarningHeaderValue> Warning
  141. {
  142. get
  143. {
  144. if (warning == null)
  145. {
  146. warning = new HttpHeaderValueCollection<WarningHeaderValue>(HttpKnownHeaderNames.Warning, parent);
  147. }
  148. return warning;
  149. }
  150. }
  151. private HttpHeaderValueCollection<string> ConnectionCore
  152. {
  153. get
  154. {
  155. if (connection == null)
  156. {
  157. connection = new HttpHeaderValueCollection<string>(HttpKnownHeaderNames.Connection,
  158. parent, HeaderUtilities.ConnectionClose, HeaderUtilities.TokenValidator);
  159. }
  160. return connection;
  161. }
  162. }
  163. private HttpHeaderValueCollection<TransferCodingHeaderValue> TransferEncodingCore
  164. {
  165. get
  166. {
  167. if (transferEncoding == null)
  168. {
  169. transferEncoding = new HttpHeaderValueCollection<TransferCodingHeaderValue>(
  170. HttpKnownHeaderNames.TransferEncoding, parent, HeaderUtilities.TransferEncodingChunked);
  171. }
  172. return transferEncoding;
  173. }
  174. }
  175. internal HttpGeneralHeaders(HttpHeaders parent)
  176. {
  177. Contract.Requires(parent != null);
  178. this.parent = parent;
  179. }
  180. internal static void AddParsers(Dictionary<string, HttpHeaderParser> parserStore)
  181. {
  182. Contract.Requires(parserStore != null);
  183. parserStore.Add(HttpKnownHeaderNames.CacheControl, CacheControlHeaderParser.Parser);
  184. parserStore.Add(HttpKnownHeaderNames.Connection, GenericHeaderParser.TokenListParser);
  185. parserStore.Add(HttpKnownHeaderNames.Date, DateHeaderParser.Parser);
  186. parserStore.Add(HttpKnownHeaderNames.Pragma, GenericHeaderParser.MultipleValueNameValueParser);
  187. parserStore.Add(HttpKnownHeaderNames.Trailer, GenericHeaderParser.TokenListParser);
  188. parserStore.Add(HttpKnownHeaderNames.TransferEncoding, TransferCodingHeaderParser.MultipleValueParser);
  189. parserStore.Add(HttpKnownHeaderNames.Upgrade, GenericHeaderParser.MultipleValueProductParser);
  190. parserStore.Add(HttpKnownHeaderNames.Via, GenericHeaderParser.MultipleValueViaParser);
  191. parserStore.Add(HttpKnownHeaderNames.Warning, GenericHeaderParser.MultipleValueWarningParser);
  192. }
  193. internal static void AddKnownHeaders(HashSet<string> headerSet)
  194. {
  195. Contract.Requires(headerSet != null);
  196. headerSet.Add(HttpKnownHeaderNames.CacheControl);
  197. headerSet.Add(HttpKnownHeaderNames.Connection);
  198. headerSet.Add(HttpKnownHeaderNames.Date);
  199. headerSet.Add(HttpKnownHeaderNames.Pragma);
  200. headerSet.Add(HttpKnownHeaderNames.Trailer);
  201. headerSet.Add(HttpKnownHeaderNames.TransferEncoding);
  202. headerSet.Add(HttpKnownHeaderNames.Upgrade);
  203. headerSet.Add(HttpKnownHeaderNames.Via);
  204. headerSet.Add(HttpKnownHeaderNames.Warning);
  205. }
  206. internal void AddSpecialsFrom(HttpGeneralHeaders sourceHeaders)
  207. {
  208. // Copy special values, but do not overwrite
  209. bool? chunked = TransferEncodingChunked;
  210. if (!chunked.HasValue)
  211. {
  212. TransferEncodingChunked = sourceHeaders.TransferEncodingChunked;
  213. }
  214. bool? close = ConnectionClose;
  215. if (!close.HasValue)
  216. {
  217. ConnectionClose = sourceHeaders.ConnectionClose;
  218. }
  219. }
  220. }
  221. }