Example #1
0
            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());
            }
Example #2
0
        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));
            }
        }
Example #3
0
        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;
                        }
                    }
                }
            }
Example #6
0
            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);
 }