Add unit test for AggregateException.GetBaseException that works on .net but is broke...
[mono.git] / mcs / class / System.Net.Http / System.Net.Http.Headers / EntityTagHeaderValue.cs
1 //
2 // EntityTagHeaderValue.cs
3 //
4 // Authors:
5 //      Marek Safar  <marek.safar@gmail.com>
6 //
7 // Copyright (C) 2011 Xamarin Inc (http://www.xamarin.com)
8 //
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
16 //
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
19 //
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27 //
28
29 namespace System.Net.Http.Headers
30 {
31         public class EntityTagHeaderValue : ICloneable
32         {
33                 static readonly EntityTagHeaderValue any = new EntityTagHeaderValue () { Tag = "*" };
34
35                 public EntityTagHeaderValue (string tag)
36                 {
37                         Parser.Token.CheckQuotedString (tag);
38                         Tag = tag;
39                 }
40
41                 public EntityTagHeaderValue (string tag, bool isWeak)
42                         : this (tag)
43                 {
44                         IsWeak = isWeak;
45                 }
46
47                 internal EntityTagHeaderValue ()
48                 {
49                 }
50
51                 public static EntityTagHeaderValue Any {
52                         get {
53                                 return any;
54                         }
55                 }
56
57                 public bool IsWeak { get; internal set; }
58                 public string Tag { get; internal set; }
59
60                 object ICloneable.Clone ()
61                 {
62                         return MemberwiseClone ();
63                 }
64
65                 public override bool Equals (object obj)
66                 {
67                         var source = obj as EntityTagHeaderValue;
68                         return source != null && source.Tag == Tag &&
69                                 string.Equals (source.Tag, Tag, StringComparison.Ordinal);
70                 }
71
72                 public override int GetHashCode ()
73                 {
74                         return IsWeak.GetHashCode () ^ Tag.GetHashCode ();
75                 }
76
77                 public static EntityTagHeaderValue Parse (string input)
78                 {
79                         EntityTagHeaderValue value;
80                         if (TryParse (input, out value))
81                                 return value;
82
83                         throw new FormatException (input);
84                 }
85
86                 public static bool TryParse (string input, out EntityTagHeaderValue parsedValue)
87                 {
88                         parsedValue = null;
89
90                         var lexer = new Lexer (input);
91                         var t = lexer.Scan ();
92                         bool is_weak = false;
93
94                         if (t == Token.Type.Token) {
95                                 if (lexer.GetStringValue (t) != "W" || lexer.PeekChar () != '/')
96                                         return false;
97
98                                 is_weak = true;
99                                 lexer.EatChar ();
100                                 t = lexer.Scan ();
101                         }
102
103                         if (t != Token.Type.QuotedString)
104                                 return false;
105
106                         if (lexer.Scan () != Token.Type.End)
107                                 return false;
108
109                         parsedValue = new EntityTagHeaderValue ();
110                         parsedValue.Tag = lexer.GetStringValue (t);
111                         parsedValue.IsWeak = is_weak;
112                         return true;
113                 }
114
115                 public override string ToString ()
116                 {
117                         return IsWeak ?
118                                 "W/" + Tag :
119                                 Tag;
120                 }
121         }
122 }