public class MediaTypeHeaderValue : ICloneable
{
internal List<NameValueHeaderValue> parameters;
- string media_type;
+ internal string media_type;
public MediaTypeHeaderValue (string mediaType)
{
- if (mediaType == null)
- throw new ArgumentNullException ("mediaType");
-
MediaType = mediaType;
}
}
}
+ internal MediaTypeHeaderValue ()
+ {
+ }
+
public string CharSet {
get {
if (parameters == null)
return null;
- var found = parameters.Find (l => StringComparer.OrdinalIgnoreCase.Equals (l.Name, "charset"));
+ var found = parameters.Find (l => string.Equals (l.Name, "charset", StringComparison.OrdinalIgnoreCase));
if (found == null)
return null;
if (parameters == null)
parameters = new List<NameValueHeaderValue> ();
- var found = parameters.Find (l => StringComparer.OrdinalIgnoreCase.Equals (l.Name, "charset"));
- if (string.IsNullOrEmpty (value)) {
- if (found != null)
- parameters.Remove (found);
- } else {
- if (found != null) {
- found.Value = value;
- } else {
- parameters.Add (new NameValueHeaderValue ("charset", value));
- }
- }
+ parameters.SetValue ("charset", value);
}
}
return media_type;
}
set {
- media_type = value;
+ if (value == null)
+ throw new ArgumentNullException ("MediaType");
+
+ string temp;
+ var token = TryParseMediaType (new Lexer (value), out temp);
+ if (token == null || token.Value.Kind != Token.Type.End)
+ throw new FormatException ();
+
+ media_type = temp;
}
}
public override string ToString ()
{
- // TODO:
- return media_type;
+ if (parameters == null)
+ return media_type;
+
+ return media_type + CollectionExtensions.ToString (parameters);
}
public static bool TryParse (string input, out MediaTypeHeaderValue parsedValue)
{
- throw new NotImplementedException ();
+ parsedValue = null;
+
+ var lexer = new Lexer (input);
+
+ string media;
+ List<NameValueHeaderValue> parameters = null;
+ var token = TryParseMediaType (lexer, out media);
+ if (token == null)
+ return false;
+
+ switch (token.Value.Kind) {
+ case Token.Type.SeparatorSemicolon:
+ Token t;
+ if (!NameValueHeaderValue.TryParseParameters (lexer, out parameters, out t) || t != Token.Type.End)
+ return false;
+ break;
+ case Token.Type.End:
+ break;
+ default:
+ return false;
+ }
+
+ parsedValue = new MediaTypeHeaderValue () {
+ media_type = media,
+ parameters = parameters
+ };
+
+ return true;
+ }
+
+ internal static Token? TryParseMediaType (Lexer lexer, out string media)
+ {
+ media = null;
+
+ var token = lexer.Scan ();
+ if (token != Token.Type.Token)
+ return null;
+
+ if (lexer.Scan () != Token.Type.SeparatorSlash)
+ return null;
+
+ var token2 = lexer.Scan ();
+ if (token2 != Token.Type.Token)
+ return null;
+
+ media = lexer.GetStringValue (token) + "/" + lexer.GetStringValue (token2);
+
+ return lexer.Scan ();
}
}
}