private static HttpCheck CompleteHttpCheck( XPathNavigator crt, long id, Environment environment, Service service, TimeSpan interval, int?maxContentLength) { var method = crt.GetEnumAttributeValue <HttpCheck.HttpMethod>("method"); var url = crt.GetUriAttributeValue("url"); var connectTimeout = crt.GetTimeSpanAttributeValue("connectTimeout"); var readTimeout = crt.GetTimeSpanAttributeValue("readTimeout"); if (method == null) { throw new InvalidDataException("HttpCall check is missing/has invalid the (HTTP) method"); } if (url == null) { throw new InvalidDataException("HttpCall check is missing/has invalid its URL"); } if (connectTimeout + readTimeout > interval) { throw new InvalidDataException("the combined timeouts cannot be larger than the check interval"); } var conditions = new List <HttpCheckCondition>(); var conditionsNode = crt.SelectSingleNode("conditions"); conditionsNode.MoveToFirstChild(); do { if (conditionsNode.NodeType != XPathNodeType.Element) { continue; } var conditionsClone = conditionsNode.Clone(); var conditionType = conditionsClone.Name; var attributeStrings = new List <KeyValuePair <string, string> >(); var value = conditionsClone.Value; if (conditionsClone.HasAttributes) { if (conditionsClone.MoveToFirstAttribute()) { do { attributeStrings.Add(new KeyValuePair <string, string>(conditionsClone.Name, conditionsClone.Value)); } while (conditionsClone.MoveToNextAttribute()); } } var condition = GetCondition(conditionType, attributeStrings, value); conditions.Add(condition); } while (conditionsNode.MoveToNext()); var roConditions = conditions.AsReadOnly(); var check = new HttpCheck( id, environment, service, interval, url, roConditions, method.Value, connectTimeout, readTimeout, maxContentLength ?? HttpCheck.DefaultMaxContentLength); return(check); }