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

# · C# · 157 lines · 123 code · 28 blank · 6 comment · 19 complexity · b27c6542005505e863cc1fd0c8bc50bd MD5 · raw file

  1. using System.Collections.Generic;
  2. using System.Diagnostics.Contracts;
  3. namespace System.Net.Http.Headers
  4. {
  5. public class TransferCodingHeaderValue : ICloneable
  6. {
  7. // Use list instead of dictionary since we may have multiple parameters with the same name.
  8. private ICollection<NameValueHeaderValue> parameters;
  9. private string value;
  10. public string Value
  11. {
  12. get { return value; }
  13. }
  14. public ICollection<NameValueHeaderValue> Parameters
  15. {
  16. get
  17. {
  18. if (parameters == null)
  19. {
  20. parameters = new ObjectCollection<NameValueHeaderValue>();
  21. }
  22. return parameters;
  23. }
  24. }
  25. internal TransferCodingHeaderValue()
  26. {
  27. }
  28. protected TransferCodingHeaderValue(TransferCodingHeaderValue source)
  29. {
  30. Contract.Requires(source != null);
  31. this.value = source.value;
  32. if (source.parameters != null)
  33. {
  34. foreach (var parameter in source.parameters)
  35. {
  36. this.Parameters.Add((NameValueHeaderValue)((ICloneable)parameter).Clone());
  37. }
  38. }
  39. }
  40. public TransferCodingHeaderValue(string value)
  41. {
  42. HeaderUtilities.CheckValidToken(value, "value");
  43. this.value = value;
  44. }
  45. public static TransferCodingHeaderValue Parse(string input)
  46. {
  47. int index = 0;
  48. return (TransferCodingHeaderValue)TransferCodingHeaderParser.SingleValueParser.ParseValue(
  49. input, null, ref index);
  50. }
  51. public static bool TryParse(string input, out TransferCodingHeaderValue parsedValue)
  52. {
  53. int index = 0;
  54. object output;
  55. parsedValue = null;
  56. if (TransferCodingHeaderParser.SingleValueParser.TryParseValue(input, null, ref index, out output))
  57. {
  58. parsedValue = (TransferCodingHeaderValue)output;
  59. return true;
  60. }
  61. return false;
  62. }
  63. internal static int GetTransferCodingLength(string input, int startIndex,
  64. Func<TransferCodingHeaderValue> transferCodingCreator, out TransferCodingHeaderValue parsedValue)
  65. {
  66. Contract.Requires(transferCodingCreator != null);
  67. Contract.Requires(startIndex >= 0);
  68. parsedValue = null;
  69. if (string.IsNullOrEmpty(input) || (startIndex >= input.Length))
  70. {
  71. return 0;
  72. }
  73. // Caller must remove leading whitespaces. If not, we'll return 0.
  74. int valueLength = HttpRuleParser.GetTokenLength(input, startIndex);
  75. if (valueLength == 0)
  76. {
  77. return 0;
  78. }
  79. string value = input.Substring(startIndex, valueLength);
  80. int current = startIndex + valueLength;
  81. current = current + HttpRuleParser.GetWhitespaceLength(input, current);
  82. TransferCodingHeaderValue transferCodingHeader = null;
  83. // If we're not done and we have a parameter delimiter, then we have a list of parameters.
  84. if ((current < input.Length) && (input[current] == ';'))
  85. {
  86. transferCodingHeader = transferCodingCreator();
  87. transferCodingHeader.value = value;
  88. current++; // skip delimiter.
  89. int parameterLength = NameValueHeaderValue.GetNameValueListLength(input, current, ';',
  90. transferCodingHeader.Parameters);
  91. if (parameterLength == 0)
  92. {
  93. return 0;
  94. }
  95. parsedValue = transferCodingHeader;
  96. return current + parameterLength - startIndex;
  97. }
  98. // We have a transfer coding without parameters.
  99. transferCodingHeader = transferCodingCreator();
  100. transferCodingHeader.value = value;
  101. parsedValue = transferCodingHeader;
  102. return current - startIndex;
  103. }
  104. public override string ToString()
  105. {
  106. return value + NameValueHeaderValue.ToString(parameters, ';', true);
  107. }
  108. public override bool Equals(object obj)
  109. {
  110. TransferCodingHeaderValue other = obj as TransferCodingHeaderValue;
  111. if (other == null)
  112. {
  113. return false;
  114. }
  115. return (string.Compare(value, other.value, StringComparison.OrdinalIgnoreCase) == 0) &&
  116. HeaderUtilities.AreEqualCollections(parameters, other.parameters);
  117. }
  118. public override int GetHashCode()
  119. {
  120. // The value string is case-insensitive.
  121. return value.ToLowerInvariant().GetHashCode() ^ NameValueHeaderValue.GetHashCode(parameters);
  122. }
  123. // Implement ICloneable explicitly to allow derived types to "override" the implementation.
  124. object ICloneable.Clone()
  125. {
  126. return new TransferCodingHeaderValue(this);
  127. }
  128. }
  129. }