in src/Microsoft.IIS.Administration.WebServer.HttpRequestTracing/Helpers/RulesHelper.cs [244:372]
private static void SetRule(TraceRule rule, dynamic model, Site site, string path)
{
DynamicHelper.If ((object)model.path, v => rule.Path = v);
DynamicHelper.If<long>((object)model.min_request_execution_time, v => {
// Setting time taken to 0 turns off the time taken trace trigger
if(v < 1) {
throw new ApiArgumentException("min_request_execution_time");
}
rule.FailureDefinition.TimeTaken = TimeSpan.FromSeconds(v >= int.MaxValue ? 0 : v);
});
DynamicHelper.If<FailureDefinitionVerbosity>((object)model.event_severity, v => rule.FailureDefinition.Verbosity = v);
// Status codes
if (model.status_codes != null) {
// Check for status codes and ensure proper format. e.g. 101, 102-103, 104
if (!(model.status_codes is JArray)) {
throw new ApiArgumentException("model.status_codes", ApiArgumentException.EXPECTED_ARRAY);
}
List<string> statusCodes = new List<string>();
IEnumerable<string> entries = (model.status_codes as JArray).ToObject<IEnumerable<string>>();
long l;
foreach (var entry in entries) {
var rangeSplit = entry.Split('-');
foreach (var rangeEntry in rangeSplit) {
if (!long.TryParse(rangeEntry, out l)) {
throw new ApiArgumentException("model.status_codes");
}
}
statusCodes.Add(entry.Trim());
}
rule.FailureDefinition.StatusCodes = string.Join(",", statusCodes);
}
// Custom action
if (model.custom_action != null) {
if (!(model.custom_action is JObject)) {
throw new ApiArgumentException("custom_action", ApiArgumentException.EXPECTED_OBJECT);
}
dynamic customAction = model.custom_action;
DynamicHelper.If((object)customAction.executable, v => rule.CustomActionExe = v);
DynamicHelper.If((object)customAction.@params, v => rule.CustomActionParams = v);
DynamicHelper.If((object)customAction.trigger_limit, 0, 10000, v => rule.CustomActionTriggerLimit = v);
}
if (model.traces != null) {
if (!(model.traces is JArray)) {
throw new ApiArgumentException("traces", ApiArgumentException.EXPECTED_ARRAY);
}
IEnumerable<dynamic> traces = model.traces;
rule.TraceAreas.Clear();
foreach (dynamic ta in traces) {
if (!(ta is JObject)) {
throw new ApiArgumentException("traces.item", ApiArgumentException.EXPECTED_OBJECT);
}
TraceArea traceArea = rule.TraceAreas.CreateElement();
//
// Ensure provider field is object and the referenced provider exists
if (ta.provider == null) {
throw new ApiArgumentException("traces.item.provider");
}
if (!(ta.provider is JObject)) {
throw new ApiArgumentException("traces.item.provider", ApiArgumentException.EXPECTED_OBJECT);
}
string providerUuid = DynamicHelper.Value(ta.provider.id);
if (string.IsNullOrEmpty(providerUuid)) {
throw new ApiArgumentException("traces.item.provider.id");
}
var providerName = new ProviderId(providerUuid).Name;
var provider = ProvidersHelper.GetProviders(site, path).Where(p => p.Name.Equals(providerName, StringComparison.OrdinalIgnoreCase)).FirstOrDefault();
if (provider == null) {
throw new NotFoundException("traces.item.provider");
}
traceArea.Provider = provider.Name;
DynamicHelper.If<FailedRequestTracingVerbosity>((object)ta.verbosity, v => traceArea.Verbosity = v);
if (ta.allowed_areas != null) {
if (!(ta.allowed_areas is JObject)) {
throw new ApiArgumentException("traces.allowed_areas", ApiArgumentException.EXPECTED_OBJECT);
}
Dictionary<string, bool> allowedAreas;
try {
allowedAreas = (ta.allowed_areas as JObject).ToObject<Dictionary<string, bool>>();
}
catch (JsonSerializationException e) {
throw new ApiArgumentException("traces.allowed_areas", e);
}
List<string> areas = new List<string>();
foreach (var key in allowedAreas.Keys) {
// Ensure the provider offers the specified area
if (!provider.Areas.Any(a => a.Name.Equals(key))) {
throw new ApiArgumentException("traces.allowed_areas." + key);
}
if (allowedAreas[key]) {
areas.Add(key);
}
}
traceArea.Areas = string.Join(",", areas);
}
rule.TraceAreas.Add(traceArea);
}
}
}