1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
// Copyright (c) Microsoft Corporation. All rights reserved. See License.txt in the project root for license information.
using System.Collections.Specialized;
using System.Diagnostics.Contracts;
using System.Net.Http.Formatting.Internal;
using System.Web.Http;
namespace System.Net.Http.Headers
{
public class CookieState : ICloneable
{
private string _name;
private NameValueCollection _values = HttpValueCollection.Create();
public CookieState(string name)
: this(name, String.Empty)
{
}
public CookieState(string name, string value)
{
CheckNameFormat(name, "name");
_name = name;
CheckValueFormat(value, "value");
Value = value;
}
public CookieState(string name, NameValueCollection values)
{
CheckNameFormat(name, "name");
_name = name;
if (values == null)
{
throw Error.ArgumentNull("values");
}
Values.Add(values);
}
private CookieState(CookieState source)
{
Contract.Requires(source != null);
_name = source._name;
if (source._values != null)
{
Values.Add(source._values);
}
}
public string Name
{
get { return _name; }
set
{
CheckNameFormat(value, "value");
_name = value;
}
}
/// <summary>
/// If the cookie data is a simple string value then set or retrieve it using the <see cref="Value"/> property.
/// If the cookie data is structured then use the <see cref="Values"/> property.
/// </summary>
public string Value
{
get
{
return Values.Count > 0 ? Values.AllKeys[0] : String.Empty;
}
set
{
CheckValueFormat(value, "value");
if (Values.Count > 0)
{
Values.AllKeys[0] = value;
}
else
{
Values.Add(value, String.Empty);
}
}
}
/// <summary>
/// If the cookie data is structured then use the <see cref="Values"/> property for setting and getting individual values.
/// If the cookie data is a simple string value then set or retrieve it using the <see cref="Value"/> property.
/// </summary>
public NameValueCollection Values
{
get { return _values; }
}
public string this[string name]
{
get { return Values[name]; }
set { Values[name] = value; }
}
public override string ToString()
{
return _name + "=" + (_values != null ? _values.ToString() : String.Empty);
}
public object Clone()
{
return new CookieState(this);
}
private static void CheckNameFormat(string name, string parameterName)
{
if (!FormattingUtilities.ValidateHeaderToken(name))
{
throw Error.Argument(parameterName, Properties.Resources.CookieInvalidName);
}
}
private static void CheckValueFormat(string value, string parameterName)
{
// Empty string is a valid cookie value
if (value == null)
{
throw Error.ArgumentNull(parameterName);
}
}
}
}
|