Add [Category ("NotWorking")] to failing test.
[mono.git] / mcs / class / System.Net.Http / System.Net.Http.Headers / WarningHeaderValue.cs
1 //
2 // WarningHeaderValue.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 using System.Globalization;
30
31 namespace System.Net.Http.Headers
32 {
33         public class WarningHeaderValue : ICloneable
34         {
35                 public WarningHeaderValue (int code, string agent, string text)
36                 {
37                         if (!IsCodeValid (code))
38                                 throw new ArgumentOutOfRangeException ("code");
39
40                         Parser.Uri.Check (agent);
41                         Parser.Token.CheckQuotedString (text);
42
43                         Code = code;
44                         Agent = agent;
45                         Text = text;
46                 }
47
48                 public WarningHeaderValue (int code, string agent, string text, DateTimeOffset date)
49                         : this (code, agent, text)
50                 {
51                         Date = date;
52                 }
53
54                 private WarningHeaderValue ()
55                 {
56                 }
57
58                 public string Agent { get; private set; }
59                 public int Code { get; private set; }
60                 public DateTimeOffset? Date { get; private set; }
61                 public string Text { get; private set; }
62
63                 static bool IsCodeValid (int code)
64                 {
65                         return code >= 0 && code < 1000;
66                 }
67
68                 object ICloneable.Clone ()
69                 {
70                         return MemberwiseClone ();
71                 }
72
73                 public override bool Equals (object obj)
74                 {
75                         var source = obj as WarningHeaderValue;
76                         if (source == null)
77                                 return false;
78
79                         return Code == source.Code &&
80                                 string.Equals (source.Agent, Agent, StringComparison.OrdinalIgnoreCase) &&
81                                 Text == source.Text &&
82                                 Date == source.Date;
83                 }
84
85                 public override int GetHashCode ()
86                 {
87                         int hc = Code.GetHashCode ();
88                         hc ^= Agent.ToLowerInvariant ().GetHashCode ();
89                         hc ^= Text.GetHashCode ();
90                         hc ^= Date.GetHashCode ();
91
92                         return hc;
93                 }
94
95                 public static WarningHeaderValue Parse (string input)
96                 {
97                         WarningHeaderValue value;
98                         if (TryParse (input, out value))
99                                 return value;
100
101                         throw new FormatException (input);
102                 }
103                 
104                 public static bool TryParse (string input, out WarningHeaderValue parsedValue)
105                 {
106                         parsedValue = null;
107
108                         var lexer = new Lexer (input);
109                         var t = lexer.Scan ();
110
111                         if (t != Token.Type.Token)
112                                 return false;
113
114                         int code;
115                         if (!lexer.TryGetNumericValue (t, out code) || !IsCodeValid (code))
116                                 return false;
117
118                         t = lexer.Scan ();
119                         if (t != Token.Type.Token)
120                                 return false;
121
122                         var next = t;
123                         if (lexer.PeekChar () == ':') {
124                                 lexer.EatChar ();
125
126                                 next = lexer.Scan ();
127                                 if (next != Token.Type.Token)
128                                         return false;
129                         }
130
131                         var value = new WarningHeaderValue ();
132                         value.Code = code;
133                         value.Agent = lexer.GetStringValue (t, next);
134
135                         t = lexer.Scan ();
136                         if (t != Token.Type.QuotedString)
137                                 return false;
138
139                         value.Text = lexer.GetStringValue (t);
140
141                         t = lexer.Scan ();
142                         if (t == Token.Type.QuotedString) {
143                                 DateTimeOffset date;
144                                 if (!lexer.TryGetDateValue (t, out date))
145                                         return false;
146
147                                 value.Date = date;
148                                 t = lexer.Scan ();
149                         }
150
151                         if (t != Token.Type.End)
152                                 return false;
153
154                         parsedValue = value;
155                         return true;
156                 }
157
158                 public override string ToString ()
159                 {
160                         string s = Code.ToString ("000") + " " + Agent + " " + Text;
161                         if (Date.HasValue)
162                                 s = s + " \"" + Date.Value.ToString ("r", CultureInfo.InvariantCulture) + "\"";
163
164                         return s;
165                 }
166         }
167 }