File: src\Servers\IIS\IIS\test\testassets\shared\WebSockets\TestStartup.cs
Web Access
Project: src\src\Servers\IIS\IIS\test\testassets\InProcessWebSite\InProcessWebSite.csproj (InProcessWebSite)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
 
namespace Microsoft.AspNetCore.IISIntegration.FunctionalTests;
 
public static class TestStartup
{
    public static void Register(IApplicationBuilder app, object startup)
    {
        var delegates = new Dictionary<string, RequestDelegate>();
 
        var type = startup.GetType();
        foreach (var method in type.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance))
        {
            var parameters = method.GetParameters();
            if (method.Name != "Configure" &&
                parameters.Length == 1)
            {
                RequestDelegate appfunc = null;
 
                if (parameters[0].ParameterType == typeof(IApplicationBuilder))
                {
                    var innerAppBuilder = app.New();
                    method.Invoke(startup, new[] { innerAppBuilder });
                    appfunc = innerAppBuilder.Build();
                }
                else if (parameters[0].ParameterType == typeof(HttpContext))
                {
                    appfunc = context => (Task)method.Invoke(startup, new[] { context });
                }
 
                if (appfunc == null)
                {
                    continue;
                }
 
                delegates.Add("/" + method.Name, appfunc);
            }
        }
 
        app.Run(async context =>
        {
            foreach (var requestDelegate in delegates)
            {
                if (context.Request.Path.StartsWithSegments(requestDelegate.Key, out var matchedPath, out var remainingPath))
                {
                    var pathBase = context.Request.PathBase;
                    context.Request.PathBase = pathBase.Add(matchedPath);
                    context.Request.Path = remainingPath;
                    await requestDelegate.Value(context);
                }
            }
        });
    }
}