public Task RouteRequest(IOwinContext context, Func <Task> next) { if (_routingProcessors == null) { throw new RoutingException("Requests can not be routed until dependencies have been resolved"); } _traceFilter.Trace(context, TraceLevel.Debug, () => "Routing request in '" + Name + "' routing segment"); var nextIndex = 0; Func <Task> getNext = null; getNext = () => { if (nextIndex < _routingProcessors.Count) { var routingProcessor = _routingProcessors[nextIndex++]; _traceFilter.Trace(context, TraceLevel.Debug, () => { var middleware = routingProcessor as IMiddleware; if (middleware == null || string.IsNullOrEmpty(middleware.Name)) { return("Routing request to " + routingProcessor.GetType().FullName); } return("Routing request to middleware '" + middleware.Name + "'"); }); return(routingProcessor.RouteRequest(context, getNext) ?? next()); } return(next()); }; return(getNext()); }
private Task HandleException(IOwinContext context, Exception ex) { _traceFilter.Trace(context, TraceLevel.Error, () => GetType().Name + " Exception caught: " + ex.Message); var isPrivate = false; try { context.Response.StatusCode = 500; context.Response.ReasonPhrase = "Server Error"; try { SendEmail(context, ex); } catch (Exception mailException) { _traceFilter.Trace(context, TraceLevel.Error, () => GetType().Name + " failed to send email: " + mailException.Message); System.Diagnostics.Trace.WriteLine(GetType().Name + " failed to send email: " + mailException.Message); } isPrivate = IsPrivate(context); if (isPrivate) { return(PrivateResponse(context, ex)); } return(PublicResponse(context)); } catch (Exception ex2) { string message; if (isPrivate) { message = "An exception occurred and a report was being generated, but then a further exception " + "was thrown during the generation of that report. \nThe original exception that was throws was " + ex.Message + ". During report generation the exception thrown was " + ex2.Message + "."; } else { message = "An exception occurred and a report was being generated, but then a further exception " + "was thrown during the generation of that report. Please contact support and provide " + "details of what you were doing at the time so that we can resolve this problem as soon " + "as possible. Thank you."; } if (message.Length < 514) { message += new string(' ', 514 - message.Length); } context.Response.ContentType = "text/plain"; context.Response.StatusCode = (int)HttpStatusCode.InternalServerError; return(context.Response.WriteAsync(message)); } }
public Task Invoke(IOwinContext context, Func <Task> next) { string path; if (!IsForThisMiddleware(context, out path)) { return(next()); } if (context.Request.Path.Value.Equals(path, StringComparison.OrdinalIgnoreCase)) { _traceFilter.Trace(context, TraceLevel.Information, () => GetType().Name + " returning middleware documentation"); return(GenerateDocumentation(context)); } if (context.Request.Path.Value.Equals(path + ConfigDocsPath, StringComparison.OrdinalIgnoreCase)) { _traceFilter.Trace(context, TraceLevel.Information, () => GetType().Name + " returning configuration documentation"); return(DocumentConfiguration(context)); } throw new Exception("This request looked like it was for the documenter middleware, but the middleware did not know how to handle it."); }
public Task Invoke(IOwinContext context, Func <Task> next) { if (context.Request.Path == _configPage) { _traceFilter.Trace(context, TraceLevel.Information, () => GetType().Name + " returning configuration documentation"); return(DocumentConfiguration(context)); } string template; if (_pageTemplateFile != null && _pageTemplateFile.Exists) { _traceFilter.Trace(context, TraceLevel.Information, () => GetType().Name + " returning template file"); using (var stream = _pageTemplateFile.Open(FileMode.Open, FileAccess.Read, FileShare.Read)) { var reader = new StreamReader(stream, true); template = reader.ReadToEnd(); } var outputCache = context.GetFeature <IOutputCache>(); if (outputCache != null) { outputCache.Priority = CachePriority.Low; _traceFilter.Trace(context, TraceLevel.Debug, () => GetType().Name + " setting output cache priority " + outputCache.Priority); } } else { _traceFilter.Trace(context, TraceLevel.Information, () => GetType().Name + " returning embedded template response"); template = GetEmbeddedResource("template.html"); } _notFoundCount++; context.Response.StatusCode = 404; context.Response.ReasonPhrase = "Not Found"; return(context.Response.WriteAsync(template)); }
private void EnsureCacheEntries() { if (_cacheEntries == null) { _traceFilter.Trace(_context, TraceLevel.Debug, () => GetType().Name + " retrieving session from cache with category " + _configuration.CacheCategory); _cacheEntries = new Dictionary <string, string>(StringComparer.OrdinalIgnoreCase); var cacheEntries = _cache.Get <Dictionary <string, string> >(SessionId, null, null, _configuration.CacheCategory); if (cacheEntries == null) { _traceFilter.Trace(_context, TraceLevel.Debug, () => GetType().Name + " no session was found in the cache for " + SessionId + " all session variables will have default values"); } else { _traceFilter.Trace(_context, TraceLevel.Debug, () => GetType().Name + " found a session in the cache for " + SessionId + " with " + cacheEntries.Count + " session variables"); foreach (var entry in cacheEntries) { _cacheEntries[entry.Key] = entry.Value; } } } }
public void RemoveVersionNumber(IOwinContext context) { var path = context.Request.Path.Value; var fileNameIndex = path.LastIndexOf('/') + 1; var firstPeriodIndex = path.IndexOf('.', fileNameIndex); var lastPeriodIndex = path.LastIndexOf('.'); var baseFileName = firstPeriodIndex < 0 ? path.Substring(fileNameIndex) : path.Substring(fileNameIndex, firstPeriodIndex - fileNameIndex); var versionIndex = baseFileName.LastIndexOf(_versionPrefix, StringComparison.OrdinalIgnoreCase); if (versionIndex < 0) { return; } var extension = lastPeriodIndex < 0 ? string.Empty : path.Substring(lastPeriodIndex); _traceFilter.Trace(context, TraceLevel.Debug, () => typeof(VersioningMiddleware).Name + " base file name: " + baseFileName + " Ext: " + extension); var allExtensions = _configuration.FileExtensions == null || _configuration.FileExtensions.Length == 0; if (extension.Length > 0) { if (!allExtensions && !_configuration.FileExtensions.Any(e => string.Equals(e, extension, StringComparison.OrdinalIgnoreCase))) { _traceFilter.Trace(context, TraceLevel.Debug, () => typeof(VersioningMiddleware).Name + " the " + extension + " extension is not configured for versioning"); return; } } else { if (!allExtensions) { _traceFilter.Trace(context, TraceLevel.Debug, () => typeof(VersioningMiddleware).Name + " not configured to version extensionless paths"); return; } } _traceFilter.Trace(context, TraceLevel.Information, () => typeof(VersioningMiddleware).Name + " stripping version number from " + baseFileName); IsVersioned = true; if (_configuration.ExactVersion && _configuration.Version.HasValue) { var version = _versionPrefix + _configuration.Version.Value; var requestedVersion = baseFileName.Substring(versionIndex); if (!string.Equals(requestedVersion, version, StringComparison.OrdinalIgnoreCase)) { throw new HttpException(404, "This is not the current version of this resource"); } } context.Request.Path = new PathString( path.Substring(0, fileNameIndex + versionIndex) + path.Substring(firstPeriodIndex)); }
public void Should_supress_debug_trace_by_default(TraceLevel level, string message, int expected) { _traceFilter.Trace(null, level, () => message); Assert.AreEqual(expected, _traceMessages.Count); }