PageRenderTime 40ms CodeModel.GetById 12ms RepoModel.GetById 1ms app.codeStats 0ms

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

#
C# | 234 lines | 192 code | 36 blank | 6 comment | 12 complexity | 53097796a31466e56d85c09a1ce3a6ef MD5 | raw file
Possible License(s): CC-BY-SA-3.0, Apache-2.0
  1. using System.Collections.Generic;
  2. using System.Diagnostics.CodeAnalysis;
  3. using System.Diagnostics.Contracts;
  4. namespace System.Net.Http.Headers
  5. {
  6. [SuppressMessage("Microsoft.Naming", "CA1710:IdentifiersShouldHaveCorrectSuffix",
  7. Justification = "This is not a collection")]
  8. public sealed class HttpResponseHeaders : HttpHeaders
  9. {
  10. private static readonly Dictionary<string, HttpHeaderParser> parserStore;
  11. private static readonly HashSet<string> invalidHeaders;
  12. private HttpGeneralHeaders generalHeaders;
  13. private HttpHeaderValueCollection<string> acceptRanges;
  14. private HttpHeaderValueCollection<AuthenticationHeaderValue> wwwAuthenticate;
  15. private HttpHeaderValueCollection<AuthenticationHeaderValue> proxyAuthenticate;
  16. private HttpHeaderValueCollection<ProductInfoHeaderValue> server;
  17. private HttpHeaderValueCollection<string> vary;
  18. #region Response Headers
  19. public HttpHeaderValueCollection<string> AcceptRanges
  20. {
  21. get
  22. {
  23. if (acceptRanges == null)
  24. {
  25. acceptRanges = new HttpHeaderValueCollection<string>(HttpKnownHeaderNames.AcceptRanges,
  26. this, HeaderUtilities.TokenValidator);
  27. }
  28. return acceptRanges;
  29. }
  30. }
  31. public TimeSpan? Age
  32. {
  33. get { return HeaderUtilities.GetTimeSpanValue(HttpKnownHeaderNames.Age, this); }
  34. set { SetOrRemoveParsedValue(HttpKnownHeaderNames.Age, value); }
  35. }
  36. public EntityTagHeaderValue ETag
  37. {
  38. get { return (EntityTagHeaderValue)GetParsedValues(HttpKnownHeaderNames.ETag); }
  39. set { SetOrRemoveParsedValue(HttpKnownHeaderNames.ETag, value); }
  40. }
  41. public Uri Location
  42. {
  43. get { return (Uri)GetParsedValues(HttpKnownHeaderNames.Location); }
  44. // The RFC says that the Location header should be an absolute Uri,
  45. // but IIS and HttpListener do not enforce this.
  46. set { SetOrRemoveParsedValue(HttpKnownHeaderNames.Location, value); }
  47. }
  48. public HttpHeaderValueCollection<AuthenticationHeaderValue> ProxyAuthenticate
  49. {
  50. get
  51. {
  52. if (proxyAuthenticate == null)
  53. {
  54. proxyAuthenticate = new HttpHeaderValueCollection<AuthenticationHeaderValue>(
  55. HttpKnownHeaderNames.ProxyAuthenticate, this);
  56. }
  57. return proxyAuthenticate;
  58. }
  59. }
  60. public RetryConditionHeaderValue RetryAfter
  61. {
  62. get { return (RetryConditionHeaderValue)GetParsedValues(HttpKnownHeaderNames.RetryAfter); }
  63. set { SetOrRemoveParsedValue(HttpKnownHeaderNames.RetryAfter, value); }
  64. }
  65. public HttpHeaderValueCollection<ProductInfoHeaderValue> Server
  66. {
  67. get
  68. {
  69. if (server == null)
  70. {
  71. server = new HttpHeaderValueCollection<ProductInfoHeaderValue>(HttpKnownHeaderNames.Server, this);
  72. }
  73. return server;
  74. }
  75. }
  76. public HttpHeaderValueCollection<string> Vary
  77. {
  78. get
  79. {
  80. if (vary == null)
  81. {
  82. vary = new HttpHeaderValueCollection<string>(HttpKnownHeaderNames.Vary,
  83. this, HeaderUtilities.TokenValidator);
  84. }
  85. return vary;
  86. }
  87. }
  88. public HttpHeaderValueCollection<AuthenticationHeaderValue> WwwAuthenticate
  89. {
  90. get
  91. {
  92. if (wwwAuthenticate == null)
  93. {
  94. wwwAuthenticate = new HttpHeaderValueCollection<AuthenticationHeaderValue>(
  95. HttpKnownHeaderNames.WWWAuthenticate, this);
  96. }
  97. return wwwAuthenticate;
  98. }
  99. }
  100. #endregion
  101. #region General Headers
  102. public CacheControlHeaderValue CacheControl
  103. {
  104. get { return generalHeaders.CacheControl; }
  105. set { generalHeaders.CacheControl = value; }
  106. }
  107. public HttpHeaderValueCollection<string> Connection
  108. {
  109. get { return generalHeaders.Connection; }
  110. }
  111. public bool? ConnectionClose
  112. {
  113. get { return generalHeaders.ConnectionClose; }
  114. set { generalHeaders.ConnectionClose = value; }
  115. }
  116. public DateTimeOffset? Date
  117. {
  118. get { return generalHeaders.Date; }
  119. set { generalHeaders.Date = value; }
  120. }
  121. public HttpHeaderValueCollection<NameValueHeaderValue> Pragma
  122. {
  123. get { return generalHeaders.Pragma; }
  124. }
  125. public HttpHeaderValueCollection<string> Trailer
  126. {
  127. get { return generalHeaders.Trailer; }
  128. }
  129. // Like ContentEncoding: Order matters!
  130. public HttpHeaderValueCollection<TransferCodingHeaderValue> TransferEncoding
  131. {
  132. get { return generalHeaders.TransferEncoding; }
  133. }
  134. public bool? TransferEncodingChunked
  135. {
  136. get { return generalHeaders.TransferEncodingChunked; }
  137. set { generalHeaders.TransferEncodingChunked = value; }
  138. }
  139. public HttpHeaderValueCollection<ProductHeaderValue> Upgrade
  140. {
  141. get { return generalHeaders.Upgrade; }
  142. }
  143. public HttpHeaderValueCollection<ViaHeaderValue> Via
  144. {
  145. get { return generalHeaders.Via; }
  146. }
  147. public HttpHeaderValueCollection<WarningHeaderValue> Warning
  148. {
  149. get { return generalHeaders.Warning; }
  150. }
  151. #endregion
  152. internal HttpResponseHeaders()
  153. {
  154. this.generalHeaders = new HttpGeneralHeaders(this);
  155. base.SetConfiguration(parserStore, invalidHeaders);
  156. }
  157. static HttpResponseHeaders()
  158. {
  159. parserStore = new Dictionary<string, HttpHeaderParser>(HeaderUtilities.CaseInsensitiveStringComparer);
  160. parserStore.Add(HttpKnownHeaderNames.AcceptRanges, GenericHeaderParser.TokenListParser);
  161. parserStore.Add(HttpKnownHeaderNames.Age, TimeSpanHeaderParser.Parser);
  162. parserStore.Add(HttpKnownHeaderNames.ETag, GenericHeaderParser.SingleValueEntityTagParser);
  163. // The RFC says that the Location header should be an absolute Uri,
  164. // but IIS and HttpListener do not enforce this.
  165. parserStore.Add(HttpKnownHeaderNames.Location, UriHeaderParser.RelativeOrAbsoluteUriParser);
  166. parserStore.Add(HttpKnownHeaderNames.ProxyAuthenticate, GenericHeaderParser.MultipleValueAuthenticationParser);
  167. parserStore.Add(HttpKnownHeaderNames.RetryAfter, GenericHeaderParser.RetryConditionParser);
  168. parserStore.Add(HttpKnownHeaderNames.Server, ProductInfoHeaderParser.MultipleValueParser);
  169. parserStore.Add(HttpKnownHeaderNames.Vary, GenericHeaderParser.TokenListParser);
  170. parserStore.Add(HttpKnownHeaderNames.WWWAuthenticate, GenericHeaderParser.MultipleValueAuthenticationParser);
  171. HttpGeneralHeaders.AddParsers(parserStore);
  172. invalidHeaders = new HashSet<string>(HeaderUtilities.CaseInsensitiveStringComparer);
  173. HttpRequestHeaders.AddKnownHeaders(invalidHeaders);
  174. HttpContentHeaders.AddKnownHeaders(invalidHeaders);
  175. }
  176. internal static void AddKnownHeaders(HashSet<string> headerSet)
  177. {
  178. Contract.Requires(headerSet != null);
  179. headerSet.Add(HttpKnownHeaderNames.AcceptRanges);
  180. headerSet.Add(HttpKnownHeaderNames.Age);
  181. headerSet.Add(HttpKnownHeaderNames.ETag);
  182. headerSet.Add(HttpKnownHeaderNames.Location);
  183. headerSet.Add(HttpKnownHeaderNames.ProxyAuthenticate);
  184. headerSet.Add(HttpKnownHeaderNames.RetryAfter);
  185. headerSet.Add(HttpKnownHeaderNames.Server);
  186. headerSet.Add(HttpKnownHeaderNames.Vary);
  187. headerSet.Add(HttpKnownHeaderNames.WWWAuthenticate);
  188. }
  189. internal override void AddHeaders(HttpHeaders sourceHeaders)
  190. {
  191. base.AddHeaders(sourceHeaders);
  192. HttpResponseHeaders sourceResponseHeaders = sourceHeaders as HttpResponseHeaders;
  193. Contract.Assert(sourceResponseHeaders != null);
  194. // Copy special values, but do not overwrite
  195. generalHeaders.AddSpecialsFrom(sourceResponseHeaders.generalHeaders);
  196. }
  197. }
  198. }