static void ReadAllowFromElement (XmlReader reader, AccessPolicy policy)
{
if (reader.IsEmptyElement) {
reader.Skip ();
return;
}
bool valid = true;
string headers = null;
string methods = null; // new in SL3
if (reader.HasAttributes) {
int n = reader.AttributeCount;
headers = reader.GetAttribute ("http-request-headers");
if (headers != null)
n--;
methods = reader.GetAttribute ("http-methods");
if (methods != null)
n--;
valid = (n == 0);
}
var v = new AllowFrom ();
v.HttpRequestHeaders.SetHeaders (headers);
v.AllowAnyMethod = (methods == "*"); // only legal value defined, otherwise restricted to GET and POST
reader.ReadStartElement ("allow-from", String.Empty);
for (reader.MoveToContent (); reader.NodeType != XmlNodeType.EndElement; reader.MoveToContent ()) {
if (reader.NodeType != XmlNodeType.Element)
throw new XmlException (String.Format ("Unexpected allow-from content: {0}", reader.NodeType));
if (!String.IsNullOrEmpty (reader.NamespaceURI)) {
reader.Skip ();
continue;
}
switch (reader.LocalName) {
case "domain":
var d = reader.GetAttribute ("uri");
if (d == "*")
v.AllowAnyDomain = true;
else
v.Domains.Add (d);
reader.Skip ();
break;
default:
valid = false;
reader.Skip ();
continue;
}
}
if (valid)
policy.AllowedServices.Add (v);
reader.ReadEndElement ();
}