public ErrorMailHtmlPage(Error error, ErrorMailOptions options = null) { Error = error; if (error.Exception != null) ErrorLogEntry = LoggedException.RecallErrorLogEntry(error.Exception); Options = options ?? DefaultOptions; }
public static ErrorMailOptions ParseOptions(IEnumerable<KeyValuePair<string, string>> entries) { const string sectionName = "fabmail:"; var section = from e in entries where e.Key.StartsWith(sectionName, StringComparison.OrdinalIgnoreCase) && !string.IsNullOrEmpty(e.Value) group e.Value by e.Key.Substring(sectionName.Length); var config = section.ToDictionary(e => e.Key, e => e.AsEnumerable(), StringComparer.OrdinalIgnoreCase); var options = new ErrorMailOptions { DontSkipEmptyKeys = config.Find("dont-skip-empty-keys" )?.LastOrDefault()?.IsTruthy() ?? false, ErrorDetailUrlFormat = config.Find("error-detail-url-format")?.LastOrDefault(), }; var passThruFilter = DiagnosticsCollectionSelectors.PassThru; var filterSettings = from p in new[] { new { Prefix = "server-variables-", Setter = ErrorMailOptionsSelectorSetter.ServerVariables }, new { Prefix = "form-" , Setter = ErrorMailOptionsSelectorSetter.Form }, new { Prefix = "query-string-" , Setter = ErrorMailOptionsSelectorSetter.QueryString }, new { Prefix = "cookies-" , Setter = ErrorMailOptionsSelectorSetter.Cookies }, new { Prefix = string.Empty , Setter = ErrorMailOptionsSelectorSetter.ServerVariables + ErrorMailOptionsSelectorSetter.Form + ErrorMailOptionsSelectorSetter.QueryString + ErrorMailOptionsSelectorSetter.Cookies }, } let filters = from e in new[] { new { Key = "keys" , Filter = (Func<Regex, DiagnosticsCollectionSelector>) DiagnosticsCollectionSelectors.RegexKeys }, new { Key = "not-keys" , Filter = (Func<Regex, DiagnosticsCollectionSelector>) DiagnosticsCollectionSelectors.NotRegexKeys }, new { Key = "secret-keys", Filter = (Func<Regex, DiagnosticsCollectionSelector>) DiagnosticsCollectionSelectors.RegexSecretKeys }, } let pattern = config.Find(p.Prefix + e.Key)?.LastOrDefault() where !string.IsNullOrEmpty(pattern) select e.Filter(new Regex(pattern)) select new { p.Setter, Filter = filters.Aggregate(passThruFilter, (a, s) => a.Then(s)), } into e where e.Filter != passThruFilter select e; foreach (var e in filterSettings) e.Setter(options, e.Filter); foreach (var key in config.Find("time-zone-id") ?? Enumerable.Empty<string>()) options.TimeZoneIds.Add(key); return options; }