//
using System.Collections.Generic;
+using System.Text;
namespace System.Net.Http.Headers
{
public override int GetHashCode ()
{
- return Unit.GetHashCode () ^ HashCodeCalculator.Calculate (ranges);
+ return Unit.ToLowerInvariant ().GetHashCode () ^ HashCodeCalculator.Calculate (ranges);
}
public static RangeHeaderValue Parse (string input)
public static bool TryParse (string input, out RangeHeaderValue parsedValue)
{
- throw new NotImplementedException ();
+ parsedValue = null;
+
+ var lexer = new Lexer (input);
+ var t = lexer.Scan ();
+ if (t != Token.Type.Token)
+ return false;
+
+ var value = new RangeHeaderValue ();
+ value.unit = lexer.GetStringValue (t);
+
+ t = lexer.Scan ();
+ if (t != Token.Type.SeparatorEqual)
+ return false;
+
+ bool token_read;
+ do {
+ long? from = null, to = null;
+ long number;
+ token_read = false;
+
+ t = lexer.Scan (recognizeDash: true);
+ switch (t.Kind) {
+ case Token.Type.SeparatorDash:
+ t = lexer.Scan ();
+ if (!lexer.TryGetNumericValue (t, out number))
+ return false;
+
+ to = number;
+ break;
+ case Token.Type.Token:
+ string s = lexer.GetStringValue (t);
+ var values = s.Split (new [] { '-' }, StringSplitOptions.RemoveEmptyEntries);
+ if (!Parser.Long.TryParse (values[0], out number))
+ return false;
+
+ switch (values.Length) {
+ case 1:
+ t = lexer.Scan (recognizeDash: true);
+ from = number;
+ switch (t.Kind) {
+ case Token.Type.SeparatorDash:
+ t = lexer.Scan ();
+ if (t != Token.Type.Token) {
+ token_read = true;
+ break;
+ }
+
+ if (!lexer.TryGetNumericValue (t, out number))
+ return false;
+
+ to = number;
+ if (to < from)
+ return false;
+
+ break;
+ case Token.Type.End:
+ if (s.Length > 0 && s [s.Length - 1] != '-')
+ return false;
+
+ token_read = true;
+ break;
+ case Token.Type.SeparatorComma:
+ token_read = true;
+ break;
+ default:
+ return false;
+ }
+ break;
+ case 2:
+ from = number;
+
+ if (!Parser.Long.TryParse (values[1], out number))
+ return false;
+
+ to = number;
+ if (to < from)
+ return false;
+
+ break;
+ default:
+ return false;
+ }
+
+ break;
+ default:
+ return false;
+ }
+
+ value.Ranges.Add (new RangeItemHeaderValue (from, to));
+ if (!token_read)
+ t = lexer.Scan ();
+
+ } while (t == Token.Type.SeparatorComma);
+
+ if (t != Token.Type.End)
+ return false;
+
+ parsedValue = value;
+ return true;
+ }
+
+ public override string ToString ()
+ {
+ var sb = new StringBuilder (unit);
+ sb.Append ("=");
+ for (int i = 0; i < Ranges.Count; ++i) {
+ if (i > 0)
+ sb.Append (", ");
+
+ sb.Append (ranges[i]);
+ }
+
+ return sb.ToString ();
}
}
}