Full Code of ThreeMammals/Ocelot for AI

develop 9acc27195c18 cached
1039 files
4.0 MB
1.1M tokens
5162 symbols
1 requests
Download .txt
Showing preview only (4,399K chars total). Download the full file or copy to clipboard to get everything.
Repository: ThreeMammals/Ocelot
Branch: develop
Commit: 9acc27195c18
Files: 1039
Total size: 4.0 MB

Directory structure:
gitextract_iih378bx/

├── .config/
│   └── dotnet-tools.json
├── .dockerignore
├── .editorconfig
├── .gitattributes
├── .github/
│   ├── CODE_OF_CONDUCT.md
│   ├── CONTRIBUTING.md
│   ├── ISSUE_TEMPLATE.md
│   ├── PULL_REQUEST_TEMPLATE.md
│   ├── steps/
│   │   ├── check-dotnet.sh
│   │   ├── macos.add-dns-records.sh
│   │   ├── macos.install-certificate.sh
│   │   ├── prepare-coveralls.sh
│   │   ├── ubuntu.add-dns-records.sh
│   │   ├── ubuntu.install-certificate.sh
│   │   ├── windows.add-dns-records.ps1
│   │   └── windows.install-certificate.ps1
│   └── workflows/
│       ├── develop.yml
│       ├── pr-closed.yml
│       ├── pr.yml
│       └── release.yml
├── .gitignore
├── .readthedocs.yaml
├── GitVersion.yml
├── LICENSE.md
├── Ocelot.Samples.sln
├── Ocelot.Samples.slnx
├── Ocelot.sln
├── Ocelot.slnx
├── README.md
├── ReleaseNotes.md
├── build.cake
├── codeanalysis.ruleset
├── codecov.yml
├── coverlet.runsettings
├── docker/
│   ├── Dockerfile.base
│   ├── Dockerfile.build
│   ├── Dockerfile.release
│   ├── Dockerfile.windows
│   ├── README.md
│   ├── build-windows.sh
│   ├── build.sh
│   └── outdated/
│       ├── Dockerfile.8.21.0.base
│       └── Dockerfile.8.23.2.base
├── docs/
│   ├── Makefile
│   ├── _static/
│   │   └── overrides.css
│   ├── building/
│   │   ├── building.rst
│   │   ├── devprocess.rst
│   │   └── releaseprocess.rst
│   ├── conf.py
│   ├── features/
│   │   ├── administration.rst
│   │   ├── aggregation.rst
│   │   ├── authentication.rst
│   │   ├── authorization.rst
│   │   ├── caching.rst
│   │   ├── claimstransformation.rst
│   │   ├── configuration.rst
│   │   ├── delegatinghandlers.rst
│   │   ├── dependencyinjection.rst
│   │   ├── errorcodes.rst
│   │   ├── graphql.rst
│   │   ├── headerstransformation.rst
│   │   ├── kubernetes.rst
│   │   ├── loadbalancer.rst
│   │   ├── logging.rst
│   │   ├── metadata.rst
│   │   ├── methodtransformation.rst
│   │   ├── middlewareinjection.rst
│   │   ├── qualityofservice.rst
│   │   ├── ratelimiting.rst
│   │   ├── routing.rst
│   │   ├── servicediscovery.rst
│   │   ├── servicefabric.rst
│   │   ├── tracing.rst
│   │   └── websockets.rst
│   ├── index.rst
│   ├── introduction/
│   │   ├── bigpicture.rst
│   │   ├── gettingstarted.rst
│   │   ├── gotchas.rst
│   │   └── notsupported.rst
│   ├── make.bat
│   ├── make.ps1
│   ├── make.sh
│   ├── readme.md
│   ├── releasenotes.rst
│   └── requirements.txt
├── postman/
│   └── ocelot.postman_collection.json
├── samples/
│   ├── Basic/
│   │   ├── API.http
│   │   ├── Ocelot.Samples.Basic.csproj
│   │   ├── Program.cs
│   │   ├── Properties/
│   │   │   └── launchSettings.json
│   │   ├── appsettings.Development.json
│   │   ├── appsettings.json
│   │   ├── ocelot.json
│   │   └── packages.lock.json
│   ├── Configuration/
│   │   ├── API.http
│   │   ├── Ocelot.Samples.Configuration.csproj
│   │   ├── Program.cs
│   │   ├── Properties/
│   │   │   └── launchSettings.json
│   │   ├── appsettings.Development.json
│   │   ├── appsettings.json
│   │   ├── ocelot-configuration/
│   │   │   ├── ocelot.docs.json
│   │   │   ├── ocelot.global.json
│   │   │   ├── ocelot.posts.json
│   │   │   └── ocelot.weather.json
│   │   └── packages.lock.json
│   ├── Eureka/
│   │   ├── ApiGateway/
│   │   │   ├── Ocelot.Samples.Eureka.ApiGateway.csproj
│   │   │   ├── Program.cs
│   │   │   ├── Properties/
│   │   │   │   └── launchSettings.json
│   │   │   ├── appsettings.json
│   │   │   ├── ocelot.json
│   │   │   └── packages.lock.json
│   │   ├── DownstreamService/
│   │   │   ├── Controllers/
│   │   │   │   └── CategoryController.cs
│   │   │   ├── Ocelot.Samples.Eureka.DownstreamService.csproj
│   │   │   ├── Program.cs
│   │   │   ├── Properties/
│   │   │   │   └── launchSettings.json
│   │   │   ├── appsettings.Development.json
│   │   │   ├── appsettings.json
│   │   │   └── packages.lock.json
│   │   ├── OcelotEureka.sln
│   │   └── README.md
│   ├── GraphQL/
│   │   ├── GraphQlDelegatingHandler.cs
│   │   ├── Models/
│   │   │   ├── Hero.cs
│   │   │   └── Query.cs
│   │   ├── Ocelot.Samples.GraphQL.csproj
│   │   ├── OcelotGraphQL.sln
│   │   ├── Program.cs
│   │   ├── Properties/
│   │   │   └── launchSettings.json
│   │   ├── README.md
│   │   ├── ocelot.json
│   │   └── packages.lock.json
│   ├── Kubernetes/
│   │   ├── .dockerignore
│   │   ├── ApiGateway/
│   │   │   ├── Dockerfile
│   │   │   ├── Ocelot.Samples.Kubernetes.ApiGateway.csproj
│   │   │   ├── Program.cs
│   │   │   ├── Properties/
│   │   │   │   └── launchSettings.json
│   │   │   ├── appsettings.Development.json
│   │   │   ├── appsettings.json
│   │   │   ├── ocelot.json
│   │   │   └── packages.lock.json
│   │   ├── Dockerfile
│   │   ├── DownstreamService/
│   │   │   ├── Controllers/
│   │   │   │   ├── ValuesController.cs
│   │   │   │   └── WeatherForecastController.cs
│   │   │   ├── Dockerfile
│   │   │   ├── Models/
│   │   │   │   └── WeatherForecast.cs
│   │   │   ├── Ocelot.Samples.Kubernetes.DownstreamService.csproj
│   │   │   ├── Program.cs
│   │   │   ├── Properties/
│   │   │   │   └── launchSettings.json
│   │   │   ├── appsettings.Development.json
│   │   │   ├── appsettings.json
│   │   │   └── packages.lock.json
│   │   └── OcelotKube.sln
│   ├── Metadata/
│   │   ├── API.http
│   │   ├── MetadataResponder.cs
│   │   ├── Models/
│   │   │   ├── PostsPlugin2.cs
│   │   │   ├── TestDeflateResponse.cs
│   │   │   ├── TestGZipResponse.cs
│   │   │   ├── WeatherCurrent.cs
│   │   │   ├── WeatherCurrentCondition.cs
│   │   │   ├── WeatherLocation.cs
│   │   │   └── WeatherResponse.cs
│   │   ├── MyMiddlewares.cs
│   │   ├── Ocelot.Samples.Metadata.csproj
│   │   ├── Program.cs
│   │   ├── Properties/
│   │   │   └── launchSettings.json
│   │   ├── appsettings.Development.json
│   │   ├── appsettings.json
│   │   ├── ocelot.json
│   │   └── packages.lock.json
│   ├── OpenTracing/
│   │   ├── Ocelot.Samples.OpenTracing.csproj
│   │   ├── Program.cs
│   │   ├── Properties/
│   │   │   └── launchSettings.json
│   │   ├── appsettings.Development.json
│   │   ├── appsettings.json
│   │   ├── ocelot.json
│   │   └── packages.lock.json
│   ├── ServiceDiscovery/
│   │   ├── .dockerignore
│   │   ├── ApiGateway/
│   │   │   ├── Ocelot.Samples.ServiceDiscovery.ApiGateway.csproj
│   │   │   ├── Program.cs
│   │   │   ├── Properties/
│   │   │   │   └── launchSettings.json
│   │   │   ├── ServiceDiscovery/
│   │   │   │   ├── MyServiceDiscoveryProvider.cs
│   │   │   │   └── MyServiceDiscoveryProviderFactory.cs
│   │   │   ├── appsettings.Development.json
│   │   │   ├── appsettings.json
│   │   │   ├── ocelot.json
│   │   │   └── packages.lock.json
│   │   ├── DownstreamService/
│   │   │   ├── Controllers/
│   │   │   │   ├── CategoriesController.cs
│   │   │   │   ├── HealthController.cs
│   │   │   │   └── WeatherForecastController.cs
│   │   │   ├── Models/
│   │   │   │   ├── HealthResult.cs
│   │   │   │   ├── MicroserviceResult.cs
│   │   │   │   ├── ReadyResult.cs
│   │   │   │   └── WeatherForecast.cs
│   │   │   ├── Ocelot.Samples.ServiceDiscovery.DownstreamService.csproj
│   │   │   ├── Program.cs
│   │   │   ├── Properties/
│   │   │   │   └── launchSettings.json
│   │   │   ├── appsettings.Development.json
│   │   │   ├── appsettings.json
│   │   │   └── packages.lock.json
│   │   ├── Ocelot.Samples.ServiceDiscovery.sln
│   │   └── README.md
│   ├── ServiceFabric/
│   │   ├── .gitignore
│   │   ├── ApiGateway/
│   │   │   ├── Ocelot.Samples.ServiceFabric.ApiGateway.csproj
│   │   │   ├── OcelotApplicationApiGateway.cs
│   │   │   ├── Program.cs
│   │   │   ├── Properties/
│   │   │   │   └── launchSettings.json
│   │   │   ├── ServiceEventListener.cs
│   │   │   ├── ServiceEventSource.cs
│   │   │   ├── WebCommunicationListener.cs
│   │   │   ├── appsettings.Development.json
│   │   │   ├── appsettings.json
│   │   │   ├── ocelot.json
│   │   │   └── packages.lock.json
│   │   ├── CONTRIBUTING.md
│   │   ├── DownstreamService/
│   │   │   ├── ApiGateway.cs
│   │   │   ├── Controllers/
│   │   │   │   └── ValuesController.cs
│   │   │   ├── Ocelot.Samples.ServiceFabric.DownstreamService.csproj
│   │   │   ├── Program.cs
│   │   │   ├── Properties/
│   │   │   │   └── launchSettings.json
│   │   │   ├── ServiceEventSource.cs
│   │   │   └── packages.lock.json
│   │   ├── LICENSE.md
│   │   ├── Ocelot.Samples.ServiceFabric.sln
│   │   ├── OcelotApplication/
│   │   │   ├── ApplicationManifest.xml
│   │   │   ├── OcelotApplicationApiGatewayPkg/
│   │   │   │   ├── Code/
│   │   │   │   │   ├── entryPoint.cmd
│   │   │   │   │   └── entryPoint.sh
│   │   │   │   ├── Config/
│   │   │   │   │   ├── Settings.xml
│   │   │   │   │   └── _readme.txt
│   │   │   │   ├── Data/
│   │   │   │   │   └── _readme.txt
│   │   │   │   ├── ServiceManifest-Linux.xml
│   │   │   │   ├── ServiceManifest-Windows.xml
│   │   │   │   └── ServiceManifest.xml
│   │   │   └── OcelotApplicationServicePkg/
│   │   │       ├── Code/
│   │   │       │   ├── entryPoint.cmd
│   │   │       │   └── entryPoint.sh
│   │   │       ├── Config/
│   │   │       │   ├── Settings.xml
│   │   │       │   └── _readme.txt
│   │   │       ├── Data/
│   │   │       │   └── _readme.txt
│   │   │       ├── ServiceManifest-Linux.xml
│   │   │       ├── ServiceManifest-Windows.xml
│   │   │       └── ServiceManifest.xml
│   │   ├── README.md
│   │   ├── build.bat
│   │   ├── build.sh
│   │   ├── dotnet-include.sh
│   │   ├── install.ps1
│   │   ├── install.sh
│   │   ├── uninstall.ps1
│   │   └── uninstall.sh
│   └── Web/
│       ├── DownstreamHostBuilder.cs
│       ├── Ocelot.Samples.Web.csproj
│       ├── OcelotHostBuilder.cs
│       ├── Properties/
│       │   └── launchSettings.json
│       └── packages.lock.json
├── src/
│   ├── Ocelot/
│   │   ├── Administration/
│   │   │   ├── AdministrationPath.cs
│   │   │   ├── FileConfigurationController.cs
│   │   │   ├── IAdministrationPath.cs
│   │   │   └── OutputCacheController.cs
│   │   ├── Authentication/
│   │   │   └── AuthenticationMiddleware.cs
│   │   ├── Authorization/
│   │   │   ├── AuthorizationMiddleware.cs
│   │   │   ├── ClaimValueNotAuthorizedError.cs
│   │   │   ├── ClaimsAuthorizer.cs
│   │   │   ├── IClaimsAuthorizer.cs
│   │   │   ├── IScopesAuthorizer.cs
│   │   │   ├── ScopeNotAuthorizedError.cs
│   │   │   ├── ScopesAuthorizer.cs
│   │   │   ├── UnauthorizedError.cs
│   │   │   └── UserDoesNotHaveClaimError.cs
│   │   ├── Cache/
│   │   │   ├── CachedResponse.cs
│   │   │   ├── DefaultCacheKeyGenerator.cs
│   │   │   ├── DefaultMemoryCache.cs
│   │   │   ├── ICacheKeyGenerator.cs
│   │   │   ├── IOcelotCache.cs
│   │   │   ├── MD5Helper.cs
│   │   │   └── OutputCacheMiddleware.cs
│   │   ├── Claims/
│   │   │   ├── AddClaimsToRequest.cs
│   │   │   ├── IAddClaimsToRequest.cs
│   │   │   └── Middleware/
│   │   │       └── ClaimsToClaimsMiddleware.cs
│   │   ├── Configuration/
│   │   │   ├── AuthenticationOptions.cs
│   │   │   ├── Builder/
│   │   │   │   ├── DownstreamRouteBuilder.cs
│   │   │   │   ├── MetadataOptionsBuilder.cs
│   │   │   │   ├── ServiceProviderConfigurationBuilder.cs
│   │   │   │   └── UpstreamPathTemplateBuilder.cs
│   │   │   ├── CacheOptions.cs
│   │   │   ├── ChangeTracking/
│   │   │   │   ├── IOcelotConfigurationChangeTokenSource.cs
│   │   │   │   ├── OcelotConfigurationChangeToken.cs
│   │   │   │   ├── OcelotConfigurationChangeTokenSource.cs
│   │   │   │   └── OcelotConfigurationMonitor.cs
│   │   │   ├── ClaimToThing.cs
│   │   │   ├── Creator/
│   │   │   │   ├── AddHeader.cs
│   │   │   │   ├── AggregatesCreator.cs
│   │   │   │   ├── AuthenticationOptionsCreator.cs
│   │   │   │   ├── CacheOptionsCreator.cs
│   │   │   │   ├── ClaimsToThingCreator.cs
│   │   │   │   ├── ConfigurationCreator.cs
│   │   │   │   ├── DefaultMetadataCreator.cs
│   │   │   │   ├── DownstreamAddressesCreator.cs
│   │   │   │   ├── DynamicRoutesCreator.cs
│   │   │   │   ├── FileInternalConfigurationCreator.cs
│   │   │   │   ├── HeaderFindAndReplaceCreator.cs
│   │   │   │   ├── HeaderTransformations.cs
│   │   │   │   ├── HttpHandlerOptionsCreator.cs
│   │   │   │   ├── HttpVersionCreator.cs
│   │   │   │   ├── HttpVersionPolicyCreator.cs
│   │   │   │   ├── IAggregatesCreator.cs
│   │   │   │   ├── IAuthenticationOptionsCreator.cs
│   │   │   │   ├── ICacheOptionsCreator.cs
│   │   │   │   ├── IClaimsToThingCreator.cs
│   │   │   │   ├── IConfigurationCreator.cs
│   │   │   │   ├── IDownstreamAddressesCreator.cs
│   │   │   │   ├── IDynamicsCreator.cs
│   │   │   │   ├── IHeaderFindAndReplaceCreator.cs
│   │   │   │   ├── IHttpHandlerOptionsCreator.cs
│   │   │   │   ├── IInternalConfigurationCreator.cs
│   │   │   │   ├── ILoadBalancerOptionsCreator.cs
│   │   │   │   ├── IMetadataCreator.cs
│   │   │   │   ├── IQoSOptionsCreator.cs
│   │   │   │   ├── IRateLimitOptionsCreator.cs
│   │   │   │   ├── IRequestIdKeyCreator.cs
│   │   │   │   ├── IRouteKeyCreator.cs
│   │   │   │   ├── IRoutesCreator.cs
│   │   │   │   ├── ISecurityOptionsCreator.cs
│   │   │   │   ├── IServiceProviderConfigurationCreator.cs
│   │   │   │   ├── IUpstreamHeaderTemplatePatternCreator.cs
│   │   │   │   ├── IUpstreamTemplatePatternCreator.cs
│   │   │   │   ├── IVersionCreator.cs
│   │   │   │   ├── IVersionPolicyCreator.cs
│   │   │   │   ├── LoadBalancerOptionsCreator.cs
│   │   │   │   ├── QoSOptionsCreator.cs
│   │   │   │   ├── RateLimitOptionsCreator.cs
│   │   │   │   ├── RequestIdKeyCreator.cs
│   │   │   │   ├── RouteKeyCreator.cs
│   │   │   │   ├── SecurityOptionsCreator.cs
│   │   │   │   ├── ServiceProviderConfigurationCreator.cs
│   │   │   │   ├── StaticRoutesCreator.cs
│   │   │   │   ├── UpstreamHeaderTemplatePatternCreator.cs
│   │   │   │   ├── UpstreamTemplatePatternCreator.cs
│   │   │   │   └── VersionPolicies.cs
│   │   │   ├── DownstreamHostAndPort.cs
│   │   │   ├── DownstreamRoute.cs
│   │   │   ├── File/
│   │   │   │   ├── AggregateRouteConfig.cs
│   │   │   │   ├── FileAggregateRoute.cs
│   │   │   │   ├── FileAuthenticationOptions.cs
│   │   │   │   ├── FileCacheOptions.cs
│   │   │   │   ├── FileConfiguration.cs
│   │   │   │   ├── FileDynamicRoute.cs
│   │   │   │   ├── FileGlobalAuthenticationOptions.cs
│   │   │   │   ├── FileGlobalCacheOptions.cs
│   │   │   │   ├── FileGlobalConfiguration.cs
│   │   │   │   ├── FileGlobalHttpHandlerOptions.cs
│   │   │   │   ├── FileGlobalLoadBalancerOptions.cs
│   │   │   │   ├── FileGlobalQoSOptions.cs
│   │   │   │   ├── FileGlobalRateLimit.cs
│   │   │   │   ├── FileGlobalRateLimitByAspNetRule.cs
│   │   │   │   ├── FileGlobalRateLimitByHeaderRule.cs
│   │   │   │   ├── FileGlobalRateLimitByIpRule.cs
│   │   │   │   ├── FileGlobalRateLimitByMethodRule.cs
│   │   │   │   ├── FileGlobalRateLimiting.cs
│   │   │   │   ├── FileHostAndPort.cs
│   │   │   │   ├── FileHttpHandlerOptions.cs
│   │   │   │   ├── FileLoadBalancerOptions.cs
│   │   │   │   ├── FileMetadataOptions.cs
│   │   │   │   ├── FileQoSOptions.cs
│   │   │   │   ├── FileRateLimitByAspNetRule.cs
│   │   │   │   ├── FileRateLimitByHeaderRule.cs
│   │   │   │   ├── FileRateLimitByIpRule.cs
│   │   │   │   ├── FileRateLimitByMethodRule.cs
│   │   │   │   ├── FileRateLimitRule.cs
│   │   │   │   ├── FileRateLimiting.cs
│   │   │   │   ├── FileRoute.cs
│   │   │   │   ├── FileRouteBase.cs
│   │   │   │   ├── FileSecurityOptions.cs
│   │   │   │   ├── FileServiceDiscoveryProvider.cs
│   │   │   │   ├── IRouteGroup.cs
│   │   │   │   ├── IRouteGrouping.cs
│   │   │   │   ├── IRouteRateLimiting.cs
│   │   │   │   └── IRouteUpstream.cs
│   │   │   ├── HeaderFindAndReplace.cs
│   │   │   ├── HttpHandlerOptions.cs
│   │   │   ├── IInternalConfiguration.cs
│   │   │   ├── InternalConfiguration.cs
│   │   │   ├── LoadBalancerOptions.cs
│   │   │   ├── MetadataOptions.cs
│   │   │   ├── Parser/
│   │   │   │   ├── ClaimToThingConfigurationParser.cs
│   │   │   │   ├── IClaimToThingConfigurationParser.cs
│   │   │   │   ├── InstructionNotForClaimsError.cs
│   │   │   │   ├── NoInstructionsError.cs
│   │   │   │   └── ParsingConfigurationHeaderError.cs
│   │   │   ├── QoSOptions.cs
│   │   │   ├── RateLimitOptions.cs
│   │   │   ├── RateLimitRule.cs
│   │   │   ├── Repository/
│   │   │   │   ├── ConsulFileConfigurationPollerOption.cs
│   │   │   │   ├── DiskFileConfigurationRepository.cs
│   │   │   │   ├── FileConfigurationPoller.cs
│   │   │   │   ├── IFileConfigurationPollerOptions.cs
│   │   │   │   ├── IFileConfigurationRepository.cs
│   │   │   │   ├── IInternalConfigurationRepository.cs
│   │   │   │   ├── InMemoryFileConfigurationPollerOptions.cs
│   │   │   │   └── InMemoryInternalConfigurationRepository.cs
│   │   │   ├── Route.cs
│   │   │   ├── SecurityOptions.cs
│   │   │   ├── ServiceProviderConfiguration.cs
│   │   │   ├── Setter/
│   │   │   │   ├── FileAndInternalConfigurationSetter.cs
│   │   │   │   └── IFileConfigurationSetter.cs
│   │   │   └── Validator/
│   │   │       ├── ConfigurationValidationResult.cs
│   │   │       ├── FileAuthenticationOptionsValidator.cs
│   │   │       ├── FileConfigurationFluentValidator.cs
│   │   │       ├── FileGlobalConfigurationFluentValidator.cs
│   │   │       ├── FileQoSOptionsFluentValidator.cs
│   │   │       ├── FileValidationFailedError.cs
│   │   │       ├── HostAndPortValidator.cs
│   │   │       ├── IConfigurationValidator.cs
│   │   │       └── RouteFluentValidator.cs
│   │   ├── DependencyInjection/
│   │   │   ├── ConfigurationBuilderExtensions.cs
│   │   │   ├── Features.cs
│   │   │   ├── IOcelotBuilder.cs
│   │   │   ├── MergeOcelotJson.cs
│   │   │   ├── OcelotBuilder.cs
│   │   │   └── ServiceCollectionExtensions.cs
│   │   ├── DownstreamPathManipulation/
│   │   │   ├── ChangeDownstreamPathTemplate.cs
│   │   │   ├── IChangeDownstreamPathTemplate.cs
│   │   │   └── Middleware/
│   │   │       └── ClaimsToDownstreamPathMiddleware.cs
│   │   ├── DownstreamRouteFinder/
│   │   │   ├── DownstreamRouteHolder.cs
│   │   │   ├── Finder/
│   │   │   │   ├── DiscoveryDownstreamRouteFinder.cs
│   │   │   │   ├── DownstreamRouteFinder.cs
│   │   │   │   ├── DownstreamRouteProviderFactory.cs
│   │   │   │   ├── IDownstreamRouteProvider.cs
│   │   │   │   ├── IDownstreamRouteProviderFactory.cs
│   │   │   │   └── UnableToFindDownstreamRouteError.cs
│   │   │   ├── HeaderMatcher/
│   │   │   │   ├── HeaderPlaceholderNameAndValueFinder.cs
│   │   │   │   ├── HeadersToHeaderTemplatesMatcher.cs
│   │   │   │   ├── IHeaderPlaceholderNameAndValueFinder.cs
│   │   │   │   └── IHeadersToHeaderTemplatesMatcher.cs
│   │   │   ├── Middleware/
│   │   │   │   └── DownstreamRouteFinderMiddleware.cs
│   │   │   └── UrlMatcher/
│   │   │       ├── IPlaceholderNameAndValueFinder.cs
│   │   │       ├── IUrlPathToUrlTemplateMatcher.cs
│   │   │       ├── PlaceholderNameAndValue.cs
│   │   │       ├── RegExUrlMatcher.cs
│   │   │       ├── UrlMatch.cs
│   │   │       └── UrlPathPlaceholderNameAndValueFinder.cs
│   │   ├── DownstreamUrlCreator/
│   │   │   ├── DownstreamPathPlaceholderReplacer.cs
│   │   │   ├── DownstreamUrlCreatorMiddleware.cs
│   │   │   └── IDownstreamPathPlaceholderReplacer.cs
│   │   ├── Errors/
│   │   │   ├── Error.cs
│   │   │   ├── Middleware/
│   │   │   │   └── ExceptionHandlerMiddleware.cs
│   │   │   ├── OcelotErrorCode.cs
│   │   │   └── RequestTimedOutError.cs
│   │   ├── Headers/
│   │   │   ├── AddHeadersToRequest.cs
│   │   │   ├── AddHeadersToResponse.cs
│   │   │   ├── HttpContextRequestHeaderReplacer.cs
│   │   │   ├── HttpResponseHeaderReplacer.cs
│   │   │   ├── IAddHeadersToRequest.cs
│   │   │   ├── IAddHeadersToResponse.cs
│   │   │   ├── IHttpContextRequestHeaderReplacer.cs
│   │   │   ├── IHttpResponseHeaderReplacer.cs
│   │   │   ├── IRemoveOutputHeaders.cs
│   │   │   ├── Middleware/
│   │   │   │   ├── ClaimsToHeadersMiddleware.cs
│   │   │   │   └── HttpHeadersTransformationMiddleware.cs
│   │   │   └── RemoveOutputHeaders.cs
│   │   ├── Infrastructure/
│   │   │   ├── CannotAddPlaceholderError.cs
│   │   │   ├── CannotRemovePlaceholderError.cs
│   │   │   ├── Claims/
│   │   │   │   ├── CannotFindClaimError.cs
│   │   │   │   ├── ClaimsParser.cs
│   │   │   │   └── IClaimsParser.cs
│   │   │   ├── ConfigAwarePlaceholders.cs
│   │   │   ├── CouldNotFindPlaceholderError.cs
│   │   │   ├── DelayedMessage.cs
│   │   │   ├── DesignPatterns/
│   │   │   │   └── Retry.cs
│   │   │   ├── Extensions/
│   │   │   │   ├── ErrorListExtensions.cs
│   │   │   │   ├── HttpContextExtensions.cs
│   │   │   │   ├── HttpRequestExtensions.cs
│   │   │   │   ├── IEnumerableExtensions.cs
│   │   │   │   ├── Int32Extensions.cs
│   │   │   │   ├── StringBuilderExtensions.cs
│   │   │   │   └── StringExtensions.cs
│   │   │   ├── FrameworkDescription.cs
│   │   │   ├── IBus.cs
│   │   │   ├── IFrameworkDescription.cs
│   │   │   ├── IPlaceholders.cs
│   │   │   ├── InMemoryBus.cs
│   │   │   ├── Placeholders.cs
│   │   │   ├── RegexGlobal.cs
│   │   │   └── RequestData/
│   │   │       ├── CannotAddDataError.cs
│   │   │       ├── CannotFindDataError.cs
│   │   │       ├── HttpDataRepository.cs
│   │   │       └── IRequestScopedDataRepository.cs
│   │   ├── LoadBalancer/
│   │   │   ├── Balancers/
│   │   │   │   ├── CookieStickySessions.cs
│   │   │   │   ├── LeastConnection.cs
│   │   │   │   ├── NoLoadBalancer.cs
│   │   │   │   └── RoundRobin.cs
│   │   │   ├── Creators/
│   │   │   │   ├── CookieStickySessionsCreator.cs
│   │   │   │   ├── DelegateInvokingLoadBalancerCreator.cs
│   │   │   │   ├── LeastConnectionCreator.cs
│   │   │   │   ├── NoLoadBalancerCreator.cs
│   │   │   │   └── RoundRobinCreator.cs
│   │   │   ├── Errors/
│   │   │   │   ├── CouldNotFindLoadBalancerCreatorError.cs
│   │   │   │   ├── InvokingLoadBalancerCreatorError.cs
│   │   │   │   ├── ServicesAreEmptyError.cs
│   │   │   │   ├── ServicesAreNullError.cs
│   │   │   │   └── UnableToFindLoadBalancerError.cs
│   │   │   ├── Interfaces/
│   │   │   │   ├── ILoadBalancer.cs
│   │   │   │   ├── ILoadBalancerCreator.cs
│   │   │   │   ├── ILoadBalancerFactory.cs
│   │   │   │   └── ILoadBalancerHouse.cs
│   │   │   ├── Lease.cs
│   │   │   ├── LeaseEventArgs.cs
│   │   │   ├── LoadBalancerFactory.cs
│   │   │   ├── LoadBalancerHouse.cs
│   │   │   ├── LoadBalancingMiddleware.cs
│   │   │   └── StickySession.cs
│   │   ├── Logging/
│   │   │   ├── IOcelotLogger.cs
│   │   │   ├── IOcelotLoggerFactory.cs
│   │   │   ├── IOcelotTracer.cs
│   │   │   ├── ITracingHandler.cs
│   │   │   ├── ITracingHandlerFactory.cs
│   │   │   ├── OcelotDiagnosticListener.cs
│   │   │   ├── OcelotHttpTracingHandler.cs
│   │   │   ├── OcelotLogger.cs
│   │   │   ├── OcelotLoggerFactory.cs
│   │   │   └── TracingHandlerFactory.cs
│   │   ├── Metadata/
│   │   │   └── DownstreamRouteExtensions.cs
│   │   ├── Middleware/
│   │   │   ├── BaseUrlFinder.cs
│   │   │   ├── ConfigurationMiddleware.cs
│   │   │   ├── DownstreamResponse.cs
│   │   │   ├── Header.cs
│   │   │   ├── HttpItemsExtensions.cs
│   │   │   ├── IBaseUrlFinder.cs
│   │   │   ├── OcelotMiddleware.cs
│   │   │   ├── OcelotMiddlewareConfigurationDelegate.cs
│   │   │   ├── OcelotMiddlewareExtensions.cs
│   │   │   ├── OcelotPipelineConfiguration.cs
│   │   │   ├── OcelotPipelineExtensions.cs
│   │   │   └── UnauthenticatedError.cs
│   │   ├── Multiplexer/
│   │   │   ├── CouldNotFindAggregatorError.cs
│   │   │   ├── IDefinedAggregator.cs
│   │   │   ├── IDefinedAggregatorProvider.cs
│   │   │   ├── IResponseAggregator.cs
│   │   │   ├── IResponseAggregatorFactory.cs
│   │   │   ├── InMemoryResponseAggregatorFactory.cs
│   │   │   ├── MultiplexingMiddleware.cs
│   │   │   ├── ServiceLocatorDefinedAggregatorProvider.cs
│   │   │   ├── SimpleJsonResponseAggregator.cs
│   │   │   └── UserDefinedResponseAggregator.cs
│   │   ├── Ocelot.csproj
│   │   ├── QualityOfService/
│   │   │   ├── IQosFactory.cs
│   │   │   ├── NoQosDelegatingHandler.cs
│   │   │   ├── QosDelegatingHandlerDelegate.cs
│   │   │   ├── QosFactory.cs
│   │   │   └── UnableToFindQoSProviderError.cs
│   │   ├── QueryStrings/
│   │   │   ├── AddQueriesToRequest.cs
│   │   │   ├── ClaimsToQueryStringMiddleware.cs
│   │   │   └── IAddQueriesToRequest.cs
│   │   ├── RateLimiting/
│   │   │   ├── ClientRequestIdentity.cs
│   │   │   ├── DistributedCacheRateLimitStorage.cs
│   │   │   ├── IRateLimitStorage.cs
│   │   │   ├── IRateLimiting.cs
│   │   │   ├── MemoryCacheRateLimitStorage.cs
│   │   │   ├── QuotaExceededError.cs
│   │   │   ├── RateLimitCounter.cs
│   │   │   ├── RateLimitHeaders.cs
│   │   │   ├── RateLimiting.cs
│   │   │   ├── RateLimitingHeaders.cs
│   │   │   └── RateLimitingMiddleware.cs
│   │   ├── Request/
│   │   │   ├── Creator/
│   │   │   │   ├── DownstreamRequestCreator.cs
│   │   │   │   └── IDownstreamRequestCreator.cs
│   │   │   ├── Mapper/
│   │   │   │   ├── IRequestMapper.cs
│   │   │   │   ├── PayloadTooLargeError.cs
│   │   │   │   ├── RequestMapper.cs
│   │   │   │   ├── StreamHttpContent.cs
│   │   │   │   └── UnmappableRequestError.cs
│   │   │   └── Middleware/
│   │   │       ├── DownstreamRequest.cs
│   │   │       └── DownstreamRequestInitialiserMiddleware.cs
│   │   ├── RequestId/
│   │   │   ├── DefaultRequestIdKey.cs
│   │   │   ├── Middleware/
│   │   │   │   └── RequestIdMiddleware.cs
│   │   │   └── RequestId.cs
│   │   ├── Requester/
│   │   │   ├── ConnectionToDownstreamServiceError.cs
│   │   │   ├── DelegatingHandlerFactory.cs
│   │   │   ├── GlobalDelegatingHandler.cs
│   │   │   ├── HttpExceptionToErrorMapper.cs
│   │   │   ├── IDelegatingHandlerFactory.cs
│   │   │   ├── IExceptionToErrorMapper.cs
│   │   │   ├── IHttpRequester.cs
│   │   │   ├── IMessageInvokerPool.cs
│   │   │   ├── MessageInvokerHttpRequester.cs
│   │   │   ├── MessageInvokerPool.cs
│   │   │   ├── Middleware/
│   │   │   │   └── HttpRequesterMiddleware.cs
│   │   │   ├── RequestCanceledError.cs
│   │   │   ├── ServiceCollectionExtensions.cs
│   │   │   ├── TimeoutDelegatingHandler.cs
│   │   │   └── UnableToCompleteRequestError.cs
│   │   ├── Responder/
│   │   │   ├── ErrorsToHttpStatusCodeMapper.cs
│   │   │   ├── HttpContextResponder.cs
│   │   │   ├── IErrorsToHttpStatusCodeMapper.cs
│   │   │   ├── IHttpResponder.cs
│   │   │   └── Middleware/
│   │   │       └── ResponderMiddleware.cs
│   │   ├── Responses/
│   │   │   ├── ErrorResponse.cs
│   │   │   ├── OkResponse.cs
│   │   │   └── Response.cs
│   │   ├── Security/
│   │   │   ├── IPSecurity/
│   │   │   │   └── IPSecurityPolicy.cs
│   │   │   ├── ISecurityPolicy.cs
│   │   │   └── Middleware/
│   │   │       └── SecurityMiddleware.cs
│   │   ├── ServiceDiscovery/
│   │   │   ├── Configuration/
│   │   │   │   └── ServiceFabricConfiguration.cs
│   │   │   ├── IServiceDiscoveryProviderFactory.cs
│   │   │   ├── Providers/
│   │   │   │   ├── ConfigurationServiceProvider.cs
│   │   │   │   ├── IServiceDiscoveryProvider.cs
│   │   │   │   └── ServiceFabricServiceDiscoveryProvider.cs
│   │   │   ├── ServiceDiscoveryFinderDelegate.cs
│   │   │   ├── ServiceDiscoveryProviderFactory.cs
│   │   │   └── UnableToFindServiceDiscoveryProviderError.cs
│   │   ├── Usings.cs
│   │   ├── Values/
│   │   │   ├── DownstreamPath.cs
│   │   │   ├── DownstreamPathTemplate.cs
│   │   │   ├── Service.cs
│   │   │   ├── ServiceHostAndPort.cs
│   │   │   ├── UpstreamHeaderTemplate.cs
│   │   │   └── UpstreamPathTemplate.cs
│   │   ├── WebSockets/
│   │   │   ├── ClientWebSocketConnector.cs
│   │   │   ├── ClientWebSocketOptionsProxy.cs
│   │   │   ├── ClientWebSocketProxy.cs
│   │   │   ├── IClientWebSocket.cs
│   │   │   ├── IClientWebSocketOptions.cs
│   │   │   ├── IWebSocketsFactory.cs
│   │   │   ├── WebSocketsFactory.cs
│   │   │   └── WebSocketsProxyMiddleware.cs
│   │   └── packages.lock.json
│   ├── Ocelot.Provider.Consul/
│   │   ├── Consul.cs
│   │   ├── ConsulClientFactory.cs
│   │   ├── ConsulFileConfigurationRepository.cs
│   │   ├── ConsulMiddlewareConfigurationProvider.cs
│   │   ├── ConsulProviderFactory.cs
│   │   ├── ConsulRegistryConfiguration.cs
│   │   ├── DefaultConsulServiceBuilder.cs
│   │   ├── Interfaces/
│   │   │   ├── IConsulClientFactory.cs
│   │   │   └── IConsulServiceBuilder.cs
│   │   ├── Ocelot.Provider.Consul.csproj
│   │   ├── OcelotBuilderExtensions.cs
│   │   ├── PollConsul.cs
│   │   ├── UnableToSetConfigInConsulError.cs
│   │   ├── Usings.cs
│   │   └── packages.lock.json
│   ├── Ocelot.Provider.Eureka/
│   │   ├── Eureka.cs
│   │   ├── EurekaMiddlewareConfigurationProvider.cs
│   │   ├── EurekaProviderFactory.cs
│   │   ├── Ocelot.Provider.Eureka.csproj
│   │   ├── OcelotBuilderExtensions.cs
│   │   ├── Usings.cs
│   │   └── packages.lock.json
│   ├── Ocelot.Provider.Kubernetes/
│   │   ├── EndPointClientV1.cs
│   │   ├── Interfaces/
│   │   │   ├── IEndPointClient.cs
│   │   │   ├── IKubeApiClientFactory.cs
│   │   │   ├── IKubeServiceBuilder.cs
│   │   │   └── IKubeServiceCreator.cs
│   │   ├── Kube.cs
│   │   ├── KubeApiClientExtensions.cs
│   │   ├── KubeApiClientFactory.cs
│   │   ├── KubeRegistryConfiguration.cs
│   │   ├── KubeServiceBuilder.cs
│   │   ├── KubeServiceCreator.cs
│   │   ├── KubernetesProviderFactory.cs
│   │   ├── ObservableExtensions.cs
│   │   ├── Ocelot.Provider.Kubernetes.csproj
│   │   ├── OcelotBuilderExtensions.cs
│   │   ├── PollKube.cs
│   │   ├── Usings.cs
│   │   ├── WatchKube.cs
│   │   └── packages.lock.json
│   └── Ocelot.Provider.Polly/
│       ├── CircuitBreakerStrategy.cs
│       ├── Interfaces/
│       │   └── IPollyQoSResiliencePipelineProvider.cs
│       ├── Ocelot.Provider.Polly.csproj
│       ├── OcelotBuilderExtensions.cs
│       ├── OcelotResiliencePipelineKey.cs
│       ├── PollyQoSResiliencePipelineProvider.cs
│       ├── PollyResiliencePipelineDelegatingHandler.cs
│       ├── TimeoutStrategy.cs
│       ├── Usings.cs
│       └── packages.lock.json
├── test/
│   ├── Ocelot.AcceptanceTests/
│   │   ├── .gitignore
│   │   ├── Administration/
│   │   │   ├── AdministrationSteps.cs
│   │   │   ├── CacheManagerTests.cs
│   │   │   └── OcelotBuilderExtensions.cs
│   │   ├── AggregateTests.cs
│   │   ├── Authentication/
│   │   │   ├── AuthenticationTests.cs
│   │   │   └── MultipleAuthSchemesFeatureTests.cs
│   │   ├── Authorization/
│   │   │   ├── AuthorizationSteps.cs
│   │   │   └── AuthorizationTests.cs
│   │   ├── Caching/
│   │   │   └── CachingTests.cs
│   │   ├── CancelRequestTests.cs
│   │   ├── CannotStartOcelotTests.cs
│   │   ├── CaseSensitiveRoutingTests.cs
│   │   ├── ConcurrentSteps.cs
│   │   ├── Configuration/
│   │   │   ├── ConfigurationInConsulTests.cs
│   │   │   ├── ConfigurationMergeTests.cs
│   │   │   ├── ConfigurationReloadTests.cs
│   │   │   ├── DownstreamHttpVersionTests.cs
│   │   │   └── TimeoutTests.cs
│   │   ├── ContentTests.cs
│   │   ├── Core/
│   │   │   ├── LoadTests.cs
│   │   │   └── ThreadSafeHeadersTests.cs
│   │   ├── CustomMiddlewareTests.cs
│   │   ├── DefaultVersionPolicyTests.cs
│   │   ├── GzipTests.cs
│   │   ├── HttpDelegatingHandlersTests.cs
│   │   ├── LoadBalancer/
│   │   │   ├── CookieStickySessionsTests.cs
│   │   │   ├── ILoadBalancerAnalyzer.cs
│   │   │   ├── LeastConnectionAnalyzer.cs
│   │   │   ├── LeastConnectionAnalyzerCreator.cs
│   │   │   ├── LoadBalancerAnalyzer.cs
│   │   │   ├── LoadBalancerTests.cs
│   │   │   ├── RoundRobinAnalyzer.cs
│   │   │   └── RoundRobinAnalyzerCreator.cs
│   │   ├── LogLevelTests.cs
│   │   ├── Logging/
│   │   │   ├── MemoryLogger.cs
│   │   │   └── TestLoggerFactory.cs
│   │   ├── Metadata/
│   │   │   └── DownstreamMetadataTests.cs
│   │   ├── Ocelot.AcceptanceTests.csproj
│   │   ├── Properties/
│   │   │   ├── AssemblyInfo.cs
│   │   │   ├── BddfyConfig.cs
│   │   │   └── GlobalSuppressions.cs
│   │   ├── QualityOfService/
│   │   │   ├── PollyQoSTests.cs
│   │   │   └── QosSteps.cs
│   │   ├── RateLimiting/
│   │   │   ├── ClientHeaderRateLimitingTests.cs
│   │   │   └── RateLimitingSteps.cs
│   │   ├── ReasonPhraseTests.cs
│   │   ├── Request/
│   │   │   ├── RequestMapperTests.cs
│   │   │   └── StreamContentTests.cs
│   │   ├── RequestIdTests.cs
│   │   ├── Requester/
│   │   │   ├── MessageInvokerPoolTests.cs
│   │   │   ├── PayloadTooLargeTests.cs
│   │   │   ├── RequesterSteps.cs
│   │   │   ├── TestMessageInvokerPool.cs
│   │   │   └── TestTracer.cs
│   │   ├── ResponseCodeTests.cs
│   │   ├── ReturnsErrorTests.cs
│   │   ├── Routing/
│   │   │   ├── RoutingBasedOnHeadersTests.cs
│   │   │   ├── RoutingTests.cs
│   │   │   ├── RoutingWithQueryStringTests.cs
│   │   │   └── UpstreamHostTests.cs
│   │   ├── Security/
│   │   │   └── SecurityOptionsTests.cs
│   │   ├── SequentialTests.cs
│   │   ├── ServiceDiscovery/
│   │   │   ├── ConsulAgentServiceExtensions.cs
│   │   │   ├── ConsulConfigurationInConsulTests.cs
│   │   │   ├── ConsulIntegrationTests.cs
│   │   │   ├── ConsulServiceDiscoveryTests.cs
│   │   │   ├── ConsulTwoDownstreamServicesTests.cs
│   │   │   ├── ConsulWebSocketTests.cs
│   │   │   ├── DynamicRoutingTests.cs
│   │   │   ├── EurekaServiceDiscoveryTests.cs
│   │   │   ├── KubeIntegrationTests.cs
│   │   │   ├── KubernetesServiceDiscoveryTests.cs
│   │   │   ├── PollKubeConcurrencyIntegrationTests.cs
│   │   │   ├── PollKubeIntegrationTests.cs
│   │   │   └── ServiceFabricTests.cs
│   │   ├── SslTests.cs
│   │   ├── StartupTests.cs
│   │   ├── Steps.cs
│   │   ├── Transformations/
│   │   │   ├── ClaimsToDownstreamPathTests.cs
│   │   │   ├── ClaimsToHeadersForwardingTests.cs
│   │   │   ├── ClaimsToQueryStringForwardingTests.cs
│   │   │   ├── HeaderTests.cs
│   │   │   └── MethodTests.cs
│   │   ├── Usings.cs
│   │   ├── WebSockets/
│   │   │   ├── ClientWebSocketTests.cs
│   │   │   ├── WebSocketsFactoryTests.cs
│   │   │   └── WebSocketsSteps.cs
│   │   ├── appsettings.json
│   │   ├── appsettings.product.json
│   │   ├── mycert2.crt
│   │   └── packages.lock.json
│   ├── Ocelot.Benchmarks/
│   │   ├── AllTheThingsBenchmarks.cs
│   │   ├── BenchmarkSteps.cs
│   │   ├── DownstreamRouteFinderMiddlewareBenchmarks.cs
│   │   ├── ExceptionHandlerMiddlewareBenchmarks.cs
│   │   ├── MsLoggerBenchmarks.cs
│   │   ├── Ocelot.Benchmarks.csproj
│   │   ├── PayloadBenchmarks.cs
│   │   ├── Program.cs
│   │   ├── Properties/
│   │   │   └── AssemblyInfo.cs
│   │   ├── ResponseBenchmarks.cs
│   │   ├── SerilogBenchmarks.cs
│   │   ├── UrlPathToUrlPathTemplateMatcherBenchmarks.cs
│   │   ├── Usings.cs
│   │   └── packages.lock.json
│   ├── Ocelot.ManualTest/
│   │   ├── Actions/
│   │   │   ├── Basic.cs
│   │   │   └── ManualTests.cs
│   │   ├── DelegatingHandlers/
│   │   │   └── FakeHandler.cs
│   │   ├── Dockerfile
│   │   ├── Middlewares/
│   │   │   └── MetadataMiddleware.cs
│   │   ├── Ocelot.ManualTest.csproj
│   │   ├── Ocelot.postman_collection.json
│   │   ├── Program.cs
│   │   ├── Properties/
│   │   │   └── launchSettings.json
│   │   ├── Tests/
│   │   │   └── Bug0930.html
│   │   ├── Usings.cs
│   │   ├── appsettings.Development.json
│   │   ├── appsettings.json
│   │   ├── docker-compose.yaml
│   │   ├── ocelot.identityserver4.json
│   │   ├── ocelot.json
│   │   ├── packages.lock.json
│   │   └── tempkey.rsa
│   └── Ocelot.UnitTests/
│       ├── Authentication/
│       │   ├── AuthenticationMiddlewareTests.cs
│       │   ├── AuthenticationOptionsCreatorTests.cs
│       │   ├── FileAuthenticationOptionsTests.cs
│       │   └── FileGlobalAuthenticationOptionsTests.cs
│       ├── Authorization/
│       │   ├── AuthorizationMiddlewareTests.cs
│       │   ├── ClaimsAuthorizerTests.cs
│       │   ├── UnauthorizedErrorTests.cs
│       │   └── UserDoesNotHaveClaimErrorTests.cs
│       ├── Cache/
│       │   ├── CacheOptionsCreatorTests.cs
│       │   ├── CachedResponseTests.cs
│       │   ├── DefaultCacheKeyGeneratorTests.cs
│       │   ├── DefaultMemoryCacheTests.cs
│       │   ├── FileCacheOptionsTests.cs
│       │   ├── FileGlobalCacheOptionsTests.cs
│       │   └── OutputCacheMiddlewareTests.cs
│       ├── Claims/
│       │   ├── AddClaimsToRequestTests.cs
│       │   └── ClaimsToClaimsMiddlewareTests.cs
│       ├── Configuration/
│       │   ├── AggregatesCreatorTests.cs
│       │   ├── ChangeTracking/
│       │   │   ├── OcelotConfigurationChangeTokenSourceTests.cs
│       │   │   ├── OcelotConfigurationChangeTokenTests.cs
│       │   │   └── OcelotConfigurationMonitorTests.cs
│       │   ├── ClaimToThingConfigurationParserTests.cs
│       │   ├── ClaimsToThingCreatorTests.cs
│       │   ├── ConfigurationCreatorTests.cs
│       │   ├── DefaultMetadataCreatorTests.cs
│       │   ├── DownstreamAddressesCreatorTests.cs
│       │   ├── DownstreamRouteExtensionsTests.cs
│       │   ├── DownstreamRouteTests.cs
│       │   ├── DynamicRoutesCreatorTests.cs
│       │   ├── FileConfigurationSetterTests.cs
│       │   ├── FileInternalConfigurationCreatorTests.cs
│       │   ├── FileModels/
│       │   │   ├── FileDynamicRouteTests.cs
│       │   │   ├── FileGlobalHttpHandlerOptionsTests.cs
│       │   │   ├── FileMetadataOptionsTests.cs
│       │   │   └── FileRouteTests.cs
│       │   ├── HashCreationTests.cs
│       │   ├── HeaderFindAndReplaceCreatorTests.cs
│       │   ├── HeaderFindAndReplaceTests.cs
│       │   ├── HttpHandlerOptionsCreatorTests.cs
│       │   ├── HttpHandlerOptionsTests.cs
│       │   ├── HttpVersionPolicyCreatorTests.cs
│       │   ├── MetadataOptionsTests.cs
│       │   ├── Parser/
│       │   │   └── ParsingConfigurationHeaderErrorTests.cs
│       │   ├── Repository/
│       │   │   ├── ConsulFileConfigurationPollerOptionTests.cs
│       │   │   ├── DiskFileConfigurationRepositoryTests.cs
│       │   │   ├── FileConfigurationPollerTests.cs
│       │   │   ├── InMemoryConfigurationRepositoryTests.cs
│       │   │   └── InMemoryFileConfigurationPollerOptionsTests.cs
│       │   ├── RequestIdKeyCreatorTests.cs
│       │   ├── RouteKeyCreatorTests.cs
│       │   ├── RouteTests.cs
│       │   ├── SecurityOptionsCreatorTests.cs
│       │   ├── ServiceProviderConfigurationCreatorTests.cs
│       │   ├── StaticRoutesCreatorTests.cs
│       │   ├── UpstreamHeaderTemplatePatternCreatorTests.cs
│       │   ├── UpstreamTemplatePatternCreatorTests.cs
│       │   ├── Validation/
│       │   │   ├── FileAuthenticationOptionsValidatorTests.cs
│       │   │   ├── FileConfigurationFluentValidatorTests.cs
│       │   │   ├── FileQoSOptionsFluentValidatorTests.cs
│       │   │   ├── HostAndPortValidatorTests.cs
│       │   │   └── RouteFluentValidatorTests.cs
│       │   └── VersionCreatorTests.cs
│       ├── Consul/
│       │   ├── AgentServiceExtensions.cs
│       │   ├── ConsulFileConfigurationRepositoryTests.cs
│       │   ├── ConsulProviderFactoryTests.cs
│       │   ├── DefaultConsulServiceBuilderTests.cs
│       │   ├── OcelotBuilderExtensionsTests.cs
│       │   └── PollingConsulServiceDiscoveryProviderTests.cs
│       ├── Controllers/
│       │   ├── FileConfigurationControllerTests.cs
│       │   └── OutputCacheControllerTests.cs
│       ├── DependencyInjection/
│       │   ├── ConfigurationBuilderExtensionsTests.cs
│       │   ├── OcelotBuilderTests.cs
│       │   └── ServiceCollectionExtensionsTests.cs
│       ├── DownstreamPathManipulation/
│       │   ├── ChangeDownstreamPathTemplateTests.cs
│       │   └── ClaimsToDownstreamPathMiddlewareTests.cs
│       ├── DownstreamRouteFinder/
│       │   ├── DiscoveryDownstreamRouteFinderTests.cs
│       │   ├── DownstreamRouteFinderMiddlewareTests.cs
│       │   ├── DownstreamRouteFinderTests.cs
│       │   ├── DownstreamRouteHolderTests.cs
│       │   ├── DownstreamRouteProviderFactoryTests.cs
│       │   ├── HeaderMatcher/
│       │   │   ├── HeaderPlaceholderNameAndValueFinderTests.cs
│       │   │   └── HeadersToHeaderTemplatesMatcherTests.cs
│       │   └── UrlMatcher/
│       │       ├── PlaceholderNameAndValueTests.cs
│       │       ├── RegExUrlMatcherTests.cs
│       │       └── UrlPathPlaceholderNameAndValueFinderTests.cs
│       ├── DownstreamUrlCreator/
│       │   ├── DownstreamPathPlaceholderReplacerTests.cs
│       │   └── DownstreamUrlCreatorMiddlewareTests.cs
│       ├── Errors/
│       │   ├── ErrorTests.cs
│       │   └── ExceptionHandlerMiddlewareTests.cs
│       ├── Eureka/
│       │   ├── EurekaMiddlewareConfigurationProviderTests.cs
│       │   ├── EurekaProviderFactoryTests.cs
│       │   ├── EurekaServiceDiscoveryProviderTests.cs
│       │   └── OcelotBuilderExtensionsTests.cs
│       ├── FileUnitTest.cs
│       ├── Headers/
│       │   ├── AddHeadersToRequestClaimToThingTests.cs
│       │   ├── AddHeadersToRequestPlainTests.cs
│       │   ├── AddHeadersToResponseTests.cs
│       │   ├── ClaimsToHeadersMiddlewareTests.cs
│       │   ├── HttpContextRequestHeaderReplacerTests.cs
│       │   ├── HttpHeadersTransformationMiddlewareTests.cs
│       │   ├── HttpResponseHeaderReplacerTests.cs
│       │   └── RemoveHeadersTests.cs
│       ├── Infrastructure/
│       │   ├── ClaimParserTests.cs
│       │   ├── ConfigAwarePlaceholdersTests.cs
│       │   ├── Extensions/
│       │   │   ├── ErrorListExtensionsTests.cs
│       │   │   ├── HttpContextExtensionsTests.cs
│       │   │   ├── HttpRequestExtensionsTests.cs
│       │   │   ├── IEnumerableExtensionsTests.cs
│       │   │   ├── Int32ExtensionsTests.cs
│       │   │   ├── StringBuilderExtensionsTests.cs
│       │   │   └── StringExtensionsTests.cs
│       │   ├── HttpDataRepositoryTests.cs
│       │   ├── InMemoryBusTests.cs
│       │   ├── PlaceholdersTests.cs
│       │   └── ScopesAuthorizerTests.cs
│       ├── Kubernetes/
│       │   ├── EndpointClientV1Tests.cs
│       │   ├── FakeKubeApiClientFactory.cs
│       │   ├── KubeApiClientFactoryTests.cs
│       │   ├── KubeServiceBuilderTests.cs
│       │   ├── KubeServiceCreatorTests.cs
│       │   ├── KubernetesProviderFactoryTests.cs
│       │   ├── ObservableExtensionsTests.cs
│       │   ├── OcelotBuilderExtensionsTests.cs
│       │   ├── PollKubeTests.cs
│       │   └── WatchKubeTests.cs
│       ├── LoadBalancer/
│       │   ├── CookieStickySessionsCreatorTests.cs
│       │   ├── CookieStickySessionsTests.cs
│       │   ├── DelegateInvokingLoadBalancerCreatorTests.cs
│       │   ├── LeaseEventArgsTests.cs
│       │   ├── LeaseTests.cs
│       │   ├── LeastConnectionCreatorTests.cs
│       │   ├── LeastConnectionTests.cs
│       │   ├── LoadBalancerFactoryTests.cs
│       │   ├── LoadBalancerHouseTests.cs
│       │   ├── LoadBalancerMiddlewareTests.cs
│       │   ├── LoadBalancerOptionsCreatorTests.cs
│       │   ├── LoadBalancerOptionsTests.cs
│       │   ├── NoLoadBalancerCreatorTests.cs
│       │   ├── NoLoadBalancerTests.cs
│       │   ├── RoundRobinCreatorTests.cs
│       │   └── RoundRobinTests.cs
│       ├── Logging/
│       │   ├── OcelotDiagnosticListenerTests.cs
│       │   ├── OcelotHttpTracingHandlerTests.cs
│       │   ├── OcelotLoggerFactoryTests.cs
│       │   ├── OcelotLoggerTests.cs
│       │   ├── OcelotLoggerTestsForDisposal.cs
│       │   └── TracingHandlerFactoryTests.cs
│       ├── Middleware/
│       │   ├── BaseUrlFinderTests.cs
│       │   ├── OcelotPipelineExtensionsTests.cs
│       │   └── OcelotPiplineBuilderTests.cs
│       ├── Multiplexing/
│       │   ├── DefinedAggregatorProviderTests.cs
│       │   ├── MultiplexingMiddlewareTests.cs
│       │   ├── ResponseAggregatorFactoryTests.cs
│       │   ├── SimpleJsonResponseAggregatorTests.cs
│       │   └── UserDefinedResponseAggregatorTests.cs
│       ├── Ocelot.UnitTests.csproj
│       ├── Polly/
│       │   ├── CircuitBreakerStrategyTests.cs
│       │   ├── OcelotBuilderExtensionsTests.cs
│       │   ├── PollyQoSResiliencePipelineProviderTests.cs
│       │   ├── PollyResiliencePipelineDelegatingHandlerTests.cs
│       │   └── TimeoutStrategyTests.cs
│       ├── Properties/
│       │   └── AssemblyInfo.cs
│       ├── QualityOfService/
│       │   ├── FileGlobalQoSOptionsTests.cs
│       │   ├── FileQoSOptionsTests.cs
│       │   ├── QoSFactoryTests.cs
│       │   ├── QoSOptionsCreatorTests.cs
│       │   └── QoSOptionsTests.cs
│       ├── QueryStrings/
│       │   ├── AddQueriesToRequestTests.cs
│       │   └── ClaimsToQueryStringMiddlewareTests.cs
│       ├── RateLimiting/
│       │   ├── DistributedCacheRateLimitStorageTests.cs
│       │   ├── FileGlobalRateLimitingTests.cs
│       │   ├── FileRateLimitByHeaderRuleTests.cs
│       │   ├── FileRateLimitRuleTests.cs
│       │   ├── FileRateLimitingTests.cs
│       │   ├── MemoryCacheRateLimitStorageTests.cs
│       │   ├── RateLimitCounterTests.cs
│       │   ├── RateLimitHeadersTests.cs
│       │   ├── RateLimitOptionsCreatorTests.cs
│       │   ├── RateLimitOptionsTests.cs
│       │   ├── RateLimitRuleTests.cs
│       │   ├── RateLimitingHeadersTests.cs
│       │   ├── RateLimitingMiddlewareTests.cs
│       │   └── RateLimitingTests.cs
│       ├── Repository/
│       │   └── HttpDataRepositoryTests.cs
│       ├── Request/
│       │   ├── Creator/
│       │   │   └── DownstreamRequestCreatorTests.cs
│       │   ├── DownstreamRequestInitialiserMiddlewareTests.cs
│       │   ├── DownstreamRequestTests.cs
│       │   └── Mapper/
│       │       ├── RequestMapperTests.cs
│       │       └── StreamHttpContentTests.cs
│       ├── RequestId/
│       │   └── RequestIdMiddlewareTests.cs
│       ├── Requester/
│       │   ├── DelegatingHandlerFactoryTests.cs
│       │   ├── FakeDelegatingHandler.cs
│       │   ├── HttpExceptionToErrorMapperTests.cs
│       │   ├── HttpRequesterMiddlewareTests.cs
│       │   ├── MessageInvokerCacheKeyTests.cs
│       │   ├── MessageInvokerHttpRequesterTests.cs
│       │   ├── MessageInvokerPoolTests.cs
│       │   └── TimeoutDelegatingHandlerTests.cs
│       ├── Responder/
│       │   ├── AnyError.cs
│       │   ├── ErrorsToHttpStatusCodeMapperTests.cs
│       │   ├── HttpContextResponderTests.cs
│       │   └── ResponderMiddlewareTests.cs
│       ├── Security/
│       │   ├── IPSecurityPolicyTests.cs
│       │   └── SecurityMiddlewareTests.cs
│       ├── SequentialTests.cs
│       ├── ServiceDiscovery/
│       │   ├── ConfigurationServiceProviderTests.cs
│       │   ├── ServiceDiscoveryProviderFactoryTests.cs
│       │   ├── ServiceFabricServiceDiscoveryProviderTests.cs
│       │   └── ServiceRegistryTests.cs
│       ├── TestRetry.cs
│       ├── UnitTest.cs
│       ├── UnitTests.runsettings
│       ├── Usings.cs
│       ├── WebSockets/
│       │   ├── ClientWebSocketConnectorTests.cs
│       │   ├── ClientWebSocketOptionsProxyTests.cs
│       │   ├── ClientWebSocketProxyTests.cs
│       │   ├── MockWebSocket.cs
│       │   ├── WebSocketsFactoryTests.cs
│       │   └── WebSocketsProxyMiddlewareTests.cs
│       ├── appsettings.json
│       └── packages.lock.json
└── testing/
    ├── AcceptanceSteps.cs
    ├── Authentication/
    │   ├── AuthenticationSteps.cs
    │   ├── AuthenticationTokenRequest.cs
    │   ├── AuthenticationTokenRequestEventArgs.cs
    │   └── OcelotScopes.cs
    ├── BearerToken.cs
    ├── Boxing/
    │   ├── Box.cs
    │   ├── FileRouteBox.cs
    │   └── FileRouteExtensions.cs
    ├── FileUnit.cs
    ├── Ocelot.Testing.csproj
    ├── Ocelot.cs
    ├── PortFinder.cs
    ├── README.md
    ├── ServiceHandler.cs
    ├── StreamExtensions.cs
    ├── TestHostBuilder.cs
    ├── TestWebBuilder.cs
    ├── Unit.cs
    └── Wait.cs

================================================
FILE CONTENTS
================================================

================================================
FILE: .config/dotnet-tools.json
================================================
{
  "version": 1,
  "isRoot": true,
  "tools": {
    "cake.tool": {
      "version": "6.1.0",
      "commands": [
        "dotnet-cake"
      ]
    },
    "dotnet-reportgenerator-globaltool": {
      "version": "5.5.4",
      "commands": [
        "reportgenerator"
      ],
      "rollForward": false
    }
  }
}


================================================
FILE: .dockerignore
================================================
*/*/bin
*/*/obj
artifacts/
TestResults/
tools/

================================================
FILE: .editorconfig
================================================
# Remove the line below if you want to inherit .editorconfig settings from higher directories
root = true

# XML files
[*.xml]
indent_style = space
indent_size = 2

# C# files
[*.cs]

#### Core EditorConfig Options ####

# Indentation and spacing
indent_size = 4
indent_style = space
tab_width = 4

# New line preferences
end_of_line = crlf
insert_final_newline = true

#### .NET Coding Conventions ####

# Organize usings
dotnet_separate_import_directive_groups = false
dotnet_sort_system_directives_first = false
file_header_template = unset

# this. and Me. preferences
dotnet_style_qualification_for_event = false
dotnet_style_qualification_for_field = false
dotnet_style_qualification_for_method = false
dotnet_style_qualification_for_property = false

# Language keywords vs BCL types preferences
dotnet_style_predefined_type_for_locals_parameters_members = true
dotnet_style_predefined_type_for_member_access = true

# Parentheses preferences
dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity
dotnet_style_parentheses_in_other_binary_operators = always_for_clarity
dotnet_style_parentheses_in_other_operators = never_if_unnecessary
dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity

# Modifier preferences
dotnet_style_require_accessibility_modifiers = for_non_interface_members

# Expression-level preferences
dotnet_style_coalesce_expression = true
dotnet_style_collection_initializer = true
dotnet_style_explicit_tuple_names = true
dotnet_style_namespace_match_folder = true
dotnet_style_null_propagation = true
dotnet_style_object_initializer = true
dotnet_style_operator_placement_when_wrapping = beginning_of_line
dotnet_style_prefer_auto_properties = true
dotnet_style_prefer_collection_expression = false:suggestion
dotnet_style_prefer_compound_assignment = true
dotnet_style_prefer_conditional_expression_over_assignment = true
dotnet_style_prefer_conditional_expression_over_return = true
dotnet_style_prefer_foreach_explicit_cast_in_source = when_strongly_typed
dotnet_style_prefer_inferred_anonymous_type_member_names = true
dotnet_style_prefer_inferred_tuple_names = true
dotnet_style_prefer_is_null_check_over_reference_equality_method = true
dotnet_style_prefer_simplified_boolean_expressions = true
dotnet_style_prefer_simplified_interpolation = true

# Field preferences
dotnet_style_readonly_field = true

# Parameter preferences
dotnet_code_quality_unused_parameters = all

# Suppression preferences
dotnet_remove_unnecessary_suppression_exclusions = none

# New line preferences
dotnet_style_allow_multiple_blank_lines_experimental = true
dotnet_style_allow_statement_immediately_after_block_experimental = true

#### C# Coding Conventions ####

# var preferences
csharp_style_var_elsewhere = false
csharp_style_var_for_built_in_types = false
csharp_style_var_when_type_is_apparent = false

# Expression-bodied members
csharp_style_expression_bodied_accessors = true:silent
csharp_style_expression_bodied_constructors = false:silent
csharp_style_expression_bodied_indexers = true:silent
csharp_style_expression_bodied_lambdas = true:silent
csharp_style_expression_bodied_local_functions = false:silent
csharp_style_expression_bodied_methods = false:silent
csharp_style_expression_bodied_operators = false:silent
csharp_style_expression_bodied_properties = true:silent

# Pattern matching preferences
csharp_style_pattern_matching_over_as_with_null_check = true
csharp_style_pattern_matching_over_is_with_cast_check = true
csharp_style_prefer_extended_property_pattern = true
csharp_style_prefer_not_pattern = true
csharp_style_prefer_pattern_matching = true
csharp_style_prefer_switch_expression = true

# Null-checking preferences
csharp_style_conditional_delegate_call = true

# Modifier preferences
csharp_prefer_static_local_function = true
csharp_preferred_modifier_order = public,private,protected,internal,file,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,required,volatile,async
csharp_style_prefer_readonly_struct = true
csharp_style_prefer_readonly_struct_member = true

# Code-block preferences
csharp_prefer_braces = true:silent
csharp_prefer_simple_using_statement = true:suggestion
csharp_style_namespace_declarations = block_scoped:silent
csharp_style_prefer_method_group_conversion = true:silent
csharp_style_prefer_primary_constructors = false:suggestion
csharp_style_prefer_top_level_statements = true:silent

# Expression-level preferences
csharp_prefer_simple_default_expression = true
csharp_style_deconstructed_variable_declaration = true
csharp_style_implicit_object_creation_when_type_is_apparent = true
csharp_style_inlined_variable_declaration = true
csharp_style_prefer_index_operator = true
csharp_style_prefer_local_over_anonymous_function = true
csharp_style_prefer_null_check_over_type_check = true
csharp_style_prefer_range_operator = true
csharp_style_prefer_tuple_swap = true
csharp_style_prefer_utf8_string_literals = true
csharp_style_throw_expression = true
csharp_style_unused_value_assignment_preference = discard_variable
csharp_style_unused_value_expression_statement_preference = discard_variable

# 'using' directive preferences
csharp_using_directive_placement = outside_namespace:silent

# New line preferences
csharp_style_allow_blank_line_after_colon_in_constructor_initializer_experimental = true
csharp_style_allow_blank_line_after_token_in_arrow_expression_clause_experimental = true
csharp_style_allow_blank_line_after_token_in_conditional_expression_experimental = true
csharp_style_allow_blank_lines_between_consecutive_braces_experimental = true
csharp_style_allow_embedded_statements_on_same_line_experimental = true

#### C# Formatting Rules ####

# New line preferences
csharp_new_line_before_catch = true
csharp_new_line_before_else = true
csharp_new_line_before_finally = true
csharp_new_line_before_members_in_anonymous_types = true
csharp_new_line_before_members_in_object_initializers = true
csharp_new_line_before_open_brace = all
csharp_new_line_between_query_expression_clauses = true

# Indentation preferences
csharp_indent_block_contents = true
csharp_indent_braces = false
csharp_indent_case_contents = true
csharp_indent_case_contents_when_block = true
csharp_indent_labels = one_less_than_current
csharp_indent_switch_labels = true

# Space preferences
csharp_space_after_cast = false
csharp_space_after_colon_in_inheritance_clause = true
csharp_space_after_comma = true
csharp_space_after_dot = false
csharp_space_after_keywords_in_control_flow_statements = true
csharp_space_after_semicolon_in_for_statement = true
csharp_space_around_binary_operators = before_and_after
csharp_space_around_declaration_statements = false
csharp_space_before_colon_in_inheritance_clause = true
csharp_space_before_comma = false
csharp_space_before_dot = false
csharp_space_before_open_square_brackets = false
csharp_space_before_semicolon_in_for_statement = false
csharp_space_between_empty_square_brackets = false
csharp_space_between_method_call_empty_parameter_list_parentheses = false
csharp_space_between_method_call_name_and_opening_parenthesis = false
csharp_space_between_method_call_parameter_list_parentheses = false
csharp_space_between_method_declaration_empty_parameter_list_parentheses = false
csharp_space_between_method_declaration_name_and_open_parenthesis = false
csharp_space_between_method_declaration_parameter_list_parentheses = false
csharp_space_between_parentheses = false
csharp_space_between_square_brackets = false

# Wrapping preferences
csharp_preserve_single_line_blocks = true
csharp_preserve_single_line_statements = true

#### Naming styles ####

# Naming rules

dotnet_naming_rule.interface_should_be_begins_with_i.severity = suggestion
dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface
dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i

dotnet_naming_rule.types_should_be_pascal_case.severity = suggestion
dotnet_naming_rule.types_should_be_pascal_case.symbols = types
dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case

dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = suggestion
dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members
dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case

# Symbol specifications

dotnet_naming_symbols.interface.applicable_kinds = interface
dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.interface.required_modifiers = 

dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum
dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.types.required_modifiers = 

dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method
dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.non_field_members.required_modifiers = 

# Naming styles

dotnet_naming_style.pascal_case.required_prefix = 
dotnet_naming_style.pascal_case.required_suffix = 
dotnet_naming_style.pascal_case.word_separator = 
dotnet_naming_style.pascal_case.capitalization = pascal_case

dotnet_naming_style.begins_with_i.required_prefix = I
dotnet_naming_style.begins_with_i.required_suffix = 
dotnet_naming_style.begins_with_i.word_separator = 
dotnet_naming_style.begins_with_i.capitalization = pascal_case

[*.{cs,vb}]
dotnet_style_operator_placement_when_wrapping = beginning_of_line
tab_width = 4
indent_size = 4
end_of_line = crlf
dotnet_style_coalesce_expression = true:suggestion
insert_final_newline = true
dotnet_style_null_propagation = true:suggestion
dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion


================================================
FILE: .gitattributes
================================================
# 2010
*.txt -crlf

# 2020
*.txt text eol=lf 

================================================
FILE: .github/CODE_OF_CONDUCT.md
================================================
# Contributor Covenant Code of Conduct

## Our Pledge

In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.

## Our Standards

Examples of behavior that contributes to creating a positive environment include:

* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members

Examples of unacceptable behavior by participants include:

* The use of sexualized language or imagery and unwelcome sexual attention or advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a professional setting

## Our Responsibilities

Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.

Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.

## Scope

This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.

## Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at tom@threemammals.co.uk. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.

Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.

## Attribution

This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]

[homepage]: http://contributor-covenant.org
[version]: http://contributor-covenant.org/version/1/4/


================================================
FILE: .github/CONTRIBUTING.md
================================================
We love to receive contributions from the community so please keep them coming :) 

Pull requests, issues and commentary welcome!

Please complete the relevant template for issues and PRs. Sometimes it's worth getting in touch with us to discuss changes 
before doing any work incase this is something we are already doing or it might not make sense. We can also give
advice on the easiest way to do things :)

Finally we mark all existing issues as help wanted, small, medium and large effort. If you want to contribute for the first time I suggest looking at a help wanted & small effort issue :)


================================================
FILE: .github/ISSUE_TEMPLATE.md
================================================
## Expected Behavior / New Feature


## Actual Behavior / Motivation for New Feature


## Steps to Reproduce the Problem

  1.
  1.
  1.

## Specifications

  - Version:
  - Platform:
  - Subsystem:


================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
Fixes / New Feature #

## Proposed Changes

  -
  -
  -


================================================
FILE: .github/steps/check-dotnet.sh
================================================
#!/bin/bash

# First argument: target .NET major version (digit)
# Default to 8 if no argument is provided
DOTNET_VERSION="${1:-8}"

# Check .NET $DOTNET_VERSION
DOTNET_INFO=$(dotnet --info)
echo Checking for .NET $DOTNET_VERSION SDK in dotnet info output...
echo -------------------------------------------------------------

# Print matching lines
echo "$DOTNET_INFO" | grep -E "^\s*${DOTNET_VERSION}\.0\.[0-9]+\s+\[/usr/share/dotnet/sdk\]"

# Set environment variable based on match
if echo "$DOTNET_INFO" | grep -qE "^\s*${DOTNET_VERSION}\.0\.[0-9]+\s+\[/usr/share/dotnet/sdk\]"; then
  echo "DOTNET${DOTNET_VERSION}_installed=true" >> "$GITHUB_ENV"
else
  echo "DOTNET${DOTNET_VERSION}_installed=false" >> "$GITHUB_ENV"
fi


================================================
FILE: .github/steps/macos.add-dns-records.sh
================================================
#!/bin/bash
hosts="/etc/hosts"
if [ ! -f "$hosts" ]; then
  echo "$hosts not found."
  exit 1
fi

# Find the line number of the last line that starts with "##"
last_index=$(grep -n '^##' "$hosts" | tail -n 1 | cut -d: -f1)

# Check if the line exists
if [ -z "$last_index" ]; then
  echo No lines start with '##' in $hosts
  exit 1
fi

# Insert DNS-record after the last "##" line
record="127.0.0.1       threemammals.com"
# This 3-line sed script fixes the issue when embedded as a run-action script in GitHub Actions.
# The problem prevents the workflow file from being parsed correctly, which stops the workflow from starting.
sudo sed -i '' "${last_index}a\\
$record
" $hosts

echo "Inserted '$record' after line $last_index."
echo DNS-record added to $hosts
echo ------------------------
cat $hosts
echo ------------------------

# The threemammals.com domain is registered for email services
# https://registrar.ionos.com/domains_raa/whois
# So, go ahead and clear the DNS cache
sudo killall -HUP mDNSResponder

ping -c 3 threemammals.com

# Additional Loopback IPs
echo -n "Adding multiple aliases in a loop..."
for i in {2..255}; do
  sudo ifconfig lo0 alias 127.0.0.$i up
done
echo DONE
echo ------------------------
echo Test Loopback IPs
for i in {2..255}; do
  echo ping 127.0.0.$i ...
  ping -c 1 127.0.0.$i
done


================================================
FILE: .github/steps/macos.install-certificate.sh
================================================
#!/bin/bash
# Install mycert2.crt certificate
crt='./test/Ocelot.AcceptanceTests/mycert2.crt'
openssl version
echo Moving the certificate to the trusted CA store...
if [ ! -f "$crt" ]; then
  echo "Certificate file not found: $crt"
  exit 1
fi
cert_root="/Library/Keychains/System.keychain"
sudo security add-trusted-cert -d -r trustRoot -k "$cert_root" "$crt"
echo Certificate added to trusted keychain.

echo Verifying installation by listing certificates in $cert_root ...
sudo security find-certificate -a -c "threemammals" -p "$cert_root"

echo Verifying installation by openssl for $crt in $cert_root ...
# Export the matching certificate(s) in PEM directly (security find-certificate -p)
tmpcert=$(mktemp /tmp/mycert.XXXXXX.pem)
# Use sudo + tee so the redirected file is written with appropriate permissions
sudo security find-certificate -a -c "threemammals" -p "$cert_root" | sudo tee "$tmpcert" >/dev/null
if [ ! -s "$tmpcert" ]; then
  echo "Failed to export certificate to $tmpcert"
  rm -f "$tmpcert"
  exit 1
fi
chmod 644 "$tmpcert"
openssl x509 -in "$tmpcert" -text -noout
rm -f "$tmpcert"
echo Installation is DONE


================================================
FILE: .github/steps/prepare-coveralls.sh
================================================
#!/bin/bash
# Prepare Coveralls
echo "::group::Listing environment variables"
env | sort
echo "::endgroup::"

echo ------------ Detect coverage file ------------ 
coverage_1st_folder=$(ls -d /home/runner/work/Ocelot/Ocelot/artifacts/UnitTests/*/ | head -1)
echo "Detected first folder : $coverage_1st_folder"
coverage_file="${coverage_1st_folder%/}/coverage.cobertura.xml"
echo "Detecting file $coverage_file ..."
if [ -f "$coverage_file" ]; then
  echo "Coverage file exists."
  echo "COVERALLS_coverage_file_exists=true" >> $GITHUB_ENV
  echo "COVERALLS_coverage_file=$coverage_file" >> $GITHUB_ENV
else
  echo "Coverage file DOES NOT exist!"
  echo "COVERALLS_coverage_file_exists=false" >> $GITHUB_ENV
fi


================================================
FILE: .github/steps/ubuntu.add-dns-records.sh
================================================
#!/bin/bash
hosts="/etc/hosts"
if [ ! -f "$hosts" ]; then
  echo "$hosts not found."
  exit 1
fi

sudo sed -i '$a 127.0.0.1 threemammals.com' $hosts

echo DNS-record added to $hosts
echo ------------------------
cat $hosts
echo ------------------------

ping -c 3 threemammals.com


================================================
FILE: .github/steps/ubuntu.install-certificate.sh
================================================
#!/bin/bash
# Install mycert2.crt certificate
crt='./test/Ocelot.AcceptanceTests/mycert2.crt'
if [ -f "$crt" ]; then
  echo mycert2.crt file found
fi

openssl version

# Copy the certificate to the system's trusted CA directory
echo Moving the certificate to the trusted CA store...
cert='/usr/local/share/ca-certificates/mycert2.crt'
sudo cp $crt $cert

echo Updating the trusted certificates...
sudo update-ca-certificates # This will add mycert.crt to the trusted root storage

echo Verifying installation by listing in /etc/ssl/certs/ folder...
sudo ls /etc/ssl/certs/ | grep mycert

echo Verifying installation by openssl for $cert file...
sudo chmod 644 $cert # adjusting the permissions
ls -l $cert # verify ownership
openssl x509 -in $cert -text -noout

echo Installation is DONE


================================================
FILE: .github/steps/windows.add-dns-records.ps1
================================================
# Add DNS-records
Write-Host "Hello from PowerShell"
Get-Date
    
# Append entry to hosts file
Add-Content -Path "$env:SystemRoot\System32\drivers\etc\hosts" -Value "127.0.0.1 threemammals.com"

Write-Output "------------------------"
Get-Content "$env:SystemRoot\System32\drivers\etc\hosts"
Write-Output "------------------------"

# Ping 3 times
Test-Connection -ComputerName "threemammals.com" -Count 3


================================================
FILE: .github/steps/windows.install-certificate.ps1
================================================
Write-Host "Hello from PowerShell"
Get-Date

# Install mycert2.crt certificate
$crt = ".\test\Ocelot.AcceptanceTests\mycert2.crt"
if (Test-Path $crt) {
  Write-Output "mycert2.crt file found"
}

openssl version

Write-Output "Moving the certificate to the trusted CA store..."
# Import into the Local Machine Trusted Root Certification Authorities store
$crt = ".\test\Ocelot.AcceptanceTests\mycert2.crt"
Import-Certificate -FilePath $crt -CertStoreLocation Cert:\LocalMachine\Root

Write-Output "Verifying installation by listing trusted root certificates..."
# List certificates in the Trusted Root store and filter for 'mycert'
Get-ChildItem -Path Cert:\LocalMachine\Root | Where-Object { $_.Subject -like "*threemammals*" }

Write-Output "Verifying installation by openssl for $crt file..."
$cert = Get-ChildItem Cert:\LocalMachine\Root | Where-Object { $_.Subject -like "*threemammals*" }
$cert_file = "C:\temp\mycert2_installed.cer"
Export-Certificate -Cert $cert -FilePath $cert_file
if (Test-Path $cert_file) {
  Write-Output "$cert_file file found"
}

# Display certificate details using OpenSSL (if installed)
openssl x509 -in $cert_file -text -noout

Write-Output "Installation is DONE"


================================================
FILE: .github/workflows/develop.yml
================================================
name: Develop
on:
  push:
    branches:
      - develop
      # - 'release/**' # for testing purposes
jobs:
  build-windows:
    runs-on: windows-latest
    env:
      NUGET_PACKAGES: ${{ github.workspace }}/.nuget/packages
    steps:
      - name: Checkout
        uses: actions/checkout@v5
      - name: Setup .NET 10
        uses: actions/setup-dotnet@v5
        with:
          dotnet-version: 10.x
          cache: true
          cache-dependency-path: |
            samples/**/packages.lock.json
            src/**/packages.lock.json
            test/**/packages.lock.json
      - name: .NET Info
        run: dotnet --info
      - name: Add DNS-records
        run: ./.github/steps/windows.add-dns-records.ps1
      - name: Install certificate
        run: ./.github/steps/windows.install-certificate.ps1
      - name: Restore
        run: dotnet restore --locked-mode ./Ocelot.slnx
      - name: Build
        run: dotnet build --no-restore ./Ocelot.slnx --framework net10.0
      - name: Unit Tests
        run: dotnet test --no-restore --no-build --verbosity minimal --framework net10.0 --settings coverlet.runsettings ./test/Ocelot.UnitTests/Ocelot.UnitTests.csproj
      - name: Acceptance Tests
        run: dotnet test --no-restore --no-build --verbosity minimal --framework net10.0 --settings coverlet.runsettings ./test/Ocelot.AcceptanceTests/Ocelot.AcceptanceTests.csproj

  build-macos:
    needs: build-windows
    runs-on: macos-latest
    env:
      NUGET_PACKAGES: ${{ github.workspace }}/.nuget/packages
    steps:
      - name: Checkout
        uses: actions/checkout@v5
      - name: SH-scripts executable
        run: |
          chmod +x .github/steps/*.sh
          ls -l .github/steps/*.sh
      - name: Setup .NET 10
        uses: actions/setup-dotnet@v5
        with:
          dotnet-version: 10.x
          cache: true
          cache-dependency-path: |
            samples/**/packages.lock.json
            src/**/packages.lock.json
            test/**/packages.lock.json
      - name: .NET Info
        run: dotnet --info
      - name: Add DNS-records
        run: ./.github/steps/macos.add-dns-records.sh
      - name: Install certificate
        run: ./.github/steps/macos.install-certificate.sh
      - name: Restore
        run: dotnet restore --locked-mode ./Ocelot.slnx
      - name: Build
        run: dotnet build --no-restore ./Ocelot.slnx --framework net10.0
      - name: Unit Tests
        run: dotnet test --no-restore --no-build --verbosity minimal --framework net10.0 --settings coverlet.runsettings ./test/Ocelot.UnitTests/Ocelot.UnitTests.csproj
      - name: Acceptance Tests
        run: dotnet test --no-restore --no-build --verbosity minimal --framework net10.0 --settings coverlet.runsettings ./test/Ocelot.AcceptanceTests/Ocelot.AcceptanceTests.csproj

  build-linux:
    needs: build-macos
    strategy:
      matrix:
        dotnet-version: [ '8', '9', '10' ]
    runs-on: ubuntu-latest
    env:
      NUGET_PACKAGES: ${{ github.workspace }}/.nuget/packages
    steps:
    - name: Checkout
      uses: actions/checkout@v5
    - name: SH-scripts executable
      run: |
        chmod +x .github/steps/*.sh
        ls -l .github/steps/*.sh
    - name: Check .NET ${{ matrix.dotnet-version }}
      id: check-dotnet
      run: ./.github/steps/check-dotnet.sh ${{ matrix.dotnet-version }}
    - name: Setup .NET ${{ matrix.dotnet-version }}
      # if: env.DOTNET${{ matrix.dotnet-version }}_installed == 'false'
      uses: actions/setup-dotnet@v5
      with:
        dotnet-version: ${{ matrix.dotnet-version }}.x
        cache: true
        cache-dependency-path: |
          samples/**/packages.lock.json
          src/**/packages.lock.json
          test/**/packages.lock.json
    - name: .NET Info
      run: dotnet --info
    - name: Add DNS-records
      run: ./.github/steps/ubuntu.add-dns-records.sh  
    - name: Install certificate
      run: ./.github/steps/ubuntu.install-certificate.sh
    - name: Restore
      run: dotnet restore --locked-mode ./Ocelot.slnx
    - name: Build
      run: dotnet build --no-restore ./Ocelot.slnx --framework net${{ matrix.dotnet-version }}.0
    - name: Unit Tests
      run: dotnet test --no-restore --no-build --verbosity minimal --framework net${{ matrix.dotnet-version }}.0 --settings coverlet.runsettings ./test/Ocelot.UnitTests/Ocelot.UnitTests.csproj
    - name: Acceptance Tests
      run: dotnet test --no-restore --no-build --verbosity minimal --framework net${{ matrix.dotnet-version }}.0 --settings coverlet.runsettings ./test/Ocelot.AcceptanceTests/Ocelot.AcceptanceTests.csproj

  build-cake:
    needs: build-linux
    runs-on: ubuntu-latest
    env:
      NUGET_PACKAGES: ${{ github.workspace }}/.nuget/packages
    steps:
      - name: Checkout
        uses: actions/checkout@v5
        with:
          fetch-depth: 0
      - name: SH-scripts executable
        run: chmod +x .github/steps/*.sh
      - name: Setup .NET 10
        uses: actions/setup-dotnet@v5
        with:
          dotnet-version: 10.x
          cache: true
          cache-dependency-path: |
            samples/**/packages.lock.json
            src/**/packages.lock.json
            test/**/packages.lock.json
      - name: Cake Build
        uses: cake-build/cake-action@v3
        with:
          target: UnitTests # LatestFramework
      - name: Coverage files
        run: ./.github/steps/prepare-coveralls.sh
      - name: Coveralls
        if: env.COVERALLS_coverage_file_exists == 'true'
        uses: coverallsapp/github-action@v2
        with:
          # fail-on-error: false
          file: ${{ env.COVERALLS_coverage_file }}
        continue-on-error: true
      - name: Codecov
        if: env.COVERALLS_coverage_file_exists == 'true'
        uses: codecov/codecov-action@v5
        with:
          token: ${{ secrets.CODECOV_TOKEN }}
          slug: ThreeMammals/Ocelot
          fail_ci_if_error: true
          files: ${{ env.COVERALLS_coverage_file }}
          flags: unittests
        continue-on-error: true


================================================
FILE: .github/workflows/pr-closed.yml
================================================
name: PR Closed
on:
  pull_request:
    types: [closed]

jobs:
  cleanup:
    runs-on: ubuntu-latest
    env:
      GH_TOKEN: ${{ github.token }}
    steps:
      - name: Checkout
        uses: actions/checkout@v5
      - name: Delete caches via gh CLI
        run: |
          pr_no="${{ github.event.pull_request.number }}"
          echo Pull request $pr_no cache items to be deleted...
          gh cache list --ref refs/pull/$pr_no/merge          
          echo --------------------------------------
          echo All cache items...
          gh cache list
          echo --------------------------------------
          # gh cache list --ref refs/pull/$pr_no/merge --json id --jq '.[].id' | xargs -n1 gh cache delete
          # Sometimes, items produced by other workflows get reused in the PR workflow
          # gh cache delete --all --succeed-on-no-caches
          echo "PR $pr_no: deleting caches for refs/pull/$pr_no/merge..."
          ids=$(gh cache list --ref refs/pull/$pr_no/merge --json id --jq '.[].id')
          if [ -z "$ids" ]; then
            echo "No PR caches found."
          else
            echo "$ids" | xargs -r -I{} sh -c 'gh cache delete {} || echo "delete {} failed (ignored)"'
          fi
          echo DONE
        continue-on-error: true


================================================
FILE: .github/workflows/pr.yml
================================================
# This workflow will build a .NET project
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-net
name: PR
on: pull_request

jobs:
#   build-linux:
#     runs-on: ubuntu-latest
#     continue-on-error: true
#     env:
#       # https://github.com/actions/setup-dotnet/blob/main/README.md#environment-variables
#       DOTNET_INSTALL_DIR: "/usr/share/dotnet" # don't override by /usr/lib/dotnet 
#       NUGET_PACKAGES: ${{ github.workspace }}/.nuget/packages
#     steps:
#     - name: Checkout
#       uses: actions/checkout@v5
#     - name: SH-scripts executable
#       run: |
#         chmod +x .github/steps/*.sh
#         ls -l .github/steps/*.sh
#     - name: Check .NET 10
#       id: check-dotnet10
#       run: ./.github/steps/check-dotnet.sh 10
#     - name: Setup .NET 10
#       # if: env.DOTNET10_installed == 'false'
#       uses: actions/setup-dotnet@v5
#       with:
#         dotnet-version: 10.x
#         cache: true
#         cache-dependency-path: |
#           samples/**/packages.lock.json
#           src/**/packages.lock.json
#           test/**/packages.lock.json
#     - name: .NET Info
#       run: dotnet --info
#     - name: Add DNS-records
#       run: ./.github/steps/ubuntu.add-dns-records.sh  
#     - name: Install certificate
#       run: ./.github/steps/ubuntu.install-certificate.sh
#     - name: Restore
#       run: dotnet restore --locked-mode ./Ocelot.slnx
#     - name: Build
#       run: dotnet build --no-restore ./Ocelot.slnx --framework net10.0
#     - name: Unit Tests
#       run: dotnet test --no-restore --no-build --verbosity normal --framework net10.0 --settings coverlet.runsettings ./test/Ocelot.UnitTests/Ocelot.UnitTests.csproj
#     - name: Acceptance Tests
#       run: dotnet test --no-restore --no-build --verbosity normal --framework net10.0 --settings coverlet.runsettings ./test/Ocelot.AcceptanceTests/Ocelot.AcceptanceTests.csproj

#   build-macos:
#     runs-on: macos-latest
#     continue-on-error: true
#     env:
#       NUGET_PACKAGES: ${{ github.workspace }}/.nuget/packages
#     steps:
#       - name: Checkout
#         uses: actions/checkout@v5
#       - name: SH-scripts executable
#         run: |
#           chmod +x .github/steps/*.sh
#           ls -l .github/steps/*.sh
#       - name: Setup .NET 10
#         uses: actions/setup-dotnet@v5
#         with:
#           dotnet-version: 10.x
#           cache: true
#           cache-dependency-path: |
#             samples/**/packages.lock.json
#             src/**/packages.lock.json
#             test/**/packages.lock.json
#       - name: .NET Info
#         run: dotnet --info
#       - name: Add DNS-records
#         run: ./.github/steps/macos.add-dns-records.sh  
#       - name: Install certificate
#         run: ./.github/steps/macos.install-certificate.sh
#       - name: Restore
#         run: dotnet restore --locked-mode ./Ocelot.slnx
#       - name: Build
#         run: dotnet build --no-restore ./Ocelot.slnx --framework net10.0
#       - name: Unit Tests
#         run: dotnet test --no-restore --no-build --verbosity minimal --framework net10.0 --settings coverlet.runsettings ./test/Ocelot.UnitTests/Ocelot.UnitTests.csproj
#       - name: Acceptance Tests
#         run: dotnet test --no-restore --no-build --verbosity minimal --framework net10.0 --settings coverlet.runsettings ./test/Ocelot.AcceptanceTests/Ocelot.AcceptanceTests.csproj

#   build-windows:
#     runs-on: windows-latest
#     continue-on-error: true
#     env:
#       NUGET_PACKAGES: ${{ github.workspace }}/.nuget/packages
#     steps:
#       - name: Checkout
#         uses: actions/checkout@v5
#       - name: Setup .NET 10
#         uses: actions/setup-dotnet@v5
#         with:
#           dotnet-version: 10.x
#           cache: true
#           cache-dependency-path: |
#             samples/**/packages.lock.json
#             src/**/packages.lock.json
#             test/**/packages.lock.json
#       - name: .NET Info
#         run: dotnet --info
#       - name: Add DNS-records
#         run: ./.github/steps/windows.add-dns-records.ps1  
#       - name: Install certificate
#         run: ./.github/steps/windows.install-certificate.ps1
#       - name: Restore
#         run: dotnet restore --locked-mode ./Ocelot.slnx
#       - name: Build
#         run: dotnet build --no-restore ./Ocelot.slnx --framework net10.0
#       - name: Unit Tests
#         run: dotnet test --no-restore --no-build --verbosity minimal --framework net10.0 --settings coverlet.runsettings ./test/Ocelot.UnitTests/Ocelot.UnitTests.csproj
#       - name: Acceptance Tests
#         run: dotnet test --no-restore --no-build --verbosity minimal --framework net10.0 --settings coverlet.runsettings ./test/Ocelot.AcceptanceTests/Ocelot.AcceptanceTests.csproj

#   build-success:
#     needs: [build-linux, build-macos, build-windows]
#     runs-on: ubuntu-latest
#     if: ${{ always() }} # run even Linux / MacOS / Windows build fails
#     steps:
#       - name: Decide success
#         run: |
#           linux_result="${{ needs.build-linux.result }}"
#           macos_result="${{ needs.build-macos.result }}"
#           windows_result="${{ needs.build-windows.result }}"
#           if [[ $linux_result == "success" || $macos_result == "success" || $windows_result == "success" ]]; then
#             echo "At least one succeeded"
#           else
#             echo "All failed"
#             exit 1
#           fi

  build-cake:
    runs-on: ubuntu-latest
    # environment: Pull-Request
    env:
      # COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }}
      NUGET_PACKAGES: ${{ github.workspace }}/.nuget/packages
    steps:
      - name: Checkout
        uses: actions/checkout@v5
        with:
          fetch-depth: 0
      - name: SH-scripts executable
        run: |
          chmod +x .github/steps/*.sh
          ls -l .github/steps/*.sh
      - name: Check .NET 10
        id: check-dotnet10
        run: ./.github/steps/check-dotnet.sh 10
      - name: Setup .NET 10
        # if: env.DOTNET10_installed == 'false'
        uses: actions/setup-dotnet@v5
        with:
          dotnet-version: 10.x
          cache: true
          cache-dependency-path: |
            samples/**/packages.lock.json
            src/**/packages.lock.json
            test/**/packages.lock.json
      - name: .NET Info
        run: dotnet --info
      - name: Add DNS-records
        run: ./.github/steps/ubuntu.add-dns-records.sh  
      - name: Install certificate
        run: ./.github/steps/ubuntu.install-certificate.sh
      - name: Cake Build
        uses: cake-build/cake-action@v3
        with:
          target: PullRequest
          verbosity: Verbose
      - name: Coverage files
        run: ./.github/steps/prepare-coveralls.sh
      - name: Coveralls
        if: env.COVERALLS_coverage_file_exists == 'true'
        uses: coverallsapp/github-action@v2
        with:
          # fail-on-error: false
          file: ${{ env.COVERALLS_coverage_file }}
        continue-on-error: true
      - name: Codecov
        if: env.COVERALLS_coverage_file_exists == 'true'
        uses: codecov/codecov-action@v5
        with:
          token: ${{ secrets.CODECOV_TOKEN }}
          slug: ThreeMammals/Ocelot
          fail_ci_if_error: true
          files: ${{ env.COVERALLS_coverage_file }}
          flags: unittests
        continue-on-error: true


================================================
FILE: .github/workflows/release.yml
================================================
name: Release
on:
  push:
    branches:
      - main
      - 'release/24.**'
jobs:
  build-windows:
    strategy:
      matrix:
        dotnet-version: [ '8', '9', '10' ]
    runs-on: windows-latest
    env:
      NUGET_PACKAGES: ${{ github.workspace }}/.nuget/packages
    steps:
      - name: Checkout
        uses: actions/checkout@v5
      - name: Setup .NET ${{ matrix.dotnet-version }}
        uses: actions/setup-dotnet@v5
        with:
          dotnet-version: ${{ matrix.dotnet-version }}.x
          cache: true
          cache-dependency-path: |
            samples/**/packages.lock.json
            src/**/packages.lock.json
            test/**/packages.lock.json
      - name: .NET Info
        run: dotnet --info
      - name: Add DNS-records
        run: ./.github/steps/windows.add-dns-records.ps1
      - name: Install certificate
        run: ./.github/steps/windows.install-certificate.ps1
      - name: Restore
        run: dotnet restore --locked-mode ./Ocelot.Release.sln
      - name: Build
        run: dotnet build --no-restore ./Ocelot.Release.sln --framework net${{ matrix.dotnet-version }}.0
      - name: Unit Tests
        run: dotnet test --no-restore --no-build --verbosity minimal --framework net${{ matrix.dotnet-version }}.0 --settings coverlet.runsettings ./test/Ocelot.UnitTests/Ocelot.UnitTests.csproj
      - name: Acceptance Tests
        run: dotnet test --no-restore --no-build --verbosity minimal --framework net${{ matrix.dotnet-version }}.0 --settings coverlet.runsettings ./test/Ocelot.AcceptanceTests/Ocelot.AcceptanceTests.csproj

  build-macos:
    needs: build-windows
    strategy:
      matrix:
        dotnet-version: [ '8', '9', '10' ]
    runs-on: macos-latest
    env:
      NUGET_PACKAGES: ${{ github.workspace }}/.nuget/packages
    steps:
      - name: Checkout
        uses: actions/checkout@v5
      - name: SH-scripts executable
        run: |
          chmod +x .github/steps/*.sh
          ls -l .github/steps/*.sh
      - name: Setup .NET ${{ matrix.dotnet-version }}
        uses: actions/setup-dotnet@v5
        with:
          dotnet-version: ${{ matrix.dotnet-version }}.x
          cache: true
          cache-dependency-path: |
            samples/**/packages.lock.json
            src/**/packages.lock.json
            test/**/packages.lock.json
      - name: .NET Info
        run: dotnet --info
      - name: Add DNS-records
        run: ./.github/steps/macos.add-dns-records.sh
      - name: Install certificate
        run: ./.github/steps/macos.install-certificate.sh
      - name: Restore
        run: dotnet restore --locked-mode ./Ocelot.Release.sln
      - name: Build
        run: dotnet build --no-restore ./Ocelot.Release.sln --framework net${{ matrix.dotnet-version }}.0
      - name: Unit Tests
        run: dotnet test --no-restore --no-build --verbosity minimal --framework net${{ matrix.dotnet-version }}.0 --settings coverlet.runsettings ./test/Ocelot.UnitTests/Ocelot.UnitTests.csproj
      - name: Acceptance Tests
        run: dotnet test --no-restore --no-build --verbosity minimal --framework net${{ matrix.dotnet-version }}.0 --settings coverlet.runsettings ./test/Ocelot.AcceptanceTests/Ocelot.AcceptanceTests.csproj

  build-linux:
    needs: build-macos
    strategy:
      matrix:
        dotnet-version: [ '8', '9', '10' ]
    runs-on: ubuntu-latest
    env:
      NUGET_PACKAGES: ${{ github.workspace }}/.nuget/packages
    steps:
      - name: Checkout
        uses: actions/checkout@v5
      - name: SH-scripts executable
        run: |
          chmod +x .github/steps/*.sh
          ls -l .github/steps/*.sh
      - name: Check .NET ${{ matrix.dotnet-version }}
        id: check-dotnet
        run: ./.github/steps/check-dotnet.sh ${{ matrix.dotnet-version }}
      - name: Setup .NET ${{ matrix.dotnet-version }}
        # if: env.DOTNET${{ matrix.dotnet-version }}_installed == 'false'
        uses: actions/setup-dotnet@v5
        with:
          dotnet-version: ${{ matrix.dotnet-version }}.x
          cache: true
          cache-dependency-path: |
            samples/**/packages.lock.json
            src/**/packages.lock.json
            test/**/packages.lock.json
      - name: .NET Info
        run: dotnet --info
      - name: Add DNS-records
        run: ./.github/steps/ubuntu.add-dns-records.sh  
      - name: Install certificate
        run: ./.github/steps/ubuntu.install-certificate.sh
      - name: Restore
        run: dotnet restore --locked-mode ./Ocelot.Release.sln
      - name: Build
        run: dotnet build --no-restore ./Ocelot.Release.sln --framework net${{ matrix.dotnet-version }}.0
      - name: Unit Tests
        run: dotnet test --no-restore --no-build --verbosity minimal --framework net${{ matrix.dotnet-version }}.0 --settings coverlet.runsettings ./test/Ocelot.UnitTests/Ocelot.UnitTests.csproj
      - name: Acceptance Tests
        run: dotnet test --no-restore --no-build --verbosity minimal --framework net${{ matrix.dotnet-version }}.0 --settings coverlet.runsettings ./test/Ocelot.AcceptanceTests/Ocelot.AcceptanceTests.csproj

  release-cake:
    needs: build-linux
    runs-on: ubuntu-latest
    environment: build.cake # TODO Rename to Release
    env:
      NUGET_PACKAGES: ${{ github.workspace }}/.nuget/packages
    steps:
      - name: Env Variables
        env:
          # CAKE_RELEASE_MYVAR: ${{ vars.CAKE_RELEASE_MYVAR }}
          # TEMP_KEY: ${{ secrets.TEMP_KEY }} # leaked secret LoL
          GITHUB_CONTEXT: ${{ toJson(github) }}
        run: |
          echo "github context >>>" # https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/accessing-contextual-information-about-workflow-runs#github-context
          echo "$GITHUB_CONTEXT"
          echo "<<<"
      - name: Checkout
        uses: actions/checkout@v5
        with:
          fetch-depth: 0
      - name: SH-scripts executable
        run: |
          chmod +x .github/steps/*.sh
          ls -l .github/steps/*.sh
      - name: Check .NET 10
        id: check-dotnet
        run: ./.github/steps/check-dotnet.sh 10
      - name: Setup .NET 10
        uses: actions/setup-dotnet@v5
        with:
          dotnet-version: 10.x
          cache: true
          cache-dependency-path: |
            samples/**/packages.lock.json
            src/**/packages.lock.json
            test/**/packages.lock.json
      - name: Cake Build
        uses: cake-build/cake-action@v3
        with:
          target: Release
        env:
          OCELOT_GITHUB_API_KEY: ${{ secrets.OCELOT_GITHUB_API_KEY }}
          OCELOT_NUGET_API_KEY_2025: ${{ secrets.OCELOT_NUGET_API_KEY_2025 }}
          # COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }}
      - name: Coverage files
        run: ./.github/steps/prepare-coveralls.sh
      - name: Coveralls
        if: env.COVERALLS_coverage_file_exists == 'true'
        uses: coverallsapp/github-action@v2
        with:
          file: ${{ env.COVERALLS_coverage_file }}
          compare-ref: main
        continue-on-error: true
      - name: Codecov
        if: env.COVERALLS_coverage_file_exists == 'true'
        uses: codecov/codecov-action@v5
        with:
          token: ${{ secrets.CODECOV_TOKEN }}
          slug: ThreeMammals/Ocelot
          fail_ci_if_error: true
          files: ${{ env.COVERALLS_coverage_file }}
          flags: unittests
        continue-on-error: true


================================================
FILE: .gitignore
================================================
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore

# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates

# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs

# Mono auto generated files
mono_crash.*

# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Ww][Ii][Nn]32/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
[Ll]ogs/

# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/

# Visual Studio 2017 auto generated files
Generated\ Files/

# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*

# NUnit
*.VisualState.xml
TestResult.xml
nunit-*.xml

# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c

# Benchmark Results
BenchmarkDotNet.Artifacts/

# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/

# ASP.NET Scaffolding
ScaffoldingReadMe.txt

# StyleCop
StyleCopReport.xml

# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.tlog
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc

# Chutzpah Test files
_Chutzpah*

# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb

# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap

# Visual Studio Trace Files
*.e2e

# TFS 2012 Local Workspace
$tf/

# Guidance Automation Toolkit
*.gpState

# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user

# TeamCity is a build add-in
_TeamCity*

# DotCover is a Code Coverage Tool
*.dotCover

# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json

# Coverlet is a free, cross platform Code Coverage Tool
coverage*.json
coverage*.xml
coverage*.info

# Visual Studio code coverage results
*.coverage
*.coveragexml

# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*

# MightyMoose
*.mm.*
AutoTest.Net/

# Web workbench (sass)
.sass-cache/

# Installshield output folder
[Ee]xpress/

# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html

# Click-Once directory
publish/

# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj

# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/

# NuGet Packages
*.nupkg
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets

# Microsoft Azure Build Output
csx/
*.build.csdef

# Microsoft Azure Emulator
ecf/
rcf/

# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload

# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/

# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs

# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk

# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/

# RIA/Silverlight projects
Generated_Code/

# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak

# SQL Server files
*.mdf
*.ldf
*.ndf

# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- [Bb]ackup.rdl
*- [Bb]ackup ([0-9]).rdl
*- [Bb]ackup ([0-9][0-9]).rdl

# Microsoft Fakes
FakesAssemblies/

# GhostDoc plugin setting file
*.GhostDoc.xml

# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/

# Visual Studio 6 build log
*.plg

# Visual Studio 6 workspace options file
*.opt

# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw

# Visual Studio 6 auto-generated project file (contains which files were open etc.)
*.vbp

# Visual Studio 6 workspace and project file (working project files containing files to include in project)
*.dsw
*.dsp

# Visual Studio 6 technical files
*.ncb
*.aps

# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions

# Paket dependency manager
.paket/paket.exe
paket-files/

# FAKE - F# Make
.fake/

# CodeRush personal settings
.cr/personal

# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc

# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config

# Tabs Studio
*.tss

# Telerik's JustMock configuration file
*.jmconfig

# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs

# OpenCover UI analysis results
OpenCover/

# Azure Stream Analytics local run output
ASALocalRun/

# MSBuild Binary and Structured Log
*.binlog

# NVidia Nsight GPU debugger configuration file
*.nvuser

# MFractors (Xamarin productivity tool) working folder
.mfractor/

# Local History for Visual Studio
.localhistory/

# Visual Studio History (VSHistory) files
.vshistory/

# BeatPulse healthcheck temp database
healthchecksdb

# Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/

# Ionide (cross platform F# VS Code tools) working folder
.ionide/

# Fody - auto-generated XML schema
FodyWeavers.xsd

# VS Code files for those working on multiple tools
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
*.code-workspace

# Local History for Visual Studio Code
.history/

# Windows Installer files from build outputs
*.cab
*.msi
*.msix
*.msm
*.msp

# JetBrains Rider
*.sln.iml
.idea/

# Visual Studio Test Results
# Quick Facts: https://file.org/extension/trx#visualstudiotestresults
# Running automated tests from the command line: https://learn.microsoft.com/en-us/previous-versions/ms182486(v=vs.140)
# Run unit tests with Test Explorer: https://learn.microsoft.com/en-us/visualstudio/test/run-unit-tests-with-test-explorer
*.trx

# OCELOT

# FAKE - F# Make
.fake/
!tools/packages.config
tools/

# ReportGenerator dotnet tool -> https://reportgenerator.io/
**/coveragereport/

# Ocelot acceptance test config
test/Ocelot.AcceptanceTests/ocelot.json

# Read the Docs -> https://ocelot.readthedocs.io
docs/_build/
docs/_templates/


================================================
FILE: .readthedocs.yaml
================================================
# .readthedocs.yaml
# Read the Docs configuration file
# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details

# Required
version: 2

# Set the OS, Python version and other tools you might need
build:
  os: ubuntu-24.04
  tools:
    python: "latest"
    # You can also specify other tool versions:
    # nodejs: "19"
    # rust: "1.64"
    # golang: "1.19"

# Build documentation in the "docs/" directory with Sphinx
sphinx:
   configuration: docs/conf.py

# Optionally build your docs in additional formats such as PDF and ePub
formats:
   - pdf
   - epub

# Optional but recommended, declare the Python requirements required to build your documentation
# See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html
python:
   install:
   - requirements: docs/requirements.txt


================================================
FILE: GitVersion.yml
================================================
mode: ContinuousDelivery
branches: {}
ignore:
  sha: []


================================================
FILE: LICENSE.md
================================================
The MIT License (MIT), Open Source Software,
Copyright © 2016-2026 Tom Gardham-Pallister, Raman Maksimchuk and contributors.

Permission is hereby granted, free of charge, to any person obtaining a copy of this open-source software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


================================================
FILE: Ocelot.Samples.sln
================================================

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 18
VisualStudioVersion = 18.3.11520.95 d18.3
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ocelot", "src\Ocelot\Ocelot.csproj", "{B37314F1-C1B5-4D38-8000-E6E96C0CBD30}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ocelot.Samples.Eureka.ApiGateway", "samples\Eureka\ApiGateway\Ocelot.Samples.Eureka.ApiGateway.csproj", "{EA0E146F-2C2B-4176-B6EC-F62A587F5077}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ocelot.Samples.Eureka.DownstreamService", "samples\Eureka\DownstreamService\Ocelot.Samples.Eureka.DownstreamService.csproj", "{B7317B64-2208-472D-90AC-F42B61956B79}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ocelot.Samples.GraphQL", "samples\GraphQL\Ocelot.Samples.GraphQL.csproj", "{6CCA3677-420A-4294-8D41-67CF3D818575}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ocelot.Samples.Kubernetes.ApiGateway", "samples\Kubernetes\ApiGateway\Ocelot.Samples.Kubernetes.ApiGateway.csproj", "{721C1737-70CB-4B11-A19B-C7AAC6856CC7}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ocelot.Samples.Kubernetes.DownstreamService", "samples\Kubernetes\DownstreamService\Ocelot.Samples.Kubernetes.DownstreamService.csproj", "{CE949A5D-9D25-46E3-B59A-DA63F7ED9A59}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ocelot.Samples.ServiceDiscovery.ApiGateway", "samples\ServiceDiscovery\ApiGateway\Ocelot.Samples.ServiceDiscovery.ApiGateway.csproj", "{96B9F16E-C95D-425A-A419-40CB3C90CB77}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ocelot.Samples.ServiceDiscovery.DownstreamService", "samples\ServiceDiscovery\DownstreamService\Ocelot.Samples.ServiceDiscovery.DownstreamService.csproj", "{60E14B1A-C295-453B-910E-58E09F5A28AA}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ocelot.Samples.ServiceFabric.ApiGateway", "samples\ServiceFabric\ApiGateway\Ocelot.Samples.ServiceFabric.ApiGateway.csproj", "{115F7934-3326-492A-B131-64F0EAEBAD71}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ocelot.Samples.ServiceFabric.DownstreamService", "samples\ServiceFabric\DownstreamService\Ocelot.Samples.ServiceFabric.DownstreamService.csproj", "{6C777A20-F557-45CF-B87B-11E3C6B29A36}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ocelot.Samples.Web", "samples\Web\Ocelot.Samples.Web.csproj", "{EA553F5C-4B94-4E4A-8C3E-0124C5EA5F6E}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ocelot.Samples.Basic", "samples\Basic\Ocelot.Samples.Basic.csproj", "{3225BD01-42ED-4362-9757-28CBFF6B2D70}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ocelot.Samples.Configuration", "samples\Configuration\Ocelot.Samples.Configuration.csproj", "{FE091795-7FBF-4D82-ABD6-51405F210142}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ocelot.Samples.Metadata", "samples\Metadata\Ocelot.Samples.Metadata.csproj", "{80EE7EA9-BB02-4F2D-B7E3-BB6A42F50658}"
EndProject
Global
	GlobalSection(SolutionConfigurationPlatforms) = preSolution
		Debug|Any CPU = Debug|Any CPU
		Release|Any CPU = Release|Any CPU
	EndGlobalSection
	GlobalSection(ProjectConfigurationPlatforms) = postSolution
		{B37314F1-C1B5-4D38-8000-E6E96C0CBD30}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{B37314F1-C1B5-4D38-8000-E6E96C0CBD30}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{B37314F1-C1B5-4D38-8000-E6E96C0CBD30}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{B37314F1-C1B5-4D38-8000-E6E96C0CBD30}.Release|Any CPU.Build.0 = Release|Any CPU
		{EA0E146F-2C2B-4176-B6EC-F62A587F5077}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{EA0E146F-2C2B-4176-B6EC-F62A587F5077}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{EA0E146F-2C2B-4176-B6EC-F62A587F5077}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{EA0E146F-2C2B-4176-B6EC-F62A587F5077}.Release|Any CPU.Build.0 = Release|Any CPU
		{B7317B64-2208-472D-90AC-F42B61956B79}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{B7317B64-2208-472D-90AC-F42B61956B79}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{B7317B64-2208-472D-90AC-F42B61956B79}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{B7317B64-2208-472D-90AC-F42B61956B79}.Release|Any CPU.Build.0 = Release|Any CPU
		{6CCA3677-420A-4294-8D41-67CF3D818575}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{6CCA3677-420A-4294-8D41-67CF3D818575}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{6CCA3677-420A-4294-8D41-67CF3D818575}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{6CCA3677-420A-4294-8D41-67CF3D818575}.Release|Any CPU.Build.0 = Release|Any CPU
		{721C1737-70CB-4B11-A19B-C7AAC6856CC7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{721C1737-70CB-4B11-A19B-C7AAC6856CC7}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{721C1737-70CB-4B11-A19B-C7AAC6856CC7}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{721C1737-70CB-4B11-A19B-C7AAC6856CC7}.Release|Any CPU.Build.0 = Release|Any CPU
		{CE949A5D-9D25-46E3-B59A-DA63F7ED9A59}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{CE949A5D-9D25-46E3-B59A-DA63F7ED9A59}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{CE949A5D-9D25-46E3-B59A-DA63F7ED9A59}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{CE949A5D-9D25-46E3-B59A-DA63F7ED9A59}.Release|Any CPU.Build.0 = Release|Any CPU
		{96B9F16E-C95D-425A-A419-40CB3C90CB77}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{96B9F16E-C95D-425A-A419-40CB3C90CB77}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{96B9F16E-C95D-425A-A419-40CB3C90CB77}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{96B9F16E-C95D-425A-A419-40CB3C90CB77}.Release|Any CPU.Build.0 = Release|Any CPU
		{60E14B1A-C295-453B-910E-58E09F5A28AA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{60E14B1A-C295-453B-910E-58E09F5A28AA}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{60E14B1A-C295-453B-910E-58E09F5A28AA}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{60E14B1A-C295-453B-910E-58E09F5A28AA}.Release|Any CPU.Build.0 = Release|Any CPU
		{115F7934-3326-492A-B131-64F0EAEBAD71}.Debug|Any CPU.ActiveCfg = Debug|x64
		{115F7934-3326-492A-B131-64F0EAEBAD71}.Debug|Any CPU.Build.0 = Debug|x64
		{115F7934-3326-492A-B131-64F0EAEBAD71}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{115F7934-3326-492A-B131-64F0EAEBAD71}.Release|Any CPU.Build.0 = Release|Any CPU
		{6C777A20-F557-45CF-B87B-11E3C6B29A36}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{6C777A20-F557-45CF-B87B-11E3C6B29A36}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{6C777A20-F557-45CF-B87B-11E3C6B29A36}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{6C777A20-F557-45CF-B87B-11E3C6B29A36}.Release|Any CPU.Build.0 = Release|Any CPU
		{EA553F5C-4B94-4E4A-8C3E-0124C5EA5F6E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{EA553F5C-4B94-4E4A-8C3E-0124C5EA5F6E}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{EA553F5C-4B94-4E4A-8C3E-0124C5EA5F6E}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{EA553F5C-4B94-4E4A-8C3E-0124C5EA5F6E}.Release|Any CPU.Build.0 = Release|Any CPU
		{3225BD01-42ED-4362-9757-28CBFF6B2D70}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{3225BD01-42ED-4362-9757-28CBFF6B2D70}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{3225BD01-42ED-4362-9757-28CBFF6B2D70}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{3225BD01-42ED-4362-9757-28CBFF6B2D70}.Release|Any CPU.Build.0 = Release|Any CPU
		{FE091795-7FBF-4D82-ABD6-51405F210142}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{FE091795-7FBF-4D82-ABD6-51405F210142}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{FE091795-7FBF-4D82-ABD6-51405F210142}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{FE091795-7FBF-4D82-ABD6-51405F210142}.Release|Any CPU.Build.0 = Release|Any CPU
		{80EE7EA9-BB02-4F2D-B7E3-BB6A42F50658}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{80EE7EA9-BB02-4F2D-B7E3-BB6A42F50658}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{80EE7EA9-BB02-4F2D-B7E3-BB6A42F50658}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{80EE7EA9-BB02-4F2D-B7E3-BB6A42F50658}.Release|Any CPU.Build.0 = Release|Any CPU
	EndGlobalSection
	GlobalSection(SolutionProperties) = preSolution
		HideSolutionNode = FALSE
	EndGlobalSection
	GlobalSection(ExtensibilityGlobals) = postSolution
		SolutionGuid = {2C1620D4-EB38-4C3E-9FC5-029FB6B2F426}
	EndGlobalSection
EndGlobal


================================================
FILE: Ocelot.Samples.slnx
================================================
<Solution>
  <Project Path="samples/Basic/Ocelot.Samples.Basic.csproj" />
  <Project Path="samples/Configuration/Ocelot.Samples.Configuration.csproj" />
  <Project Path="samples/Eureka/ApiGateway/Ocelot.Samples.Eureka.ApiGateway.csproj" />
  <Project Path="samples/Eureka/DownstreamService/Ocelot.Samples.Eureka.DownstreamService.csproj" />
  <Project Path="samples/GraphQL/Ocelot.Samples.GraphQL.csproj" />
  <Project Path="samples/Kubernetes/ApiGateway/Ocelot.Samples.Kubernetes.ApiGateway.csproj" />
  <Project Path="samples/Kubernetes/DownstreamService/Ocelot.Samples.Kubernetes.DownstreamService.csproj" />
  <Project Path="samples/Metadata/Ocelot.Samples.Metadata.csproj" />
  <Project Path="samples/OpenTracing/Ocelot.Samples.OpenTracing.csproj" />
  <Project Path="samples/ServiceDiscovery/ApiGateway/Ocelot.Samples.ServiceDiscovery.ApiGateway.csproj" />
  <Project Path="samples/ServiceDiscovery/DownstreamService/Ocelot.Samples.ServiceDiscovery.DownstreamService.csproj" />
  <Project Path="samples/ServiceFabric/ApiGateway/Ocelot.Samples.ServiceFabric.ApiGateway.csproj" />
  <Project Path="samples/ServiceFabric/DownstreamService/Ocelot.Samples.ServiceFabric.DownstreamService.csproj" />
  <Project Path="samples/Web/Ocelot.Samples.Web.csproj" />
  <Project Path="src/Ocelot/Ocelot.csproj" />
</Solution>


================================================
FILE: Ocelot.sln
================================================

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 18
VisualStudioVersion = 18.3.11520.95
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{3FA7C349-DBE8-4904-A2CE-015B8869CE6C}"
	ProjectSection(SolutionItems) = preProject
		.dockerignore = .dockerignore
		.editorconfig = .editorconfig
		.gitignore = .gitignore
		.readthedocs.yaml = .readthedocs.yaml
		build.cake = build.cake
		codeanalysis.ruleset = codeanalysis.ruleset
		GitVersion.yml = GitVersion.yml
		LICENSE.md = LICENSE.md
		README.md = README.md
		ReleaseNotes.md = ReleaseNotes.md
	EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ocelot.Testing", "testing\Ocelot.Testing.csproj", "{D9DF2863-0608-4BBC-8D83-614E2894AF49}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ocelot.AcceptanceTests", "test\Ocelot.AcceptanceTests\Ocelot.AcceptanceTests.csproj", "{AA97C983-5A39-D35D-0274-08247BB08FAC}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ocelot.Benchmarks", "test\Ocelot.Benchmarks\Ocelot.Benchmarks.csproj", "{075F01AD-8478-3463-2BB9-D04EE5C98321}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ocelot.ManualTest", "test\Ocelot.ManualTest\Ocelot.ManualTest.csproj", "{DE9F1F3D-7687-9248-E4D8-5684370E185F}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ocelot.UnitTests", "test\Ocelot.UnitTests\Ocelot.UnitTests.csproj", "{47A6D609-F9EF-AE65-3904-5DBF15B0DEF1}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ocelot", "src\Ocelot\Ocelot.csproj", "{AB0A194F-36A2-D62B-51FD-44335BE12D1B}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ocelot.Provider.Consul", "src\Ocelot.Provider.Consul\Ocelot.Provider.Consul.csproj", "{F38B5372-D141-3A0D-6FF8-30EFA93C7506}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ocelot.Provider.Eureka", "src\Ocelot.Provider.Eureka\Ocelot.Provider.Eureka.csproj", "{3C77D0A0-173A-628F-FA3C-E113B9501E89}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ocelot.Provider.Kubernetes", "src\Ocelot.Provider.Kubernetes\Ocelot.Provider.Kubernetes.csproj", "{1FD9E0B6-EC08-54E4-82F2-A215A388968D}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ocelot.Provider.Polly", "src\Ocelot.Provider.Polly\Ocelot.Provider.Polly.csproj", "{1424441E-1143-0F05-1346-E90195CDE10E}"
EndProject
Global
	GlobalSection(SolutionConfigurationPlatforms) = preSolution
		Debug|Any CPU = Debug|Any CPU
		Debug|x64 = Debug|x64
		Debug|x86 = Debug|x86
		Release|Any CPU = Release|Any CPU
		Release|x64 = Release|x64
		Release|x86 = Release|x86
	EndGlobalSection
	GlobalSection(ProjectConfigurationPlatforms) = postSolution
		{D9DF2863-0608-4BBC-8D83-614E2894AF49}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{D9DF2863-0608-4BBC-8D83-614E2894AF49}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{D9DF2863-0608-4BBC-8D83-614E2894AF49}.Debug|x64.ActiveCfg = Debug|Any CPU
		{D9DF2863-0608-4BBC-8D83-614E2894AF49}.Debug|x64.Build.0 = Debug|Any CPU
		{D9DF2863-0608-4BBC-8D83-614E2894AF49}.Debug|x86.ActiveCfg = Debug|Any CPU
		{D9DF2863-0608-4BBC-8D83-614E2894AF49}.Debug|x86.Build.0 = Debug|Any CPU
		{D9DF2863-0608-4BBC-8D83-614E2894AF49}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{D9DF2863-0608-4BBC-8D83-614E2894AF49}.Release|Any CPU.Build.0 = Release|Any CPU
		{D9DF2863-0608-4BBC-8D83-614E2894AF49}.Release|x64.ActiveCfg = Release|Any CPU
		{D9DF2863-0608-4BBC-8D83-614E2894AF49}.Release|x64.Build.0 = Release|Any CPU
		{D9DF2863-0608-4BBC-8D83-614E2894AF49}.Release|x86.ActiveCfg = Release|Any CPU
		{D9DF2863-0608-4BBC-8D83-614E2894AF49}.Release|x86.Build.0 = Release|Any CPU
		{AA97C983-5A39-D35D-0274-08247BB08FAC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{AA97C983-5A39-D35D-0274-08247BB08FAC}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{AA97C983-5A39-D35D-0274-08247BB08FAC}.Debug|x64.ActiveCfg = Debug|Any CPU
		{AA97C983-5A39-D35D-0274-08247BB08FAC}.Debug|x64.Build.0 = Debug|Any CPU
		{AA97C983-5A39-D35D-0274-08247BB08FAC}.Debug|x86.ActiveCfg = Debug|Any CPU
		{AA97C983-5A39-D35D-0274-08247BB08FAC}.Debug|x86.Build.0 = Debug|Any CPU
		{AA97C983-5A39-D35D-0274-08247BB08FAC}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{AA97C983-5A39-D35D-0274-08247BB08FAC}.Release|Any CPU.Build.0 = Release|Any CPU
		{AA97C983-5A39-D35D-0274-08247BB08FAC}.Release|x64.ActiveCfg = Release|Any CPU
		{AA97C983-5A39-D35D-0274-08247BB08FAC}.Release|x64.Build.0 = Release|Any CPU
		{AA97C983-5A39-D35D-0274-08247BB08FAC}.Release|x86.ActiveCfg = Release|Any CPU
		{AA97C983-5A39-D35D-0274-08247BB08FAC}.Release|x86.Build.0 = Release|Any CPU
		{075F01AD-8478-3463-2BB9-D04EE5C98321}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{075F01AD-8478-3463-2BB9-D04EE5C98321}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{075F01AD-8478-3463-2BB9-D04EE5C98321}.Debug|x64.ActiveCfg = Debug|Any CPU
		{075F01AD-8478-3463-2BB9-D04EE5C98321}.Debug|x64.Build.0 = Debug|Any CPU
		{075F01AD-8478-3463-2BB9-D04EE5C98321}.Debug|x86.ActiveCfg = Debug|Any CPU
		{075F01AD-8478-3463-2BB9-D04EE5C98321}.Debug|x86.Build.0 = Debug|Any CPU
		{075F01AD-8478-3463-2BB9-D04EE5C98321}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{075F01AD-8478-3463-2BB9-D04EE5C98321}.Release|Any CPU.Build.0 = Release|Any CPU
		{075F01AD-8478-3463-2BB9-D04EE5C98321}.Release|x64.ActiveCfg = Release|Any CPU
		{075F01AD-8478-3463-2BB9-D04EE5C98321}.Release|x64.Build.0 = Release|Any CPU
		{075F01AD-8478-3463-2BB9-D04EE5C98321}.Release|x86.ActiveCfg = Release|Any CPU
		{075F01AD-8478-3463-2BB9-D04EE5C98321}.Release|x86.Build.0 = Release|Any CPU
		{DE9F1F3D-7687-9248-E4D8-5684370E185F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{DE9F1F3D-7687-9248-E4D8-5684370E185F}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{DE9F1F3D-7687-9248-E4D8-5684370E185F}.Debug|x64.ActiveCfg = Debug|Any CPU
		{DE9F1F3D-7687-9248-E4D8-5684370E185F}.Debug|x64.Build.0 = Debug|Any CPU
		{DE9F1F3D-7687-9248-E4D8-5684370E185F}.Debug|x86.ActiveCfg = Debug|Any CPU
		{DE9F1F3D-7687-9248-E4D8-5684370E185F}.Debug|x86.Build.0 = Debug|Any CPU
		{DE9F1F3D-7687-9248-E4D8-5684370E185F}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{DE9F1F3D-7687-9248-E4D8-5684370E185F}.Release|Any CPU.Build.0 = Release|Any CPU
		{DE9F1F3D-7687-9248-E4D8-5684370E185F}.Release|x64.ActiveCfg = Release|Any CPU
		{DE9F1F3D-7687-9248-E4D8-5684370E185F}.Release|x64.Build.0 = Release|Any CPU
		{DE9F1F3D-7687-9248-E4D8-5684370E185F}.Release|x86.ActiveCfg = Release|Any CPU
		{DE9F1F3D-7687-9248-E4D8-5684370E185F}.Release|x86.Build.0 = Release|Any CPU
		{47A6D609-F9EF-AE65-3904-5DBF15B0DEF1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{47A6D609-F9EF-AE65-3904-5DBF15B0DEF1}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{47A6D609-F9EF-AE65-3904-5DBF15B0DEF1}.Debug|x64.ActiveCfg = Debug|Any CPU
		{47A6D609-F9EF-AE65-3904-5DBF15B0DEF1}.Debug|x64.Build.0 = Debug|Any CPU
		{47A6D609-F9EF-AE65-3904-5DBF15B0DEF1}.Debug|x86.ActiveCfg = Debug|Any CPU
		{47A6D609-F9EF-AE65-3904-5DBF15B0DEF1}.Debug|x86.Build.0 = Debug|Any CPU
		{47A6D609-F9EF-AE65-3904-5DBF15B0DEF1}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{47A6D609-F9EF-AE65-3904-5DBF15B0DEF1}.Release|Any CPU.Build.0 = Release|Any CPU
		{47A6D609-F9EF-AE65-3904-5DBF15B0DEF1}.Release|x64.ActiveCfg = Release|Any CPU
		{47A6D609-F9EF-AE65-3904-5DBF15B0DEF1}.Release|x64.Build.0 = Release|Any CPU
		{47A6D609-F9EF-AE65-3904-5DBF15B0DEF1}.Release|x86.ActiveCfg = Release|Any CPU
		{47A6D609-F9EF-AE65-3904-5DBF15B0DEF1}.Release|x86.Build.0 = Release|Any CPU
		{AB0A194F-36A2-D62B-51FD-44335BE12D1B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{AB0A194F-36A2-D62B-51FD-44335BE12D1B}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{AB0A194F-36A2-D62B-51FD-44335BE12D1B}.Debug|x64.ActiveCfg = Debug|Any CPU
		{AB0A194F-36A2-D62B-51FD-44335BE12D1B}.Debug|x64.Build.0 = Debug|Any CPU
		{AB0A194F-36A2-D62B-51FD-44335BE12D1B}.Debug|x86.ActiveCfg = Debug|Any CPU
		{AB0A194F-36A2-D62B-51FD-44335BE12D1B}.Debug|x86.Build.0 = Debug|Any CPU
		{AB0A194F-36A2-D62B-51FD-44335BE12D1B}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{AB0A194F-36A2-D62B-51FD-44335BE12D1B}.Release|Any CPU.Build.0 = Release|Any CPU
		{AB0A194F-36A2-D62B-51FD-44335BE12D1B}.Release|x64.ActiveCfg = Release|Any CPU
		{AB0A194F-36A2-D62B-51FD-44335BE12D1B}.Release|x64.Build.0 = Release|Any CPU
		{AB0A194F-36A2-D62B-51FD-44335BE12D1B}.Release|x86.ActiveCfg = Release|Any CPU
		{AB0A194F-36A2-D62B-51FD-44335BE12D1B}.Release|x86.Build.0 = Release|Any CPU
		{F38B5372-D141-3A0D-6FF8-30EFA93C7506}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{F38B5372-D141-3A0D-6FF8-30EFA93C7506}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{F38B5372-D141-3A0D-6FF8-30EFA93C7506}.Debug|x64.ActiveCfg = Debug|Any CPU
		{F38B5372-D141-3A0D-6FF8-30EFA93C7506}.Debug|x64.Build.0 = Debug|Any CPU
		{F38B5372-D141-3A0D-6FF8-30EFA93C7506}.Debug|x86.ActiveCfg = Debug|Any CPU
		{F38B5372-D141-3A0D-6FF8-30EFA93C7506}.Debug|x86.Build.0 = Debug|Any CPU
		{F38B5372-D141-3A0D-6FF8-30EFA93C7506}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{F38B5372-D141-3A0D-6FF8-30EFA93C7506}.Release|Any CPU.Build.0 = Release|Any CPU
		{F38B5372-D141-3A0D-6FF8-30EFA93C7506}.Release|x64.ActiveCfg = Release|Any CPU
		{F38B5372-D141-3A0D-6FF8-30EFA93C7506}.Release|x64.Build.0 = Release|Any CPU
		{F38B5372-D141-3A0D-6FF8-30EFA93C7506}.Release|x86.ActiveCfg = Release|Any CPU
		{F38B5372-D141-3A0D-6FF8-30EFA93C7506}.Release|x86.Build.0 = Release|Any CPU
		{3C77D0A0-173A-628F-FA3C-E113B9501E89}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{3C77D0A0-173A-628F-FA3C-E113B9501E89}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{3C77D0A0-173A-628F-FA3C-E113B9501E89}.Debug|x64.ActiveCfg = Debug|Any CPU
		{3C77D0A0-173A-628F-FA3C-E113B9501E89}.Debug|x64.Build.0 = Debug|Any CPU
		{3C77D0A0-173A-628F-FA3C-E113B9501E89}.Debug|x86.ActiveCfg = Debug|Any CPU
		{3C77D0A0-173A-628F-FA3C-E113B9501E89}.Debug|x86.Build.0 = Debug|Any CPU
		{3C77D0A0-173A-628F-FA3C-E113B9501E89}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{3C77D0A0-173A-628F-FA3C-E113B9501E89}.Release|Any CPU.Build.0 = Release|Any CPU
		{3C77D0A0-173A-628F-FA3C-E113B9501E89}.Release|x64.ActiveCfg = Release|Any CPU
		{3C77D0A0-173A-628F-FA3C-E113B9501E89}.Release|x64.Build.0 = Release|Any CPU
		{3C77D0A0-173A-628F-FA3C-E113B9501E89}.Release|x86.ActiveCfg = Release|Any CPU
		{3C77D0A0-173A-628F-FA3C-E113B9501E89}.Release|x86.Build.0 = Release|Any CPU
		{1FD9E0B6-EC08-54E4-82F2-A215A388968D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{1FD9E0B6-EC08-54E4-82F2-A215A388968D}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{1FD9E0B6-EC08-54E4-82F2-A215A388968D}.Debug|x64.ActiveCfg = Debug|Any CPU
		{1FD9E0B6-EC08-54E4-82F2-A215A388968D}.Debug|x64.Build.0 = Debug|Any CPU
		{1FD9E0B6-EC08-54E4-82F2-A215A388968D}.Debug|x86.ActiveCfg = Debug|Any CPU
		{1FD9E0B6-EC08-54E4-82F2-A215A388968D}.Debug|x86.Build.0 = Debug|Any CPU
		{1FD9E0B6-EC08-54E4-82F2-A215A388968D}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{1FD9E0B6-EC08-54E4-82F2-A215A388968D}.Release|Any CPU.Build.0 = Release|Any CPU
		{1FD9E0B6-EC08-54E4-82F2-A215A388968D}.Release|x64.ActiveCfg = Release|Any CPU
		{1FD9E0B6-EC08-54E4-82F2-A215A388968D}.Release|x64.Build.0 = Release|Any CPU
		{1FD9E0B6-EC08-54E4-82F2-A215A388968D}.Release|x86.ActiveCfg = Release|Any CPU
		{1FD9E0B6-EC08-54E4-82F2-A215A388968D}.Release|x86.Build.0 = Release|Any CPU
		{1424441E-1143-0F05-1346-E90195CDE10E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{1424441E-1143-0F05-1346-E90195CDE10E}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{1424441E-1143-0F05-1346-E90195CDE10E}.Debug|x64.ActiveCfg = Debug|Any CPU
		{1424441E-1143-0F05-1346-E90195CDE10E}.Debug|x64.Build.0 = Debug|Any CPU
		{1424441E-1143-0F05-1346-E90195CDE10E}.Debug|x86.ActiveCfg = Debug|Any CPU
		{1424441E-1143-0F05-1346-E90195CDE10E}.Debug|x86.Build.0 = Debug|Any CPU
		{1424441E-1143-0F05-1346-E90195CDE10E}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{1424441E-1143-0F05-1346-E90195CDE10E}.Release|Any CPU.Build.0 = Release|Any CPU
		{1424441E-1143-0F05-1346-E90195CDE10E}.Release|x64.ActiveCfg = Release|Any CPU
		{1424441E-1143-0F05-1346-E90195CDE10E}.Release|x64.Build.0 = Release|Any CPU
		{1424441E-1143-0F05-1346-E90195CDE10E}.Release|x86.ActiveCfg = Release|Any CPU
		{1424441E-1143-0F05-1346-E90195CDE10E}.Release|x86.Build.0 = Release|Any CPU
	EndGlobalSection
	GlobalSection(SolutionProperties) = preSolution
		HideSolutionNode = FALSE
	EndGlobalSection
	GlobalSection(ExtensibilityGlobals) = postSolution
		SolutionGuid = {21476EFF-778A-4F97-8A56-D1AF1CEC0C48}
	EndGlobalSection
EndGlobal


================================================
FILE: Ocelot.slnx
================================================
<Solution>
  <Project Path="src/Ocelot/Ocelot.csproj" />
  <Project Path="src/Ocelot.Provider.Consul/Ocelot.Provider.Consul.csproj" />
  <Project Path="src/Ocelot.Provider.Eureka/Ocelot.Provider.Eureka.csproj" />
  <Project Path="src/Ocelot.Provider.Kubernetes/Ocelot.Provider.Kubernetes.csproj" />
  <Project Path="src/Ocelot.Provider.Polly/Ocelot.Provider.Polly.csproj" />
  <Project Path="test/Ocelot.AcceptanceTests/Ocelot.AcceptanceTests.csproj" />
  <Project Path="test/Ocelot.Benchmarks/Ocelot.Benchmarks.csproj" />
  <Project Path="test/Ocelot.ManualTest/Ocelot.ManualTest.csproj" />
  <Project Path="test/Ocelot.UnitTests/Ocelot.UnitTests.csproj" />
  <Project Path="testing/Ocelot.Testing.csproj" />
</Solution>


================================================
FILE: README.md
================================================
![Ocelot Logo](https://raw.githubusercontent.com/ThreeMammals/Ocelot/refs/heads/assets/images/ocelot_logo.png)

[![Release Status](https://github.com/ThreeMammals/Ocelot/actions/workflows/release.yml/badge.svg)](https://github.com/ThreeMammals/Ocelot/actions/workflows/release.yml)
[![Development Status](https://github.com/ThreeMammals/Ocelot/actions/workflows/develop.yml/badge.svg)](https://github.com/ThreeMammals/Ocelot/actions/workflows/develop.yml)
[![ReadTheDocs](https://readthedocs.org/projects/ocelot/badge/?version=develop&style=flat-square)](https://app.readthedocs.org/projects/ocelot/builds/?version__slug=develop)
[![coveralls](https://img.shields.io/coveralls/github/ThreeMammals/Ocelot/develop?label=coveralls&logo=coveralls&logoColor=white)](https://coveralls.io/github/ThreeMammals/Ocelot?branch=develop)
[![codecov](https://codecov.io/gh/ThreeMammals/Ocelot/branch/develop/graph/badge.svg)](https://codecov.io/gh/ThreeMammals/Ocelot)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/ThreeMammals/Ocelot/blob/main/LICENSE.md)
[![NuGet](https://img.shields.io/nuget/v/Ocelot?logo=nuget&label=NuGet&color=blue)](https://www.nuget.org/packages/Ocelot/ "Download Ocelot from NuGet.org")
[![Downloads](https://img.shields.io/nuget/dt/Ocelot?logo=nuget&label=Downloads)](https://www.nuget.org/packages/Ocelot/ "Total Ocelot downloads from NuGet.org")
<!-- [![Coveralls](https://coveralls.io/repos/github/ThreeMammals/Ocelot/badge.svg?branch=develop)](https://coveralls.io/github/ThreeMammals/Ocelot?branch=develop) -->

[~docspassing]: https://img.shields.io/badge/Docs-passing-44CC11?style=flat-square
[~docsfailing]: https://img.shields.io/badge/Docs-failing-red?style=flat-square

## About
Ocelot is a .NET [API gateway](https://www.bing.com/search?q=API+gateway).
This project is aimed at people using .NET running a microservices (service-oriented) architecture that needs a unified point of entry into their system.
However, it will work with anything that speaks HTTP(S) and runs on any platform that [ASP.NET Core](https://learn.microsoft.com/en-us/aspnet/core/) supports.

<!--
In particular we want easy integration with [IdentityServer](https://github.com/IdentityServer) reference and [Bearer](https://oauth.net/2/bearer-tokens/) tokens. 
We have been unable to find this in our current workplace without having to write our own Javascript middlewares to handle the IdentityServer reference tokens.
We would rather use the IdentityServer code that already exists to do this.
-->

Ocelot consists of a series of ASP.NET Core [middlewares](https://learn.microsoft.com/en-us/aspnet/core/fundamentals/middleware/) arranged in a specific order.
Ocelot [custom middlewares](https://learn.microsoft.com/en-us/aspnet/core/fundamentals/middleware/write) manipulate the `HttpRequest` object into a state specified by its configuration until it reaches a request builder middleware, where it creates a `HttpRequestMessage` object, which is used to make a request to a downstream service.
The middleware that makes the request is the last thing in the Ocelot pipeline. It does not call the next middleware.
The response from the downstream service is retrieved as the request goes back up the Ocelot pipeline.
There is a piece of middleware that maps the `HttpResponseMessage` onto the `HttpResponse` object, and that is returned to the client.
That is basically it, with a bunch of other features!

## Install
Ocelot is designed to work with [ASP.NET Core](https://learn.microsoft.com/en-us/aspnet/core/) and it targets `net9.0` [STS](https://dotnet.microsoft.com/en-us/platform/support/policy/dotnet-core#release-types) and `net8.0`, `net10.0` [LTS](https://dotnet.microsoft.com/en-us/platform/support/policy/dotnet-core#release-types) target framework monikers ([TFMs](https://learn.microsoft.com/en-us/dotnet/standard/frameworks#supported-target-frameworks)). [^1]

Install [Ocelot](https://www.nuget.org/packages/Ocelot) package and its dependencies using NuGet package manager:
```powershell
Install-Package Ocelot
```
Or via the .NET CLI:
```shell
dotnet add package Ocelot
```
> All versions are available [on NuGet](https://www.nuget.org/packages/Ocelot#versions-body-tab).

## Documentation
- [RST-sources](https://github.com/ThreeMammals/Ocelot/tree/develop/docs):
  This includes the source code for the documentation (in reStructuredText format, .rst files), which is up to date for the current [development](https://github.com/ThreeMammals/Ocelot/tree/develop/).
  And the rendered HTML documentation is available [here](https://ocelot.readthedocs.io/en/develop/).
- [Read the Docs](https://ocelot.readthedocs.io):
  This official website, in HTML format, contains a wealth of information and will be helpful if you want to understand the [features](#features) that Ocelot currently offers.
  The rendered HTML documentation, which is currently in [development](https://github.com/ThreeMammals/Ocelot/tree/develop/docs), is available [here](https://ocelot.readthedocs.io/en/develop/).
- [Ask Ocelot Guru](https://gurubase.io/g/ocelot):
  It is an AI focused on Ocelot, designed to answer your questions. [^2]

## Features
The primary features—[Configuration](https://ocelot.readthedocs.io/en/latest/features/configuration.html) and [Routing](https://ocelot.readthedocs.io/en/latest/features/routing.html)—are always utilized by users, even in a minimal app setup, without customizations or extra configurations.
Ocelot's capabilities are categorized into three main groups of features: *solid*, *hybrid*, and *feature-family* groups, which are explained below.
- *Solid features* are unique to Ocelot. They do not contain subfeatures and are not related to other features.
- *Hybrid features*, on the other hand, have multiple relationships with other features and can be part of other features.
- *Feature families* are large groups that consist of multiple subfeatures.

| Group | Features |
|-------|----------|
|Primary|[Configuration](https://ocelot.readthedocs.io/en/latest/features/configuration.html), [Routing](https://ocelot.readthedocs.io/en/latest/features/routing.html)|
| Solid |[Caching](https://ocelot.readthedocs.io/en/latest/features/caching.html), [Delegating Handlers](https://ocelot.readthedocs.io/en/latest/features/delegatinghandlers.html), [Quality of Service](https://ocelot.readthedocs.io/en/latest/features/qualityofservice.html)[^3], [Rate Limiting](https://ocelot.readthedocs.io/en/latest/features/ratelimiting.html)|
| Hybrid|[Administration](https://ocelot.readthedocs.io/en/latest/features/administration.html), [Aggregation](https://ocelot.readthedocs.io/en/latest/features/aggregation.html)[^4], [Authentication](https://ocelot.readthedocs.io/en/latest/features/authentication.html), [Configuration](https://ocelot.readthedocs.io/en/latest/features/configuration.html), [Dependency Injection](https://ocelot.readthedocs.io/en/latest/features/dependencyinjection.html), [Load Balancer](https://ocelot.readthedocs.io/en/latest/features/loadbalancer.html)|
|Family|[Configuration](https://ocelot.readthedocs.io/en/latest/features/configuration.html), [Routing](https://ocelot.readthedocs.io/en/latest/features/routing.html), [Logging](https://ocelot.readthedocs.io/en/latest/features/logging.html), [Transformations](https://ocelot.readthedocs.io/en/latest/search.html?q=Transformation), [Service Discovery](https://ocelot.readthedocs.io/en/latest/features/servicediscovery.html)[^5] |

Feature groups are explained in the table below

| Feature | Relationships and Notes |
|---------|-------------------------|
| [Administration](https://ocelot.readthedocs.io/en/latest/features/administration.html) | [Administration](https://ocelot.readthedocs.io/en/latest/features/administration.html) heavily depends on [Authentication](https://ocelot.readthedocs.io/en/latest/features/authentication.html), and [Administration API](https://ocelot.readthedocs.io/en/latest/features/administration.html#administration-api) methods are part of [Authentication](https://ocelot.readthedocs.io/en/latest/features/authentication.html), [Caching](https://ocelot.readthedocs.io/en/latest/features/caching.html), and [Configuration](https://ocelot.readthedocs.io/en/latest/features/configuration.html) |
| [Aggregation](https://ocelot.readthedocs.io/en/latest/features/aggregation.html)[^4] | [Aggregation](https://ocelot.readthedocs.io/en/latest/features/aggregation.html) relies on [Routing](https://ocelot.readthedocs.io/en/latest/features/routing.html) |
| [Authentication](https://ocelot.readthedocs.io/en/latest/features/authentication.html) | [Authentication](https://ocelot.readthedocs.io/en/latest/features/authentication.html) followed by [Authorization](https://ocelot.readthedocs.io/en/latest/features/authorization.html) |
| [Configuration](https://ocelot.readthedocs.io/en/latest/features/configuration.html) | [Configuration](https://ocelot.readthedocs.io/en/latest/features/configuration.html) depends on [Dependency Injection](https://ocelot.readthedocs.io/en/latest/features/dependencyinjection.html), including `GET`/`POST` operations via the [Administration REST API](https://ocelot.readthedocs.io/en/latest/features/administration.html#administration-api), a specialized [Websockets](https://ocelot.readthedocs.io/en/latest/features/websockets.html) scheme/protocol, advanced [Middleware Injection](https://ocelot.readthedocs.io/en/latest/features/middlewareinjection.html), and [Metadata](https://ocelot.readthedocs.io/en/latest/features/metadata.html)-based extensions |
| [Routing](https://ocelot.readthedocs.io/en/latest/features/routing.html) | [Routing](https://ocelot.readthedocs.io/en/latest/features/routing.html) offers specialized [Websockets](https://ocelot.readthedocs.io/en/latest/features/websockets.html) and [Dynamic Routing](https://ocelot.readthedocs.io/en/latest/features/servicediscovery.html#dynamic-routing) modes but does not support [GraphQL](https://ocelot.readthedocs.io/en/latest/features/graphql.html)[^6] |
| [Load Balancer](https://ocelot.readthedocs.io/en/latest/features/loadbalancer.html) | [Load Balancer](https://ocelot.readthedocs.io/en/latest/features/loadbalancer.html) is a critical dependency for [Service Discovery](https://ocelot.readthedocs.io/en/latest/features/servicediscovery.html) |
| [Logging](https://ocelot.readthedocs.io/en/latest/features/logging.html) | [Logging](https://ocelot.readthedocs.io/en/latest/features/logging.html) includes [Error Handling](https://ocelot.readthedocs.io/en/latest/features/errorcodes.html) and [Tracing](https://ocelot.readthedocs.io/en/latest/features/tracing.html) |
| [Service Discovery](https://ocelot.readthedocs.io/en/latest/features/servicediscovery.html)[^5] | [Service Discovery](https://ocelot.readthedocs.io/en/latest/features/servicediscovery.html) with the following discovery providers: [Consul](https://ocelot.readthedocs.io/en/latest/features/servicediscovery.html#consul), [Kubernetes](https://ocelot.readthedocs.io/en/latest/features/kubernetes.html), [Eureka](https://ocelot.readthedocs.io/en/latest/features/servicediscovery.html#eureka), and [Service Fabric](https://ocelot.readthedocs.io/en/latest/features/servicefabric.html) |
| [Transformations](https://ocelot.readthedocs.io/en/latest/search.html?q=Transformation) | They provide transformations for [Claims](https://ocelot.readthedocs.io/en/latest/features/claimstransformation.html), [Headers](https://ocelot.readthedocs.io/en/latest/features/headerstransformation.html), and [Method](https://ocelot.readthedocs.io/en/latest/features/methodtransformation.html) |

> Ocelot customizations can be configured using [Metadata](https://ocelot.readthedocs.io/en/latest/features/metadata.html), developed with [Delegating Handlers](https://ocelot.readthedocs.io/en/latest/features/delegatinghandlers.html), and in advanced scenarios, they can be developed and then configured with [Middleware Injection](https://ocelot.readthedocs.io/en/latest/features/middlewareinjection.html).
For further details, refer to the [Documentation](#documentation).

## Contributing
You can see what we are working on in the [backlog](https://github.com/ThreeMammals/Ocelot/issues).
We love to receive contributions from the community, so please keep them coming.
Pull requests, issues, and commentary welcome! <img src="https://raw.githubusercontent.com/ThreeMammals/Ocelot/refs/heads/assets/images/octocat.png" alt="octocat" height="25" />

Please complete the relevant [template](https://github.com/ThreeMammals/Ocelot/tree/main/.github) for [issues](https://github.com/ThreeMammals/Ocelot/blob/main/.github/ISSUE_TEMPLATE.md) and [pull requests](https://github.com/ThreeMammals/Ocelot/blob/main/.github/PULL_REQUEST_TEMPLATE.md).
Sometimes it's worth getting in touch with us to [discuss](https://github.com/ThreeMammals/Ocelot/discussions) changes before doing any work in case this is something we are already doing or it might not make sense.
We can also give advice on the easiest way to do things <img src="https://raw.githubusercontent.com/ThreeMammals/Ocelot/refs/heads/assets/images/octocat.png" alt="octocat" height="25" />

Finally, we mark all existing issues as [![label: help wanted][~helpwanted]](https://github.com/ThreeMammals/Ocelot/labels/help%20wanted)
[![label: small effort][~smalleffort]](https://github.com/ThreeMammals/Ocelot/labels/small%20effort)
[![label: medium effort][~mediumeffort]](https://github.com/ThreeMammals/Ocelot/labels/medium%20effort)
[![label: large effort][~largeeffort]](https://github.com/ThreeMammals/Ocelot/labels/large%20effort).[^7]
If you want to contribute for the first time, we suggest looking at a [![label: help wanted][~helpwanted]](https://github.com/ThreeMammals/Ocelot/labels/help%20wanted) 
[![label: small effort][~smalleffort]](https://github.com/ThreeMammals/Ocelot/labels/small%20effort) 
[![label: good first issue][~goodfirstissue]](https://github.com/ThreeMammals/Ocelot/labels/good%20first%20issue) <img src="https://raw.githubusercontent.com/ThreeMammals/Ocelot/refs/heads/assets/images/octocat.png" alt="octocat" height="25" />

[~helpwanted]: https://img.shields.io/badge/-help%20wanted-128A0C.svg
[~smalleffort]: https://img.shields.io/badge/-small%20effort-fef2c0.svg
[~mediumeffort]: https://img.shields.io/badge/-medium%20effort-e0f42c.svg
[~largeeffort]: https://img.shields.io/badge/-large%20effort-10526b.svg
[~goodfirstissue]: https://img.shields.io/badge/-good%20first%20issue-ffc4d8.svg

### Notes
[^1]: Starting with version [21](https://github.com/ThreeMammals/Ocelot/releases/tag/21.0.0) and higher, the solution's code base supports [Multitargeting](https://learn.microsoft.com/en-us/visualstudio/msbuild/msbuild-multitargeting-overview) as SDK-style projects. It should be easier for teams to migrate to the currently supported [.NET 8, 9 and 10](https://dotnet.microsoft.com/en-us/platform/support/policy/dotnet-core#lifecycle) frameworks. Also, new features will be available for all .NET SDKs that we support via multitargeting. Find out more here: [Target frameworks in SDK-style projects](https://learn.microsoft.com/en-us/dotnet/standard/frameworks)
[^2]: [Ocelot Guru](https://gurubase.io/g/ocelot) is an unofficial tool to get answers regarding Ocelot: please consider it an advanced search tool. Thus, we have an official [Questions & Answers](https://github.com/ThreeMammals/Ocelot/discussions/categories/q-a) category in the [Discussions](https://github.com/ThreeMammals/Ocelot/discussions) space.
[^3]: Retry policies only via [Polly](https://github.com//App-vNext/Polly) library referenced within the [Ocelot.Provider.Polly](https://www.nuget.org/packages/Ocelot.Provider.Polly) extension package.
[^4]: Previously, the [Aggregation](https://ocelot.readthedocs.io/en/latest/features/aggregation.html) feature was called [Request Aggregation](https://ocelot.readthedocs.io/en/23.4.3/features/requestaggregation.html) in versions [23.4.3](https://github.com/ThreeMammals/Ocelot/releases/tag/23.4.3) and earlier. Internally, within the Ocelot team, this feature is referred to as [Multiplexer](https://github.com/ThreeMammals/Ocelot/tree/main/src/Ocelot/Multiplexer).
[^5]: Ocelot supports the following service discovery providers: (**1**) [Consul](https://www.consul.io) through the [Ocelot.Provider.Consul](https://www.nuget.org/packages/Ocelot.Provider.Consul) extension package, (**2**) [Kubernetes](https://kubernetes.io) via the [Ocelot.Provider.Kubernetes](https://www.nuget.org/packages/Ocelot.Provider.Kubernetes) extension package, and (**3**) [Netflix Eureka](https://spring.io/projects/spring-cloud-netflix), which utilizes the [Steeltoe.Discovery.Eureka](https://www.nuget.org/packages/Steeltoe.Discovery.Eureka) package referenced within the [Ocelot.Provider.Eureka](https://www.nuget.org/packages/Ocelot.Provider.Eureka) extension package. Additionally, Ocelot supports (**4**) Azure [Service Fabric](https://azure.microsoft.com/en-us/products/service-fabric/) for service discovery, along with special modes such as [Dynamic Routing](https://ocelot.readthedocs.io/en/latest/features/servicediscovery.html#dynamic-routing) and [Custom Providers](https://ocelot.readthedocs.io/en/latest/features/servicediscovery.html#custom-providers).
[^6]: Ocelot does not directly support [GraphQL](https://graphql.org/). Developers can easily integrate the [GraphQL for .NET](https://github.com/graphql-dotnet/graphql-dotnet) library. 
[^7]: See all [labels](https://github.com/ThreeMammals/Ocelot/issues/labels) for the repository, which are useful for searching and filtering.



================================================
FILE: ReleaseNotes.md
================================================
<!--
Tag to substitute: {0}
https://www.nuget.org/packages/Ocelot/{0}
-->
## Pre-release 2 for [.NET 10](https://dotnet.microsoft.com/en-us/download/dotnet/10.0) SDK (version [{0}](https://www.nuget.org/packages/Ocelot/{0}))
> Milestone: [.NET 10](https://github.com/ThreeMammals/Ocelot/milestone/13)

This is **Pre-release 2** for the [.NET 10](https://dotnet.microsoft.com/en-us/download/dotnet/10.0) SDK.

Version [{0}](https://www.nuget.org/packages/Ocelot/{0}) includes upgraded solutions and [NuGet packages](https://www.nuget.org/profiles/ThreeMammals) based on .NET SDK [10.0.201](https://dotnet.microsoft.com/en-us/download/dotnet/10.0), released on March 12, 2026.
For more details about SDK [10.0.201](https://dotnet.microsoft.com/en-us/download/dotnet/10.0), see the [Release notes](https://github.com/dotnet/core/blob/main/release-notes/10.0/10.0.5/10.0.5.md).

Development teams can start migrating their Ocelot-based projects using this [Beta 2](https://www.nuget.org/packages/Ocelot/{0}) release to upgrade to the .NET 10 SDK with Long-Term Support (LTS).


================================================
FILE: build.cake
================================================
#tool dotnet:?package=GitVersion.Tool&version=6.6.2
#tool nuget:?package=ReportGenerator&version=5.5.4

#addin nuget:?package=Cake.Http
#addin nuget:?package=Newtonsoft.Json&version=13.0.4 // Switch to a MS lib!
#addin nuget:?package=System.Text.Encodings.Web&version=10.0.5

#r "Spectre.Console"
using Spectre.Console;

using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using _File_ = System.IO.File;
using _Directory_ = System.IO.Directory;

bool IsTechnicalRelease = false;
const string Release = "Release"; // task name, target, and Release config name
const string PullRequest = "PullRequest"; // task name, target, and PullRequest config name
const string LatestFramework = "LatestFramework"; // task name, target, and LatestFramework config name
const string AllTFMs = "net8.0;net9.0;net10.0";
const string LatestTFM = "net10.0";
string NL = Environment.NewLine;

// Create a CultureInfo object for UK English
CultureInfo ukCulture = new("en-GB");
CultureInfo.DefaultThreadCurrentCulture = ukCulture;
CultureInfo.DefaultThreadCurrentUICulture = ukCulture;
Information("Current Culture: " + CultureInfo.CurrentCulture);
Information("Current UI Culture: " + CultureInfo.CurrentUICulture);

// Display culture properties
Information("Culture Name: " + ukCulture.Name);              // en-GB
Information("Display Name: " + ukCulture.DisplayName);       // English (United Kingdom)
Information("English Name: " + ukCulture.EnglishName);       // English (United Kingdom)
Information("Native Name: " + ukCulture.NativeName);         // English (United Kingdom)
Information("Two-letter ISO Language Name: " + ukCulture.TwoLetterISOLanguageName); // en
Information("Three-letter ISO Language Name: " + ukCulture.ThreeLetterISOLanguageName); // eng
Information("Region ISO Code: " + new RegionInfo(ukCulture.Name).TwoLetterISORegionName); // GB

// Example: format a date and currency in UK style
DateTime now = DateTime.Now;
decimal amount = 12345.67m;
Information("Date (UK format): " + now.ToString("D", ukCulture));
Information("Currency (UK format): " + amount.ToString("C", ukCulture));

var compileConfig = Argument("configuration", Release); // compile
var artifactsDir = Directory("artifacts"); // build artifacts

// unit testing
var artifactsForUnitTestsDir = artifactsDir + Directory("UnitTests");
var unitTestAssemblies = @"./test/Ocelot.UnitTests/Ocelot.UnitTests.csproj";

// acceptance testing
var artifactsForAcceptanceTestsDir = artifactsDir + Directory("AcceptanceTests");
var acceptanceTestAssemblies = @"./test/Ocelot.AcceptanceTests/Ocelot.AcceptanceTests.csproj";

// benchmark testing
var artifactsForBenchmarkTestsDir = artifactsDir + Directory("BenchmarkTests");
var benchmarkTestAssemblies = @"./test/Ocelot.Benchmarks";

// packaging
var packagesDir = artifactsDir + Directory("Packages");
var artifactsFile = packagesDir + File("artifacts.txt");
var releaseNotesFile = packagesDir + File("ReleaseNotes.md");
var releaseNotes = new List<string>();

// internal build variables - don't change these.
string committedVersion = "0.0.0-dev";
GitVersion versioning = null;

var target = Argument("target", "Default");
var slnFile = "./Ocelot.slnx";

Information($"{NL}Target: {target}");
Information($"Build: {compileConfig}");
Information($"Solution: {slnFile}");

TaskTeardown(context => {
	AnsiConsole.Markup($"[green]DONE[/] {context.Task.Name}" + NL);
});

Task("Default")
	.IsDependentOn("Build");
Task("Build")
	.IsDependentOn("Tests");
Task("LatestFramework")
	.IsDependentOn("Tests");
Task("PullRequest")
	.IsDependentOn("Tests");

Task("ReleaseNotes")
	.IsDependentOn("CreateReleaseNotes");

Task("Tests")
	.IsDependentOn("UnitTests")
	.IsDependentOn("AcceptanceTests");

Task("Release")
	.IsDependentOn("Build")
	.IsDependentOn("CreateReleaseNotes")
	.IsDependentOn("CreateArtifacts")
	.IsDependentOn("PublishGitHubRelease")
    .IsDependentOn("PublishToNuget");

Task("Restore")
    .Does(() =>
	{
		var settings = new DotNetRestoreSettings
		{
			LockedMode = true, // equivalent to --locked-mode
			// UseLockFile = true, // equivalent to --use-lock-file
			// Sources = new[] { "https://api.nuget.org/v3/index.json" }
		};
		DotNetRestore(slnFile, settings);
	});

Task("Compile")
	.IsDependentOn("Clean")
	.IsDependentOn("Version")
	.IsDependentOn("Restore")
	.Does(() =>
	{	
		PreprocessReadMe();
		Information("Branch: " + GetBranchName());
		Information("Build: " + compileConfig);
		Information("Solution: " + slnFile);
		var settings = new DotNetBuildSettings
		{
			Configuration = compileConfig,
			NoRestore = true,
		};
		if (target == LatestFramework || target == PullRequest)
		{
			settings.Framework = LatestTFM; // build using .NET 10 SDK only
		}
		string frameworkInfo = string.IsNullOrEmpty(settings.Framework) ? AllTFMs : settings.Framework;
		Information($"Settings {nameof(DotNetBuildSettings.Framework)}: {frameworkInfo}");
		Information($"Settings {nameof(DotNetBuildSettings.Configuration)}: {settings.Configuration}");
		DotNetBuild(slnFile, settings);
	});

Task("Clean")
	.Does(() =>
	{
        if (DirectoryExists(artifactsDir))
        {
            DeleteDirectory(artifactsDir, new DeleteDirectorySettings {
				Recursive = true,
				Force = true
			});
        }
        CreateDirectory(artifactsDir);
	});

Task("Version")
	.Does(() =>
	{
		versioning = GetNuGetVersionForCommit();
		versioning.NuGetVersion ??= versioning.SemVer;
		if (target == Release && IsRunningInCICD() && IsMainBranch() && versioning.SemVer.Contains("-")) // dash -> suffix in version
			versioning.NuGetVersion = versioning.MajorMinorPatch; // when releasing from main branch the tag should not contain suffix after dash char

		Information("#########################");
		Information("# SemVer Information");
		Information("#========================");
		Information($"# {nameof(versioning.NuGetVersion)}: {versioning.NuGetVersion}");
		Information($"# {nameof(versioning.BranchName)}: {versioning.BranchName}");
		Information($"# {nameof(versioning.MajorMinorPatch)}: {versioning.MajorMinorPatch}");
		Information($"# {nameof(versioning.SemVer)}: {versioning.SemVer}");
		Information($"# {nameof(versioning.InformationalVersion)}: {versioning.InformationalVersion}");
		Information("#########################");

		Information($"Persisting version number... {nameof(versioning.NuGetVersion)} -> {versioning.NuGetVersion}");
		PersistVersion(committedVersion, versioning.NuGetVersion);
	});

Task("GitLogUniqContributors")
	.Does(() =>
	{
		var command = "log --format=\"%aN|%aE\" ";
		// command += IsRunningInCICD() ? "| sort | uniq" :
		// 	IsRunningInPowershell() ? "| Sort-Object -Unique" : "| sort | uniq";
		List<string> output = GitHelper(command);
		output.Sort();
		List<string> contributors = output.Distinct().ToList();
		contributors.Sort();
        Information($"Detected {contributors.Count} unique contributors:");
        Information(string.Join(NL, contributors));
		// TODO Search example in bash: curl -L -H "X-GitHub-Api-Version: 2022-11-28"   "https://api.github.com/search/users?q=Chris+Swinchatt"
        Information(NL + "Unicode test: 1) Raynald Messié; 2) 彭伟 pengweiqhca");
        AnsiConsole.Markup("Unicode test: 1) Raynald Messié; 2) 彭伟 pengweiqhca" + NL);
		// Powershell life hack: $OutputEncoding = [Console]::InputEncoding = [Console]::OutputEncoding = New-Object System.Text.UTF8Encoding
		// https://stackoverflow.com/questions/40098771/changing-powershells-default-output-encoding-to-utf-8
		// https://stackoverflow.com/questions/49476326/displaying-unicode-in-powershell/49481797#49481797
		// https://stackoverflow.com/questions/57131654/using-utf-8-encoding-chcp-65001-in-command-prompt-windows-powershell-window/57134096#57134096
	});

Task("CreateReleaseNotes")
	.IsDependentOn("Version")
	//.IsDependentOn("GitLogUniqContributors")
	.Does(() =>
	{
        Information($"Generating release notes at {releaseNotesFile}");
        var lastReleaseTags = GitHelper("describe --tags --abbrev=0 --exclude net*");
        var lastRelease = lastReleaseTags.First(t => !t.StartsWith("net")); // skip 'net*-vX.Y.Z' tag and take 'major.minor.build'
        var releaseVersion = versioning.NuGetVersion;

        // Read main header from Git file, substitute version in header, and add content further...
        Information("{0}  New release tag is " + releaseVersion);
        Information("{1} Last release tag is " + lastRelease);
        var body = _File_.ReadAllText("./ReleaseNotes.md", System.Text.Encoding.UTF8);
        var releaseHeader = string.Format(body, releaseVersion, lastRelease);
        releaseNotes = new List<string> { releaseHeader };
        if (IsTechnicalRelease)
        {
            WriteReleaseNotes();
            return;
        }

        const bool debugUserEmail = false;
        var shortlogSummary = GitHelper($"shortlog --no-merges --numbered --summary --email {lastRelease}..HEAD")
            .ToList();
        var re = new Regex(@"^[\s\t]*(?'commits'\d+)[\s\t]+(?'author'.*)[\s\t]+<(?'email'.*)>.*$");
        static SummaryItem CreateSummaryItem(System.Text.RegularExpressions.Match m) => new()
        {
            Commits = int.Parse(m.Groups["commits"]?.Value ?? "0"),
            Author = m.Groups["author"]?.Value?.Trim() ?? string.Empty,
            Email = m.Groups["email"]?.Value?.Trim() ?? string.Empty,
        };
        var summary = shortlogSummary
            .Where(x => re.IsMatch(x))
            .Select(x => re.Match(x))
            .Select(CreateSummaryItem)
            .ToList();

        // Starring aka Release Influencers
        var starring = new List<string>();
        string CreateStars(int count, string name)
        {
            var contributor = summary.Find(x => x.Author.Equals(name));
            var stars = string.Join(string.Empty, Enumerable.Repeat(":star:", count));
            var emailInfo = debugUserEmail ? ", " + contributor.Email : string.Empty;
            return $"{stars}  {contributor.Author}{emailInfo}";
        }

        Information("------==< Old Starring >==------");
        foreach (var contributor in summary)
        {
            starring.Add(CreateStars(contributor.Commits, contributor.Author));
        }
        Information(string.Join(NL, starring));

        var commitsGrouping = summary
            .GroupBy(x => x.Commits)
            .Select(CreateCommitsGroupingItem)
            .OrderByDescending(x => x.Commits)
            .ToList();
        starring = IterateCommits(commitsGrouping,
            breaker: log => false, // don't break, so iterate all groups (summary)
            byCommits: (log, group) => CreateStars(group.Commits, group.Authors.First()),
            byFiles: (log, group, fGroup) => CreateStars(group.Commits, fGroup.Contributors.First().Contributor),
            byInsertions: (log, group, fGroup, insGroup) => CreateStars(group.Commits, insGroup.Contributors.First().Contributor),
            byDeletions: (log, group, fGroup, insGroup, contributor) => CreateStars(group.Commits, contributor.Contributor));
        Information("------==< New Starring >==------");
        Information(string.Join(NL, starring));

        // Honoring aka Top Contributors
        var coreTeamNames = new List<string> { "Raman Maksimchuk", "Raynald Messié", "Guillaume Gnaegi" }; // Ocelot Core team members should not be in Top 3 Chart
        var coreTeamEmails = new List<string> { "dotnet044@gmail.com", "redbird_project@yahoo.fr", "58469901+ggnaegi@users.noreply.github.com" };
        static CommitsGroupingItem CreateCommitsGroupingItem(IGrouping<int, SummaryItem> g) => new()
        {
            Commits = g.Key,
            Count = g.Count(),
            Authors = g.Select(x => x.Author).ToArray(),
        };
        commitsGrouping = summary
            .Where(x => !coreTeamNames.Contains(x.Author) && !coreTeamEmails.Contains(x.Email)) // filter out Ocelot Core team members
            .GroupBy(x => x.Commits)
            .Select(CreateCommitsGroupingItem)
            .OrderByDescending(x => x.Commits)
            .ToList();
        var topContributors = IterateCommits(commitsGrouping,
            breaker: log => false, // (log.Count >= 3), // going to create Top 3
            byCommits: (log, group) =>
            {
                var place = Place(log.Count);
                var author = group.Authors.First();
                return Honor(place, author, group.Commits);
            },
            byFiles: (log, group, fGroup) =>
            {
                var place = Place(log.Count);
                var contributor = fGroup.Contributors.First();
                return HonorForFiles(place, contributor.Contributor, group.Commits, contributor.Files);
            },
            byInsertions: (log, group, fGroup, insGroup) =>
            {
                var place = Place(log.Count);
                var contributor = insGroup.Contributors.First();
                return HonorForInsertions(place, contributor.Contributor, group.Commits, contributor.Files, contributor.Insertions);
            },
            byDeletions: (log, group, fGroup, insGroup, contributor) =>
            {
                var place = Place(log.Count);
                return HonorForDeletions(place, contributor.Contributor, group.Commits, contributor.Files, contributor.Insertions, contributor.Deletions);
            });
        Information("------==< TOP Contributors >==------");
        Information(string.Join(NL, topContributors));

        // local helpers
        static string Place(int i) => ++i == 1 ? "1st" : i == 2 ? "2nd" : i == 3 ? "3rd" : $"{i}th";
        static string Plural(int n) => n == 1 ? "" : "s";
        static string Honor(string place, string author, int commits, string suffix = null)
            => $"{place[0]}<sup>{place[1..]}</sup> :{place}_place_medal: goes to **{author}** for delivering **{commits}** feature{Plural(commits)} {suffix ?? ""}";
        static string HonorForFiles(string place, string author, int commits, int files, string suffix = null)
            => Honor(place, author, commits, $"in **{files}** file{Plural(files)} changed {suffix ?? ""}");
        static string HonorForInsertions(string place, string author, int commits, int files, int insertions, string suffix = null)
            => HonorForFiles(place, author, commits, files, $"with **{insertions}** insertion{Plural(insertions)} {suffix ?? ""}");
        static string HonorForDeletions(string place, string author, int commits, int files, int insertions, int deletions)
            => HonorForInsertions(place, author, commits, files, insertions, $"and **{deletions}** deletion{Plural(deletions)}");
        List<string> IterateCommits(List<CommitsGroupingItem> commitsGrouping, Predicate<List<string>> breaker,
            Func<List<string>, CommitsGroupingItem, string> byCommits,
            Func<List<string>, CommitsGroupingItem, FilesGroupingItem, string> byFiles,
            Func<List<string>, CommitsGroupingItem, FilesGroupingItem, InsertionsGroupingItem, string> byInsertions,
            Func<List<string>, CommitsGroupingItem, FilesGroupingItem, InsertionsGroupingItem, FilesChangedItem, string> byDeletions)
        {
            var log = new List<string>();
            foreach (var group in commitsGrouping)
            {
                if (breaker.Invoke(log)) break; // (log.Count >= top3)
                if (group.Count == 1)
                {
                    log.Add(byCommits.Invoke(log, group));
                }
                else // multiple candidates with the same number of commits, so, group by files changed
                {
                    var statistics = new List<FilesChangedItem>();
                    var shortstatRegex = new Regex(@"^\s*(?'files'\d+)\s+files?\s+changed(?'ins',\s+(?'insertions'\d+)\s+insertions?\(\+\))?(?'del',\s+(?'deletions'\d+)\s+deletions?\(\-\))?\s*$");
                    static FilesChangedItem CreateFilesChangedItem(System.Text.RegularExpressions.Match m)
					{
						FilesChangedItem item = new();
						if (int.TryParse(m.Groups["files"]?.Value ?? "0", out int files))
            				item.Files = files;
						else
            				item.Files = 0;

						if (int.TryParse(m.Groups["insertions"]?.Value ?? "0", out int insertions))
            				item.Insertions = insertions;
						else
            				item.Insertions = 0;

						if (int.TryParse(m.Groups["deletions"]?.Value ?? "0", out int deletions))
            				item.Deletions = deletions;
						else
            				item.Deletions = 0;
						return item;
					}
                    foreach (var author in group.Authors) // Collect statistics from git log & shortlog
                    {
                        if (!statistics.Exists(s => s.Contributor == author))
                        {
                            var shortstat = GitHelper($"log --no-merges --author=\"{author}\" --shortstat --pretty=oneline {lastRelease}..HEAD");
                            var data = shortstat
                                .Where(x => shortstatRegex.IsMatch(x))
                                .Select(x => shortstatRegex.Match(x))
                                .Select(CreateFilesChangedItem)
                                .ToList();
                            statistics.Add(new FilesChangedItem(author, data.Sum(x => x.Files), data.Sum(x => x.Insertions), data.Sum(x => x.Deletions)));
                        }
                    }
                    var filesGrouping = statistics
                        .GroupBy(x => x.Files)
                        .Select(g => new FilesGroupingItem
                        {
                            Files = g.Key,
                            Count = g.Count(),
                            Contributors = g.SelectMany(x => statistics.Where(s => s.Contributor == x.Contributor && s.Files == g.Key)).ToArray(),
                        })
                        .OrderByDescending(x => x.Files)
                        .ToList();
                    foreach (var fGroup in filesGrouping)
                    {
                        if (breaker.Invoke(log)) break;
                        if (fGroup.Count == 1)
                        {
                            log.Add(byFiles.Invoke(log, group, fGroup));
                        }
                        else // multiple candidates with the same number of commits, with the same number of changed files, so, group by additions (insertions)
                        {
                            var insertionsGrouping = fGroup.Contributors
                                .GroupBy(x => x.Insertions)
                                .Select(g => new InsertionsGroupingItem
                                {
                                    Insertions = g.Key,
                                    Count = g.Count(),
                                    Contributors = g.SelectMany(x => fGroup.Contributors.Where(s => s.Contributor == x.Contributor && s.Insertions == g.Key)).ToArray(),
                                })
                                .OrderByDescending(x => x.Insertions)
                                .ToList();
                            foreach (var insGroup in insertionsGrouping)
                            {
                                if (breaker.Invoke(log)) break;
                                if (insGroup.Count == 1)
                                {
                                    log.Add(byInsertions.Invoke(log, group, fGroup, insGroup));
                                }
                                else // multiple candidates with the same number of commits, with the same number of changed files, with the same number of insertions, so, order desc by deletions
                                {
                                    foreach (var contributor in insGroup.Contributors.OrderByDescending(x => x.Deletions))
                                    {
                                        if (breaker.Invoke(log)) break;
                                        log.Add(byDeletions.Invoke(log, group, fGroup, insGroup, contributor));
                                    }
                                }
                            }
                        }
                    }
                }
            }
            return log;
        } // END of IterateCommits
        // releaseNotes.Add("### Honoring :medal_sports: aka Top Contributors :clap:");
        // releaseNotes.AddRange(topContributors.Take(3)); // Top 3 only, disabled 'breaker' logic
        // releaseNotes.Add("");
        // releaseNotes.Add("### Starring :star: aka Release Influencers :bowtie:");
        // releaseNotes.AddRange(starring);
        // releaseNotes.Add("");
        // releaseNotes.Add($"### Features in Release {releaseVersion}");
        // releaseNotes.Add("");
        // releaseNotes.Add("<details><summary>Logbook</summary>");
        // releaseNotes.Add("");
        // var commitsHistory = GitHelper($"log --no-merges --date=format:\"%A, %B %d at %H:%M\" --pretty=format:\"- <sub>%h by **%aN** on %ad &rarr;</sub>%n  %s\" {lastRelease}..HEAD");
        // releaseNotes.AddRange(commitsHistory);
        // releaseNotes.Add("</details>");
        // releaseNotes.Add("");
        WriteReleaseNotes();
	});

struct SummaryItem
{
	public int Commits;
	public string Author;
	public string Email;
}
struct CommitsGroupingItem
{
	public int Commits;
	public int Count;
	public string[] Authors;
}
struct FilesChangedItem
{
	public string Contributor;
	public int Files;
	public int Insertions;
	public int Deletions;
	public FilesChangedItem(string author, int files, int insertions, int deletions)
	{
		Contributor = author;
		Files = files;
		Insertions = insertions;
		Deletions = deletions;
	}
}
struct FilesGroupingItem
{
	public int Files;
	public int Count;
	public FilesChangedItem[] Contributors;
}
struct InsertionsGroupingItem
{
	public int Insertions;
	public int Count;
	public FilesChangedItem[] Contributors;
}

private List<string> GitHelper(string command)
{
	IEnumerable<string> output;
	var exitCode = StartProcess(
		"git",
		new ProcessSettings { Arguments = command, RedirectStandardOutput = true },
		out output);
	if (exitCode != 0)
		throw new Exception("Failed to execute Git command: " + command);
	return output.ToList();
}

private void WriteReleaseNotes()
{
	Information($"RUN {nameof(WriteReleaseNotes)} ...");
	EnsureDirectoryExists(packagesDir);
	_File_.WriteAllLines(releaseNotesFile, releaseNotes, Encoding.UTF8);
	var content = _File_.ReadAllText(releaseNotesFile, Encoding.UTF8);
	if (string.IsNullOrEmpty(content))
	{
		_File_.WriteAllText(releaseNotesFile, "No commits since last release", System.Text.Encoding.UTF8);
	}
	Information("Release notes are >>>{0}<<<", NL + content);
}

private List<string> GetTFMs()
{
	var tfms = AllTFMs.Split(';').ToList();
	if (target == LatestFramework || target == "UnitTests" || target == Release || target == PullRequest)
    {
        tfms.Clear();
        tfms.Add(LatestTFM);
    }
	return tfms;
}
Task("UnitTests")
	.IsDependentOn("Compile")
	.Does(() =>
	{
		var verbosity = IsRunningInCICD() ? "minimal" : "normal";
		// Sequential processing as an emulation of Visual Studio Test Explorer
		foreach (string tfm in GetTFMs())
		{
			var settings = new DotNetTestSettings
			{
				Configuration = compileConfig,
				ResultsDirectory = artifactsForUnitTestsDir,
				ArgumentCustomization = args => args
					.Append("--no-restore")
					.Append("--no-build")
					.Append("--collect:\"XPlat Code Coverage\"") // this create the code coverage report
					.Append("--settings coverlet.runsettings") // exclude Ocelot.Testing assembly from coverage
					.Append("--verbosity:" + verbosity)
					.Append("--consoleLoggerParameters:ErrorsOnly"),
				Framework = tfm,
			};
			Information($"Settings {nameof(settings.Framework)}: {settings.Framework}");
			EnsureDirectoryExists(artifactsForUnitTestsDir);
			DotNetTest(unitTestAssemblies, settings); // sequential testing
		}
		
		Information("ArtifactsForUnitTestsDir = " + artifactsForUnitTestsDir);
		var coverageSummaryFile = GetSubDirectories(artifactsForUnitTestsDir)
			.First()
			.CombineWithFilePath(File("coverage.cobertura.xml"));
		Information("CoverageSummaryFile = " + coverageSummaryFile);
		GenerateReport(coverageSummaryFile);
		Information("##############################");
		Information("# Code coverage");
		Information("#=============================");

		// TODO Implement reporting to the Action Run summary as an attachment or artifact
		const string CoverallsRepo = "https://coveralls.io/github/ThreeMammals/Ocelot";
		Information($"# There is dedicated Coveralls step of GH Action workflows. So, we won't publish the coverage report to coveralls.io");

		// Apply code coverage threshold
		const double MinCodeCoverage = 0.93D; // consider definition of an env var in GitHub Environment vars
		var lineCoverage = XmlPeek(coverageSummaryFile, "//coverage/@line-rate");
		var branchCoverage = XmlPeek(coverageSummaryFile, "//coverage/@branch-rate");
		Information("# Line Coverage: " + lineCoverage);
		Information("# Branch Coverage: " + branchCoverage);
		if (double.Parse(lineCoverage) < MinCodeCoverage)
		{
			var whereToCheck = !IsRunningInCICD() ? CoverallsRepo : artifactsForUnitTestsDir;
			var msg = $"# Code coverage fell below the threshold of {MinCodeCoverage * 100}%. You can find the code coverage report at {whereToCheck}";
			Warning(msg);
			// throw new Exception(msg); // fail the building job step in GitHub Actions
		};
		Information("##############################");
	});

Task("AcceptanceTests")
	.IsDependentOn("Compile")
	.Does(() =>
	{
		var verbosity = IsRunningInCICD() ? "minimal" : "normal";
		if (IsRunningInCICD() && target == Release)
		{
			Warning("We are rolling out a release through the CI/CD pipeline, so we won't be running acceptance tests this time!");
			return;
		}
        // Sequential processing as an emulation of Visual Studio Test Explorer
		foreach (string tfm in GetTFMs())
		{
			var settings = new DotNetTestSettings
			{
				Configuration = compileConfig,
				ArgumentCustomization = args => args
					.Append("--no-restore")
					.Append("--no-build")
					.Append("--verbosity:" + verbosity),
				Framework = tfm,
			};
			Information($"Settings {nameof(settings.Framework)}: {settings.Framework}");
			EnsureDirectoryExists(artifactsForAcceptanceTestsDir);
			DotNetTest(acceptanceTestAssemblies, settings);
		}
	});

Task("CreateArtifacts")
	.IsDependentOn("CreateReleaseNotes")
	.IsDependentOn("Compile")
	.Does(() =>
	{
		WriteReleaseNotes();
		_File_.AppendAllLines(artifactsFile, new[] { "ReleaseNotes.md" });

		if (!IsTechnicalRelease)
		{
			CopyFiles("./**/Release/Ocelot.*.{nupkg,snupkg}", packagesDir);
			var projectFiles = GetFiles("./**/Release/Ocelot.*.{nupkg,snupkg}")
				.OrderBy(f => f.GetFilenameWithoutExtension().ToString())
				.ThenBy(f => f.GetExtension().ToString()) // .nupkg first
				.ToList();
			foreach(var projectFile in projectFiles)
			{
				_File_.AppendAllLines(artifactsFile, new[] { projectFile.GetFilename().FullPath });
			}
		}

		var artifacts = _File_.ReadAllLines(artifactsFile)
			.Distinct();

		Information($"Listing all {nameof(artifacts)}...");
		foreach (var artifact in artifacts)
		{
			var codePackage = packagesDir + File(artifact);
			if (FileExists(codePackage))
			{
				Information("Created package " + codePackage);
			} else {
				Information("Package does not exist: " + codePackage);
			}
		}
	});

Task("PublishGitHubRelease")
	.IsDependentOn("CreateArtifacts")
	.Does(() => 
	{
		if (!IsRunningInCICD())
		{
			Warning("We are not running on the CI/CD so we won't publish a GitHub release");
			return;
		}

		dynamic release = CreateGitHubRelease();
		var path = packagesDir.ToString() + @"/**/*Ocelot.*"; // filter out artifacts.txt and ReleaseNotes.md
		var files = GetFiles(path).ToList();
		foreach (var file in files)
		{
			UploadFileToGitHubRelease(release, file);
		}
		CompleteGitHubRelease(release);
	});

Task("EnsureStableReleaseRequirements")
    .Does(() =>	
    {
		Information("Check if stable release...");

        if (!IsRunningInCICD())
		{
           throw new Exception("Stable release should happen via CI/CD");
		}

		Information("Release is stable...");
	});

Task("DownloadGitHubReleaseArtifacts")
    .Does(async () =>
    {
		try
		{
			// hack to let GitHub catch up, todo - refactor to poll
			System.Threading.Thread.Sleep(5000);
			EnsureDirectoryExists(packagesDir);

			var releaseUrl = "https://api.github.com/repos/ThreeMammals/ocelot/releases/tags/" + versioning.NuGetVersion;
			var releaseInfo = await GetResourceAsync(releaseUrl);
        	var assets_url = Newtonsoft.Json.Linq.JObject.Parse(releaseInfo)
				.Value<string>("assets_url");

			var assets = await GetResourceAsync(assets_url);
			foreach(var asset in Newtonsoft.Json.JsonConvert.DeserializeObject<Newtonsoft.Json.Linq.JArray>(assets))
			{
				var file = packagesDir + File(asset.Value<string>("name"));
				DownloadFile(asset.Value<string>("browser_download_url"), file);
			}
		}
		catch(Exception exception)
		{
			Information("There was an exception " + exception);
			throw;
		}
	});

Task("PublishToNuget")
    .IsDependentOn("DownloadGitHubReleaseArtifacts")
    .Does(() =>
    {
		if (IsTechnicalRelease)
		{
			Information("Skipping of publishing to NuGet because of technical release...");
			return;
		}
		if (!IsRunningInCICD())
		{
			Warning("We are not running on the CI/CD so we won't publish NuGet packages.");
			//return;
		}
		var nugetFeedStableKey = EnvironmentVariable("OCELOT_NUGET_API_KEY_2025");
		var nugetFeedStableUploadUrl = "https://www.nuget.org/api/v2/package";
		var nugetFeedStableSymbolsUploadUrl = "https://www.nuget.org/api/v2/package";
		PublishPackages(packagesDir, artifactsFile, nugetFeedStableKey, nugetFeedStableUploadUrl, nugetFeedStableSymbolsUploadUrl);
	});

Task("Void").Does(() => {});

RunTarget(target);

private void PreprocessReadMe()
{
	const string READMEmd = "./README.md";
	const string RTD_NuGet_Valid_Domain = "[ReadTheDocs][~docspassing]";
	const string RTD_Version_Latest  = "[ReadTheDocs](https://readthedocs.org/projects/ocelot/badge/?version=latest&style=flat-square)";
	const string RTD_Version_Develop = "[ReadTheDocs](https://readthedocs.org/projects/ocelot/badge/?version=develop&style=flat-square)";
	Information($"Processing {READMEmd} ...");
    var body = _File_.ReadAllText(READMEmd, System.Text.Encoding.UTF8);
	var RTD_IsReplaced = false;
	if (body.Contains(RTD_Version_Latest))
	{
		Information($"  {READMEmd}: Detected ReadTheDocs LATEST version marker -> {RTD_Version_Latest}");
		body = body.Replace(RTD_Version_Latest, RTD_NuGet_Valid_Domain);
		RTD_IsReplaced = true;
	}
	if (body.Contains(RTD_Version_Develop))
	{
		Information($"  {READMEmd}: Detected ReadTheDocs DEVELOP version marker -> {RTD_Version_Develop}");
		body = body.Replace(RTD_Version_Develop, RTD_NuGet_Valid_Domain);
		RTD_IsReplaced = true;
	}
	if (RTD_IsReplaced)
	{
		Information($"  {READMEmd}: ReadTheDocs badge has been replaced with -> {RTD_NuGet_Valid_Domain}");
	}	

	const string IMG_Octocat_HTML = "<img src=\"https://raw.githubusercontent.com/ThreeMammals/Ocelot/refs/heads/assets/images/octocat.png\" alt=\"octocat\" height=\"25\" />";
	const string IMG_NuGet_Valid_MD = "![octocat](https://raw.githubusercontent.com/ThreeMammals/Ocelot/refs/heads/assets/images/octocat-25px.png)";
	if (body.Contains(IMG_Octocat_HTML))
	{
		Information($"  {READMEmd}: Detected Octocat HTML IMG-tag -> " + IMG_Octocat_HTML);
		body = body.Replace(IMG_Octocat_HTML, IMG_NuGet_Valid_MD);
		Information($"  {READMEmd}: Octocat HTML IMG-tag has been replaced with -> " + IMG_NuGet_Valid_MD);
	}
	Information($"  {READMEmd}: Writing the body of the {READMEmd}...");
	_File_.WriteAllText(READMEmd, body, System.Text.Encoding.UTF8);
	Information($"DONE Processing {READMEmd}{NL}");
}

private void GenerateReport(Cake.Core.IO.FilePath coverageSummaryFile)
{
	var dir = _Directory_.GetCurrentDirectory();
	Information("GenerateReport: Current directory: " + dir);

	var reportSettings = new ProcessArgumentBuilder();
	reportSettings.Append($"-targetdir:" + $"{dir}/{artifactsForUnitTestsDir}");
	reportSettings.Append($"-reports:" + coverageSummaryFile);
	reportSettings.Append($"-filefilters:-*.g.cs"); // silence warnings for source-generated files (e.g. RegexGenerator.g.cs) that are deleted after build

	Information($"GenerateReport: Resolving net10.0/ReportGenerator.dll ...");
	var toolpath = Context.Tools.Resolve("net10.0/ReportGenerator.dll");
	Information($"GenerateReport: Tool Path: {toolpath.ToString()}" + NL);

	DotNetExecute(toolpath, reportSettings);
}

/// Gets unique nuget version for this commit
private GitVersion GetNuGetVersionForCommit()
{
    GitVersion(new GitVersionSettings{
        UpdateAssemblyInfo = false,
        OutputType = GitVersionOutput.BuildServer,
		Verbosity = IsRunningInCICD() ? GitVersionVerbosity.Minimal : GitVersionVerbosity.Normal,
    });
    return GitVersion(new GitVersionSettings{ OutputType = GitVersionOutput.Json });
}

/// Updates project version in all of our projects
private void PersistVersion(string committedVersion, string newVersion)
{
	Information(string.Format("We'll search all csproj files for {0} and replace with {1}...", committedVersion, newVersion));
	var projectFiles = GetFiles("./**/*.csproj")
		.Where(f => !f.FullPath.Contains("Ocelot.Samples."))
		.ToList();
	foreach(var projectFile in projectFiles)
	{
		var file = projectFile.ToString();
		Information(string.Format("Updating {0}...", file));

		var updatedProjectFile = _File_.ReadAllText(file, System.Text.Encoding.UTF8)
			.Replace(committedVersion, newVersion);

		_File_.WriteAllText(file, updatedProjectFile, System.Text.Encoding.UTF8);
	}
}

// Publishes code and symbols packages to nuget feed, based on contents of artifacts file
private void PublishPackages(ConvertableDirectoryPath packagesDir, ConvertableFilePath artifactsFile, string feedApiKey, string codeFeedUrl, string symbolFeedUrl)
{
	Information($"{nameof(PublishPackages)}: Publishing to NuGet...");
	var artifacts = _File_.ReadAllLines(artifactsFile)
		.Distinct()
		.Where(a => a.EndsWith(".nupkg", StringComparison.OrdinalIgnoreCase))
		.ToList();
	var skippable = new List<string>
	{
		"ReleaseNotes.md", // skip always
		// "Ocelot.24.0.0",
		// "Ocelot.Cache.CacheManager",
		// "Ocelot.Provider.Consul",
		// "Ocelot.Provider.Eureka",
		// "Ocelot.Provider.Kubernetes",
		// "Ocelot.Provider.Polly",
		// "Ocelot.Tracing.Butterfly",
		// "Ocelot.Tracing.OpenTracing",
	};
	var includedInTheRelease = new List<string>
	{
		"Ocelot.Provider.Kubernetes",
	};
	foreach (var artifact in artifacts)
	{
		if (skippable.Exists(x => artifact.StartsWith(x, StringComparison.OrdinalIgnoreCase)))
			continue;
		// if (!includedInTheRelease.Exists(x => artifact.StartsWith(x))) continue;

		var package = packagesDir + File(artifact);
		Information($"{nameof(PublishPackages)}: Pushing package " + package + "...");
		try
		{
			DotNetNuGetPush(package,
				new DotNetNuGetPushSettings { ApiKey = feedApiKey, Source = codeFeedUrl, SkipDuplicate = true });

			var symbolArtifact = artifact.Replace(".nupkg", ".snupkg");
			var symbolPackage = packagesDir + File(symbolArtifact);
			if (FileExists(symbolPackage))
			{
				Information($"  Pushing symbol package {symbolPackage}...");
				System.Threading.Thread.Sleep(1000);
				try
				{
					DotNetNuGetPush(symbolPackage,
						new DotNetNuGetPushSettings { ApiKey = feedApiKey, Source = codeFeedUrl, SkipDuplicate = true });						
				}
				catch (Exception symEx)
				{
					Warning($"  Symbol push failed: {symEx.Message}");
				}
			}
			else
			{
				Information($"  No symbol package found for {artifact}");
			}
		}
		catch (Exception ex)
		{
			Information("--------------------------------------------------------------");
			Warning(ex.ToString());
			throw; // exit task with non-zero result -> failed step -> failed job in Actions
		}
			// catch (Exception ex)
			// {
			// 	Warning(ex.ToString());
			// 	// bool isConflict = ex.ToString().Contains("409") || ex.ToString().Contains("Conflict");
			// 	if (!isBeta /*|| !isConflict*/) throw;

			// 	var match = Regex.Match(theArtifact, @"-beta\.(\d+)(?=\.nupkg$)");
			// 	if (!match.Success)
			// 	{
			// 		Warning("  No beta version found in the artifact name, but it should be there. Artifact: " + theArtifact);
			// 		break;
			// 	}
    		// 	var betaNumber = match.Groups[1].Value;
    		// 	Information($"  Detected Beta number: {betaNumber}");
			// 	int newBetaVer = int.Parse(betaNumber) + 1; // increase beta version by 1 trying to find the next free beta number
			// 	var newArtifact = Regex.Replace(theArtifact, @"-beta\.\d+(?=\.nupkg$)", "-beta." + newBetaVer);
			// 	var newPackage = packagesDir + File(newArtifact);
			// 	if (FileExists(newPackage)) DeleteFile(newPackage);
			// 	MoveFile(package, newPackage);
			// 	Warning($"  Package renamed: {package} -> {newPackage} (Attempt #{attempts})");
			// 	var oldSymbol = packagesDir + File(theArtifact.Replace(".nupkg", ".snupkg"));
			// 	var newSymbol = packagesDir + File(newArtifact.Replace(".nupkg", ".snupkg"));
			// 	if (FileExists(oldSymbol))
			// 	{
			// 		if (FileExists(newSymbol)) DeleteFile(newSymbol);
			// 		MoveFile(oldSymbol, newSymbol);
			// 	}
			// 	package = newPackage;
			// 	theArtifact = newArtifact;				
			// 	System.Threading.Thread.Sleep(1000);
			// }
	}
}

private bool PackageExists(string packageId, string version)
{
	var url = $"https://api.nuget.org/v3-flatcontainer/{packageId.ToLowerInvariant()}/{version}/{packageId.ToLowerInvariant()}.{version}.nupkg";
	try
	{
		var response = HttpGet(url);
		Information($"{nameof(PackageExists)}: Package ver.{packageId}.{version} exists");
		return true;
	}
	catch (Exception ex)
	{
		Warning(ex.ToString());
		Information($"{nameof(PackageExists)}: Package ver.{packageId}.{version} does NOT exist");
	}
	return false;
}

private void SetupGitHubClient(System.Net.Http.HttpClient client)
{
	string token = Environment.GetEnvironmentVariable("OCELOT_GITHUB_API_KEY");
	client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token);
	client.DefaultRequestHeaders.Add("User-Agent", "Ocelot Release");
	client.DefaultRequestHeaders.Add("Accept", "application/vnd.github+json");
	client.DefaultRequestHeaders.Add("X-GitHub-Api-Version", "2022-11-28");
}

private dynamic CreateGitHubRelease()
{
	var body = ReleaseNotesAsJson();
	var json = $"{{ \"tag_name\": \"{versioning.NuGetVersion}\", \"target_commitish\": \"{versioning.BranchName}\", \"name\": \"{versioning.NuGetVersion}\", \"body\": \"{body}\", \"draft\": true, \"prerelease\": true, \"generate_release_notes\": false }}";
	var content = new System.Net.Http.StringContent(json, System.Text.Encoding.UTF8, "application/json");

	using (var client = new System.Net.Http.HttpClient())
	{	
		SetupGitHubClient(client);
		var result = client.PostAsync("https://api.github.com/repos/ThreeMammals/Ocelot/releases", content).Result;
		if (result.StatusCode != System.Net.HttpStatusCode.Created) 
		{
			var msg = "CreateGitHubRelease: StatusCode = " + result.StatusCode;
			Information(msg);
			throw new Exception(msg);
		}
		var releaseData = result.Content.ReadAsStringAsync().Result;
		dynamic releaseJSON = Newtonsoft.Json.JsonConvert.DeserializeObject<Newtonsoft.Json.Linq.JObject>(releaseData);
		Information("CreateGitHubRelease: Release ID is " + releaseJSON.id);
		return releaseJSON;
	}
}

private string ReleaseNotesAsJson()
{
	var body = _File_.ReadAllText(releaseNotesFile, System.Text.Encoding.UTF8);
	return System.Text.Encodings.Web.JavaScriptEncoder.Default.Encode(body);
}

private void UploadFileToGitHubRelease(dynamic release, FilePath file)
{
	var data = _File_.ReadAllBytes(file.FullPath);
	var content = new System.Net.Http.ByteArrayContent(data);
	content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/octet-stream");

	using (var client = new System.Net.Http.HttpClient())
	{	
		SetupGitHubClient(client);
		int releaseId = release.id;
		var fileName = file.GetFilename();
		string uploadUrl = release.upload_url.ToString();
		// Information($"UploadFileToGitHubRelease: uploadUrl is {uploadUrl}");
		string[] parts = uploadUrl.Replace("{", "").Split(',');
		uploadUrl = parts[0] + "=" + fileName; // $"https://uploads.github.com/repos/ThreeMammals/Ocelot/releases/{releaseId}/assets?name={fileName}"
		Information($"UploadFileToGitHubRelease: uploadUrl is {uploadUrl}");
		var result = client.PostAsync(uploadUrl, content).Result;
		if (result.StatusCode != System.Net.HttpStatusCode.Created) 
		{
			Information($"UploadFileToGitHubRelease: StatusCode is {result.StatusCode}. Release ID is {releaseId}. Failed to upload file '{fileName}' to URL: {uploadUrl}");
			throw new Exception("UploadFileToGitHubRelease: StatusCode is " + result.StatusCode);
		}
	}
}

private void CompleteGitHubRelease(dynamic release)
{
	int releaseId = release.id;
	string url = release.url.ToString();
	string body = ReleaseNotesAsJson();
	bool isPreRelease = !IsMainBranch();
	var json = $"{{ \"tag_name\": \"{versioning.NuGetVersion}\", \"target_commitish\": \"{versioning.BranchName}\", \"name\": \"{versioning.NuGetVersion}\", \"body\": \"{body}\", \"draft\": false, \"prerelease\": {isPreRelease.ToString().ToLower()} }}";
	var request = new System.Net.Http.HttpRequestMessage(new System.Net.Http.HttpMethod("Patch"), url); // $"https://api.github.com/repos/ThreeMammals/Ocelot/releases/{releaseId}");
	request.Content = new System.Net.Http.StringContent(json, System.Text.Encoding.UTF8, "application/json");

	using (var client = new System.Net.Http.HttpClient())
	{	
		SetupGitHubClient(client);
		var result = client.SendAsync(request).Result;
		if (result.StatusCode != System.Net.HttpStatusCode.OK) 
		{
			Information($"CompleteGitHubRelease: StatusCode is {result.StatusCode}. Release ID is {releaseId}. Failed to patch release with URL: {url}");
			throw new Exception("CompleteGitHubRelease: StatusCode = " + result.StatusCode);
		}
	}
}

/// gets the resource from the specified url
private async Task<string> GetResourceAsync(string url)
{
	try
	{
		Information("Getting resource from " + url);

		using var client = new System.Net.Http.HttpClient();
		client.DefaultRequestHeaders.Accept.ParseAdd("application/vnd.github.v3+json");
		client.DefaultRequestHeaders.UserAgent.ParseAdd("BuildScript");

		using var response = await client.GetAsync(url);
		response.EnsureSuccessStatusCode();
		var content = await response.Content.ReadAsStringAsync();
		Information("Response is >>>" + NL + content + NL + "<<<");
		return content;
	}
	catch(Exception exception)
	{
		Information("There was an exception " + exception);
		throw;
	}
}

private bool IsRunningInCICD()
	=> IsRunningOnCircleCI() || IsRunningInGitHubActions();
private bool IsRunningOnCircleCI()
	=> !string.IsNullOrWhiteSpace(Environment.GetEnvironmentVariable("CIRCLECI"));
private bool IsRunningInGitHubActions()
	=> Environment.GetEnvironmentVariable("GITHUB_ACTIONS") == "true";

private bool IsMainBranch()
{
	var br = GetBranchName().ToLower();
    return br == "main";
}
private string GetBranchName()
{
    return versioning?.BranchName ?? GetGitBranch();
}
private string GetGitBranch()
{
	var lines = GitHelper("branch --show-current");
	var branch = string.Join(string.Empty, lines);
	return branch ?? "Unknown Branch";
}


================================================
FILE: codeanalysis.ruleset
================================================
<?xml version="1.0" encoding="utf-8"?>
<RuleSet Name="Rules for StyleCop.Analyzers" Description="Code analysis rules for StyleCop.Analyzers.csproj." ToolsVersion="17.0">
  <Rules AnalyzerId="AsyncUsageAnalyzers" RuleNamespace="AsyncUsageAnalyzers">
    <Rule Id="AvoidAsyncSuffix" Action="None" />
    <Rule Id="AvoidAsyncVoid" Action="Error" />
    <Rule Id="UseAsyncSuffix" Action="None" />
    <Rule Id="UseConfigureAwait" Action="Error" />
  </Rules>
  <Rules AnalyzerId="Microsoft.CodeAnalysis.CSharp.Features" RuleNamespace="Microsoft.CodeAnalysis.CSharp.Features">
    <Rule Id="IDE0003" Action="None" />
  </Rules>
  <Rules AnalyzerId="StyleCop.Analyzers" RuleNamespace="StyleCop.Analyzers">
    <Rule Id="SA0000" Action="Hidden" />
    <Rule Id="SA1000" Action="None" />
    <Rule Id="SA1001" Action="None" />
    <Rule Id="SA1002" Action="None" />
    <Rule Id="SA1003" Action="None" />
    <Rule Id="SA1005" Action="None" />
    <Rule Id="SA1008" Action="None" />
    <Rule Id="SA1009" Action="None" />
    <Rule Id="SA1010" Action="None" />
    <Rule Id="SA1011" Action="None" />
    <Rule Id="SA1012" Action="None" />
    <Rule Id="SA1013" Action="None" />
    <Rule Id="SA1015" Action="None" />
    <Rule Id="SA1016" Action="None" />
    <Rule Id="SA1021" Action="Error" />
    <Rule Id="SA1022" Action="Error" />
    <Rule Id="SA1024" Action="None" />
    <Rule Id="SA1026" Action="None" />
    <Rule Id="SA1028" Action="None" />
    <Rule Id="SA1100" Action="Error" />
    <Rule Id="SA1101" Action="None" />
    <Rule Id="SA1106" Action="None" />
    <Rule Id="SA1111" Action="None" />
    <Rule Id="SA1112" Action="None" />
    <Rule Id="SA1116" Action="None" />
    <Rule Id="SA1117" Action="None" />
    <Rule Id="SA1118" Action="None" />
    <Rule Id="SA1119" Action="Error" />
    <Rule Id="SA1121" Action="Error" />
    <Rule Id="SA1122" Action="None" />
    <Rule Id="SA1128" Action="None" />
    <Rule Id="SA1133" Action="Error" />
    <Rule Id="SA1200" Action="None" />
    <Rule Id="SA1201" Action="None" />
    <Rule Id="SA1202" Action="None" />
    <Rule Id="SA1203" Action="None" />
    <Rule Id="SA1204" Action="None" />
    <Rule Id="SA1208" Action="None" />
    <Rule Id="SA1209" Action="None" />
    <Rule Id="SA1210" Action="None" />
    <Rule Id="SA1214" Action="None" />
    <Rule Id="SA1216" Action="None" />
    <Rule Id="SA1300" Action="None" />
    <Rule Id="SA1302" Action="Error" />
    <Rule Id="SA1303" Action="None" />
    <Rule Id="SA1304" Action="Error" />
    <Rule Id="SA1309" Action="None" />
    <Rule Id="SA1310" Action="None" />
    <Rule Id="SA1311" Action="Error" />
    <Rule Id="SA1400" Action="None" />
    <Rule Id="SA1401" Action="None" />
    <Rule Id="SA1402" Action="None" />
    <Rule Id="SA1403" Action="Error" />
    <Rule Id="SA1404" Action="Error" />
    <Rule Id="SA1405" Action="Error" />
    <Rule Id="SA1406" Action="Error" />
    <Rule Id="SA1407" Action="Error" />
    <Rule Id="SA1408" Action="None" />
    <Rule Id="SA1410" Action="Error" />
    <Rule Id="SA1411" Action="Error" />
    <Rule Id="SA1500" Action="None" />
    <Rule Id="SA1502" Action="None" />
    <Rule Id="SA1516" Action="None" />
    <Rule Id="SA1600" Action="None" />
    <Rule Id="SA1602" Action="None" />
    <Rule Id="SA1603" Action="Error" />
    <Rule Id="SA1609" Action="Error" />
    <Rule Id="SA1611" Action="None" />
    <Rule Id="SA1623" Action="None" />
    <Rule Id="SA1633" Action="None" />
    <Rule Id="SA1636" Action="Error" />
    <Rule Id="SA1642" Action="Error" />
    <Rule Id="SA1643" Action="Error" />
    <Rule Id="SA1652" Action="None" />
  </Rules>
</RuleSet>

================================================
FILE: codecov.yml
================================================
coverage:
  status:
    project: #add everything under here, more options at https://docs.codecov.com/docs/commit-status
      default:
        target: auto
        threshold: 0%
        base: auto

comment:
  layout: "reach, diff, flags, tree"
  behavior: default

github_checks:
  annotations: true


================================================
FILE: coverlet.runsettings
================================================
<?xml version="1.0" encoding="utf-8"?>
<RunSettings>
  <DataCollectionRunSettings>
    <DataCollectors>
      <DataCollector friendlyName="XPlat Code Coverage">
        <Configuration>
          <Format>cobertura</Format>
          <!-- Exclude the Ocelot.Testing assembly (shared testing library, not a product under test) -->
          <Exclude>[Ocelot.Testing*]*</Exclude>
          <!-- Do not count the test assemblies themselves toward coverage -->
          <IncludeTestAssembly>false</IncludeTestAssembly>
          <!-- Exclude assemblies that have no matching source files (e.g. generated or third-party) -->
          <ExcludeAssembliesWithoutSources>MissingAll</ExcludeAssembliesWithoutSources>
        </Configuration>
      </DataCollector>
    </DataCollectors>
  </DataCollectionRunSettings>
</RunSettings>


================================================
FILE: docker/Dockerfile.base
================================================
FROM mcr.microsoft.com/dotnet/sdk:9.0-alpine

RUN apk add bash icu-libs krb5-libs libgcc libintl libssl3 libstdc++ zlib git openssh-client

# Install .NET 8 SDK
RUN curl -L --output ./dotnet-install.sh https://dot.net/v1/dotnet-install.sh
RUN chmod u+x ./dotnet-install.sh 
RUN ./dotnet-install.sh -c 8.0 -i /usr/share/dotnet

# Generate and export the development SSL certificate
RUN mkdir -p /certs
RUN dotnet dev-certs https -ep /certs/cert.pem -p ''
RUN chmod 644 /certs/cert.pem

ENV ASPNETCORE_URLS="https://+;http://+" 
ENV ASPNETCORE_HTTPS_PORT=443 
ENV ASPNETCORE_Kestrel__Certificates__Default__Password="" 
ENV ASPNETCORE_Kestrel__Certificates__Default__Path=/certs/cert.pem


================================================
FILE: docker/Dockerfile.build
================================================
# call from ocelot repo root with
# docker build --platform linux/arm64 --build-arg OCELOT_COVERALLS_TOKEN=$OCELOT_COVERALLS_TOKEN -f ./docker/Dockerfile.build .
# docker build --platform linux/amd64 --build-arg OCELOT_COVERALLS_TOKEN=$OCELOT_COVERALLS_TOKEN -f ./docker/Dockerfile.build .

FROM ocelot2/circleci-build:latest

ARG OCELOT_COVERALLS_TOKEN

ENV OCELOT_COVERALLS_TOKEN=$OCELOT_COVERALLS_TOKEN

WORKDIR /build

COPY ./. .

RUN dotnet tool restore

RUN	dotnet cake


================================================
FILE: docker/Dockerfile.release
================================================
# call from ocelot repo root with
# docker build --platform linux/arm64 --build-arg OCELOT_COVERALLS_TOKEN=$OCELOT_COVERALLS_TOKEN --build-arg OCELOT_GITHUB_API_KEY=$OCELOT_GITHUB_API_KEY --build-arg OCELOT_COVERALLS_TOKEN=$OCELOT_COVERALLS_TOKEN -f ./docker/Dockerfile.build .
# docker build --platform linux/amd64 --build-arg OCELOT_COVERALLS_TOKEN=$OCELOT_COVERALLS_TOKEN --build-arg OCELOT_GITHUB_API_KEY=$OCELOT_GITHUB_API_KEY --build-arg OCELOT_COVERALLS_TOKEN=$OCELOT_COVERALLS_TOKEN -f ./docker/Dockerfile.build .

FROM ocelot2/circleci-build:latest

ARG OCELOT_COVERALLS_TOKEN
ARG OCELOT_NUTGET_API_KEY
ARG OCELOT_GITHUB_API_KEY

ENV OCELOT_COVERALLS_TOKEN=$OCELOT_COVERALLS_TOKEN
ENV OCELOT_NUTGET_API_KEY=$OCELOT_NUTGET_API_KEY
ENV OCELOT_GITHUB_API_KEY=$OCELOT_GITHUB_API_KEY

WORKDIR /build

COPY ./. .

RUN dotnet tool restore

RUN	dotnet cake


================================================
FILE: docker/Dockerfile.windows
================================================
FROM mcr.microsoft.com/dotnet/sdk:9.0-nanoserver-ltsc2022

# Install PowerShell globally  AND  RUN powershell -Command "gci"
#RUN dotnet tool install -g powershell  &&  pwsh -Command "gci"
RUN pwsh -Command "gci"

# # Install .NET 8 SDK
USER ContainerAdministrator
RUN pwsh -Command "Invoke-WebRequest -OutFile dotnet-install.ps1 https://dot.net/v1/dotnet-install.ps1; gci"
ENV DOTNET_GENERATE_ASPNET_CERTIFICATE=true
RUN pwsh -Command "./dotnet-install.ps1 -Channel 8.0 -InstallDir 'C:\Program Files\dotnet\'; gci -Path C:\\ -Recurse -Include *8.0* -Directory"

#RUN git status
RUN dotnet --info

# Generate and export the development SSL certificate
#RUN mkdir -p certs
#RUN dotnet dev-certs https -ep certs/cert.pem -p ''
#RUN pwsh -Command "dotnet dev-certs https --clean; dotnet dev-certs https; exit 0;"
#RUN pwsh -Command "dotnet dev-certs https --trust; exit 0;"
RUN pwsh -Command "dotnet dev-certs https --check --trust; exit 0;"

#ENV ASPNETCORE_URLS="https://+;http://+"  ASPNETCORE_HTTPS_PORT=443
#ENV ASPNETCORE_Kestrel__Certificates__Default__Password=""  ASPNETCORE_Kestrel__Certificates__Default__Path=certs/cert.pem


================================================
FILE: docker/README.md
================================================
# docker build

This folder contains the `Dockerfile.*` and `build-*.sh` scripts to create the Ocelot build image & container.

## Account
- Docker Hub | [Ocelot Gateway](https://hub.docker.com/u/ocelot2)

## Repositories
- [circleci-build](https://hub.docker.com/r/ocelot2/circleci-build)

## Outdated Tags
- [8.21.0](https://hub.docker.com/layers/ocelot2/circleci-build/8.21.0/images/sha256-edb46d37ab52d39a5b27dc63895e5944d4d491d1788744ed144ecb4303b94532?context=explore), uploaded on Nov 20, 2023. It contains .NET 8, 7 and 6 SDKs. It supports builds for `net6.0`, `net7.0` and `net8.0` frameworks.
- [8.23.2](https://hub.docker.com/layers/ocelot2/circleci-build/8.23.2/images/sha256-981d6f9e6e5ba54f6e044bca6fcf8b5197a8f3e6ce2b3cdfa9e6704ecd2ca969?context=explore), uploaded on Apr 3, 2024. It supports development SSL certificates by the command `dotnet dev-certs https`.
- [latest](https://hub.docker.com/layers/ocelot2/circleci-build/latest/images/sha256-981d6f9e6e5ba54f6e044bca6fcf8b5197a8f3e6ce2b3cdfa9e6704ecd2ca969?context=explore) is version 8.23.2, uploaded on Apr 3, 2024.

## .NET 8-9 Tags

### Single SDK Tags
- [sdk-8-alpine-lin.net8](https://hub.docker.com/layers/ocelot2/circleci-build/sdk-8-alpine-lin.net8/images/sha256-17c21438771641ba2a3320a6c13fe756a851d707a925188d9616485bfc757b22?context=explore), uploaded on Dec 3, 2024. This Linux OS image contains .NET 8 SDK only. It supports builds for `net8.0` framework.
- [sdk-9-alpine-lin.net9](https://hub.docker.com/layers/ocelot2/circleci-build/sdk-9-alpine-lin.net9/images/sha256-c20d82a52c1a7eebf86bcd32751960ae189e6c50575959ee0499b1d88541c9ea?context=explore), uploaded on Dec 3, 2024. This Linux OS image contains .NET 9 SDK only. It supports builds for `net9.0` framework.
- [sdk8-nanoserver2022-win.net8](https://hub.docker.com/layers/ocelot2/circleci-build/sdk8-nanoserver2022-win.net8/images/sha256-20f21f4361d18301bc885e1f01ebefcd6b024802130db1296173cdfaac5d75e6?context=explore), uploaded on Dec 3, 2024. This Windows OS image contains .NET 8 SDK only. It supports builds for `net8.0` framework.
- [sdk9-nano2022-win.net9](https://hub.docker.com/layers/ocelot2/circleci-build/sdk9-nano2022-win.net9/images/sha256-37b718885f8cfb3480299f48044836f01aec2370e331667dd1811a4c94a4ce45?context=explore), uploaded on Dec 3, 2024. This Windows OS image contains .NET 9 SDK only. It supports builds for `net9.0` framework.

### Double SDKs Tags
- [sdk9-alpine-lin.net8-9](https://hub.docker.com/layers/ocelot2/circleci-build/sdk9-alpine-lin.net8-9/images/sha256-707924d144248178caff80578649f7d0e9b7c70ed51b6fb5171170c9a30a4eae?context=explore) aka [9.24.0](https://hub.docker.com/layers/ocelot2/circleci-build/9.24.0/images/sha256-707924d144248178caff80578649f7d0e9b7c70ed51b6fb5171170c9a30a4eae?context=explore), uploaded on Dec 3, 2023. This Linux OS image contains .NET 8 and 9 SDKs. It supports builds for `net8.0` and `net9.0` frameworks.
- [sdk9-nano2022-win.net8-9](https://hub.docker.com/layers/ocelot2/circleci-build/sdk9-nano2022-win.net8-9/images/sha256-6e44a8fc52ab091ea43090b6ab182f7a05d7ac31402ce742a7e035323e584cf7?context=explore) aka [9.24.win](https://hub.docker.com/layers/ocelot2/circleci-build/9.24.win/images/sha256-6e44a8fc52ab091ea43090b6ab182f7a05d7ac31402ce742a7e035323e584cf7?context=explore), uploaded on Dec 4, 2023. This Windows OS image contains .NET 8 and 9 SDKs. It supports builds for `net8.0` and `net9.0` frameworks.

### Links
- Docker Hub | [Microsoft dotnet Images](https://hub.docker.com/r/microsoft/dotnet)
- GitHub | dotnet-docker | [.NET SDK](https://github.com/dotnet/dotnet-docker/blob/main/README.sdk.md)
- StackOverflow | [PowerShell and process exit codes](https://stackoverflow.com/questions/57468522/powershell-and-process-exit-codes)


================================================
FILE: docker/build-windows.sh
================================================
version=9.24.win
tag=sdk9-nano2022-win.net8-9

docker build --no-cache --platform windows/amd64 -t ocelot2/circleci-build -f Dockerfile.windows .

docker tag ocelot2/circleci-build ocelot2/circleci-build:$tag
docker push ocelot2/circleci-build:$tag

docker tag ocelot2/circleci-build ocelot2/circleci-build:$version
docker push ocelot2/circleci-build:$version


================================================
FILE: docker/build.sh
================================================
# This script builds the Ocelot Docker file
# echo $DOCKER_PASS | docker login -u $DOCKER_USER --password-stdin

# {DotNetSdkVer}.{OcelotVer} -> {.NET9}.{24.0} -> 9.24.0
#version=9.24.0
tag=sdk9-alpine-lin.net8-9

docker build --platform linux/amd64 -t ocelot2/circleci-build -f Dockerfile.base .
docker tag ocelot2/circleci-build ocelot2/circleci-build:$tag
docker push ocelot2/circleci-build:$tag
# docker tag ocelot2/circleci-build ocelot2/circleci-build:$version
# docker push ocelot2/circleci-build:$version


================================================
FILE: docker/outdated/Dockerfile.8.21.0.base
================================================
FROM mcr.microsoft.com/dotnet/sdk:8.0-alpine

RUN apk add bash icu-libs krb5-libs libgcc libintl libssl1.1 libstdc++ zlib git openssh-client

RUN curl -L --output ./dotnet-install.sh https://dot.net/v1/dotnet-install.sh

RUN chmod u+x ./dotnet-install.sh 

# Install .NET 8 SDK (already included in the base image, but listed for consistency)
RUN ./dotnet-install.sh -c 8.0 -i /usr/share/dotnet

# Install .NET 7 SDK
RUN ./dotnet-install.sh -c 7.0 -i /usr/share/dotnet

# Install .NET 6 SDK
RUN ./dotnet-install.sh -c 6.0 -i /usr/share/dotnet


================================================
FILE: docker/outdated/Dockerfile.8.23.2.base
================================================
FROM mcr.microsoft.com/dotnet/sdk:8.0-alpine

RUN apk add bash icu-libs krb5-libs libgcc libintl libssl3 libstdc++ zlib git openssh-client

RUN curl -L --output ./dotnet-install.sh https://dot.net/v1/dotnet-install.sh

RUN chmod u+x ./dotnet-install.sh 

# Install .NET 8 SDK (already included in the base image, but listed for consistency)
RUN ./dotnet-install.sh -c 8.0 -i /usr/share/dotnet

# Install .NET 7 SDK
RUN ./dotnet-install.sh -c 7.0 -i /usr/share/dotnet

# Install .NET 6 SDK
RUN ./dotnet-install.sh -c 6.0 -i /usr/share/dotnet

# Generate and export the development certificate
RUN dotnet dev-certs https -ep /certs/cert.pem -p '' && \
    chmod 644 /certs/cert.pem

ENV ASPNETCORE_URLS="https://+;http://+" 
ENV ASPNETCORE_HTTPS_PORT=443 
ENV ASPNETCORE_Kestrel__Certificates__Default__Password="" 
ENV ASPNETCORE_Kestrel__Certificates__Default__Path=/certs/cert.pem


================================================
FILE: docs/Makefile
================================================
# Minimal makefile for Sphinx documentation
#

# You can set these variables from the command line, and also
# from the environment for the first two.
SPHINXOPTS    ?=
SPHINXBUILD   ?= sphinx-build
SOURCEDIR     = .
BUILDDIR      = _build

# Put it first so that "make" without argument is like "make help".
help:
	@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)

.PHONY: help Makefile

# Catch-all target: route all unknown targets to Sphinx using the new
# "make mode" option.  $(O) is meant as a shortcut for $(SPHINXOPTS).
%: Makefile
	@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)


================================================
FILE: docs/_static/overrides.css
================================================
blockquote {
    font-size: 0.9em;
}
aside.footnote-list {
    font-size: 0.9em;
}
.img-valign-middle
{
    vertical-align: middle;
}
.img-valign-bottom
{
    vertical-align: bottom;
}
.img-valign-textbottom
{
    vertical-align: text-bottom;
}


================================================
FILE: docs/building/building.rst
================================================
.. role:: htm(raw)
  :format: html
.. role:: pdf(raw)
  :format: latex pdflatex
.. _Ocelot: https://github.com/ThreeMammals/Ocelot
.. _Cake: https://cakebuild.net
.. _Bash: https://www.gnu.org/software/bash
.. _build.cake: https://github.com/ThreeMammals/Ocelot/blob/main/build.cake
.. _GitHub Actions: https://docs.github.com/en/actions
.. _NuGet: https://www.nuget.org/profiles/ThreeMammals

Building
========

This document summarises the build and release process for the `Ocelot`_ project.
The build scripts are written using `Cake`_ (C# Make), with relevant build tasks defined in the '`build.cake`_' file located in the root of the `Ocelot`_ project.
The scripts are designed to be run by developers locally in a `Bash`_ terminal (on any OS), in Command Prompt (CMD) or PowerShell consoles (on Windows OS),
or by a CI/CD server (currently `GitHub Actions`_), with minimal logic defined in the build server itself.

The final goal of the build process is to create ``Ocelot.*`` `NuGet`_ packages (.nupkg files) for redistribution via the `NuGet`_ repository or manually.
The build process consists of several steps: (1) compilation, (2) testing, (3) creating and publishing `NuGet`_ packages, and (4) making an official GitHub release.
The build process requires pre-installed .NET SDKs on the build machine (host) for all target framework monikers: TFMs are ``net8.0`` and ``net9.0`` currently.
In general, the build process is the same across all environments and tools, with a few differences described below.

.. _b-in-ide:

In IDE
------
.. _Release configuration: https://learn.microsoft.com/en-us/visualstudio/debugger/how-to-set-debug-and-release-configurations?view=vs-2022

In an IDE, a DevOps engineer can build the project in Visual Studio IDE or another IDE in `Release configuration`_ mode, but the latest .NET 8/9 SDKs must be pre-installed on the local machine.
However, this approach is not practical because the generated '.nupkg' files must be uploaded to `NuGet`_ manually, and the GitHub release must also be created manually.
A better approach is to utilize the '`build.cake`_' script :ref:`b-in-terminal`, which covers all building scenarios.

.. _b-in-terminal:

In terminal
-----------
.. _./: https://github.com/ThreeMammals/Ocelot/tree/main/

  Folder: `./`_

These are local machine or remote server building scenarios using build scripts, aka '`build.cake`_'.
In these scenarios, the following two commands should be run in a terminal from the project's root folder:

.. code-block:: shell

  dotnet tool restore && dotnet cake  # In Bash terminal
  dotnet tool restore; dotnet cake  # In PowerShell terminal

.. _break: http://break.do

  **Note**: The default target task ("Default") is "Build", and output files will be stored in the ``./artifacts`` directory.

To run a desired target task, you need to specify its *name*:

.. code-block:: shell

  dotnet tool restore && dotnet cake --target=name  # In Bash terminal
  dotnet tool restore; dotnet cake --target=name  # In PowerShell terminal

For example,

- .. code-block:: shell

    dotnet cake --target=Build

  It runs a local build, performing compilation and testing only.

- .. code-block:: shell

    dotnet cake --target=Version
  
  It checks the next version to be tagged in the Git repository during the next release, without performing compilation or testing tasks.

- .. code-block:: shell

    dotnet cake --target=CreateReleaseNotes
  
  It generates Release Notes artifacts in the ``/artifacts/Packages`` folder using the ``ReleaseNotes.md`` template file.

- .. code-block:: shell

    dotnet cake --target=Release

  It creates a release, consisting of the following steps: compilation, testing, generating release notes, creating .nupkg files, publishing `NuGet`_ packages, and finally, making a GitHub release.

.. _dotnet-tools.json: https://github.com/ThreeMammals/Ocelot/blob/main/.config/dotnet-tools.json

  **Note 1**: The building tools for the ``dotnet tool restore`` command are configured in the `dotnet-tools.json`_ file.

  **Note 2**: Some targets (build tasks) require appropriate environment variables to be defined directly in the terminal session (aka secret tokens).

.. _b-with-docker:

With Docker
-----------
.. _docker: https://github.com/ThreeMammals/Ocelot/tree/main/docker
.. _Dockerfile.build: https://github.com/ThreeMammals/Ocelot/blob/main/docker/Dockerfile.build
.. _24.0: https://github.com/ThreeMammals/Ocelot/releases/tag/24.0.0

  Folder: ./`docker`_

The best way to replicate the CI/CD process and build `Ocelot`_ locally is by using the `Dockerfile.build`_ file, which can be found in the '`docker`_' folder in the `Ocelot`_ root directory.
For example, use the following command:

.. code-block:: shell

  docker build --platform linux/amd64 -f ./docker/Dockerfile.build .

You may need to adjust the platform flag depending on your system.

  **Note**: This approach is somewhat excessive, but it will work if you are a masterful Docker user. 🙂
  The Ocelot team has not followed this approach since version `24.0`_, favoring :ref:`b-with-ci-cd`-based builds and occasionally building :ref:`b-in-terminal` instead.

.. _b-with-ci-cd:

With CI/CD
----------
.. _workflows: https://github.com/ThreeMammals/Ocelot/tree/main/.github/workflows 
.. _PR: https://github.com/ThreeMammals/Ocelot/actions/workflows/pr.yml
.. _Develop: https://github.com/ThreeMammals/Ocelot/actions/workflows/develop.yml
.. _Release: https://github.com/ThreeMammals/Ocelot/actions/workflows/release.yml
.. _Coveralls: https://coveralls.io
.. |ReleaseButton| image:: https://github.com/ThreeMammals/Ocelot/actions/workflows/release.yml/badge.svg
  :target: https://github.com/ThreeMammals/Ocelot/actions/workflows/release.yml
  :alt: Release Status
  :class: img-valign-textbottom
.. |DevelopButton| image:: https://github.com/ThreeMammals/Ocelot/actions/workflows/develop.yml/badge.svg
  :target: https://github.com/ThreeMammals/Ocelot/actions/workflows/develop.yml
  :alt: Development Status
  :class: img-valign-textbottom
.. |DevelopCoveralls| image:: https://coveralls.io/repos/github/ThreeMammals/Ocelot/badge.svg?branch=develop
  :target: https://coveralls.io/github/ThreeMammals/Ocelot?branch=develop
  :alt: Coveralls Status
  :class: img-valign-textbottom
.. |ReleaseCoveralls| image:: https://coveralls.io/repos/github/ThreeMammals/Ocelot/badge.svg?branch=main
  :target: https://coveralls.io/github/ThreeMammals/Ocelot?branch=main
  :alt: Coveralls Status
  :class: img-valign-textbottom
.. _break2: http://break.do

  | Folder: ./.github/`workflows`_
  | Provider: `GitHub Actions`_
  | Workflows: `PR`_, `Develop`_, `Release`_
  | Dashboard: `Workflow runs <https://github.com/ThreeMammals/Ocelot/actions>`_ (Actions tab)

The `Ocelot`_ project utilizes `GitHub Actions`_ as a CI/CD provider, offering seamless integrations with the GitHub ecosystem and APIs.
Starting from version `24.0`_, all pull requests, development commits, and releases are built using `GitHub Actions`_ workflows.
There are three `workflows`_: one for pull requests (`PR`_), one for the ``develop`` branch (`Develop`_), and one for the ``main`` branch (`Release`_).

  **Note**: Each workflow has a dedicated status badge in the `Ocelot README`_:
  the |ReleaseButton|:pdf:`\href{https://github.com/ThreeMammals/Ocelot/actions/workflows/release.yml}{Release}` button and
  the |DevelopButton|:pdf:`\href{https://github.com/ThreeMammals/Ocelot/actions/workflows/develop.yml}{Develop}` button,
  with the `PR`_ status being published directly in a pull request under the "Checks" tab.

The `PR`_ workflow will track code coverage using `Coveralls`_.
After opening a pull request or submitting a new commit to a pull request, `Coveralls`_ will publish a short message with the current code coverage once the top commit is built.
Considering that `Coveralls`_ retains the entire history but does not fail the build if coverage falls below the threshold, all workflows have a built-in 80% threshold,
applied internally within the ``build-cake`` job, particularly during the "`Cake Build`_" step-action.
If the code coverage of a newly opened pull request drops below the 80% threshold, the `'build-cake' job`_ will fail, logging an appropriate message in the "`Cake Build`_" step.

  **Note 1**: There are special code coverage badges in `Ocelot README`_: the `Develop`_ |DevelopCoveralls| button and the `Release`_ |ReleaseCoveralls| button.

  **Note 2**: The current code coverage of the `Ocelot`_ project is around 85-86%. The coverage threshold is subject to change in upcoming releases.
  All `Coveralls`_ builds can be viewed by navigating to the `ThreeMammals/Ocelot <https://coveralls.io/github/ThreeMammals/Ocelot>`_ project on Coveralls.io.

Documentation
-------------
.. _docs: https://github.com/ThreeMammals/Ocelot/tree/main/docs
.. _.readthedocs.yaml: https://github.com/ThreeMammals/Ocelot/blob/main/.readthedocs.yaml
.. _Read the Docs: https://about.readthedocs.com
.. _Ocelot app: https://app.readthedocs.org/projects/ocelot/
.. _README: https://github.com/ThreeMammals/Ocelot/blob/main/docs/readme.md
.. _Ocelot README: https://github.com/ThreeMammals/Ocelot/blob/main/README.md
.. |ReleaseDocs| image:: https://readthedocs.org/projects/ocelot/badge/?version=latest&style=flat-square
  :target: https://app.readthedocs.org/projects/ocelot/builds/?version__slug=latest
  :alt: ReadTheDocs Status
  :class: img-valign-middle
.. |DevelopDocs| image:: https://readthedocs.org/projects/ocelot/badge/?version=develop&style=flat-square
  :target: https://app.readthedocs.org/projects/ocelot/builds/?version__slug=develop
  :alt: ReadTheDocs Status
  :class: img-valign-middle
.. _break3: http://break.do

  | Folder: ./`docs`_
  | Dashboard: `Ocelot app`_ project

Documentation building is configured using the '`.readthedocs.yaml`_' integration file, which allows builds to run separately via the `Read the Docs`_ publisher.
All build artifacts and document sources are located in the '`docs`_' folder.
More details on the documentation build process can be found in the `README`_.

  **Note 1**: Documentation builds have a dedicated status badges in `Ocelot README`_: the `Develop`_ |DevelopDocs| button and the `Release`_ |ReleaseDocs| button.

  **Note**: Documentation can be easily built locally in a terminal from the '`docs`_' folder by running the ``make.sh`` or ``make.bat`` scripts.
  The resulting documentation build files will be located in the ``./docs/_build`` folder, with the HTML documentation specifically written to the ``./docs/_build/html`` folder.

.. _b-testing:

Testing
-------

The tests should run and function correctly as part of the *building* process using the ``dotnet test`` command.
You can also run them in Visual Studio IDE within the Test Explorer window.
Depending on your build scenario, `Ocelot`_ *testing* can be performed as follows.

:ref:`b-in-ide`: Simply run tests via the Test Explorer window of Visual Studio IDE.

:ref:`b-in-terminal`: There are two main approaches:

1. Run the ``dotnet test`` command to perform all tests (unit, integration, and acceptance):

   .. code-block:: shell

      dotnet test -f net8.0 ./Ocelot.sln

   Or run tests separately per project:

   .. code-block:: shell

      dotnet test -f net8.0 ./test/Ocelot.UnitTests/Ocelot.UnitTests.csproj  # Unit tests only
      dotnet test -f net8.0 ./test/Ocelot.IntegrationTests/Ocelot.IntegrationTests.csproj  # Integration tests only
      dotnet test -f net8.0 ./test/Ocelot.AcceptanceTests/Ocelot.AcceptanceTests.csproj  # Acceptance tests only

2. Run ``dotnet cake`` command: ``dotnet cake --target=Tests`` to perform all tests (unit, integration and acceptance).
   Or run tests separately per *testing* project:

   .. code-block:: shell

      dotnet cake --target=UnitTests # unit tests only
      dotnet cake --target=IntegrationTests # integration tests only
      dotnet cake --target=AcceptanceTests # acceptance tests only

:ref:`b-with-docker`: This approach is not recommended.
Instead, perform automated testing :ref:`b-with-ci-cd` or opt for :ref:`b-in-terminal`-based testing, which is a more advanced method.

:ref:`b-with-ci-cd`: In `GitHub Actions`_ `workflows`_, the *testing* process consists of separate testing steps, organized per job:

* In the `'build' job`_: There are '`Unit Tests`_', '`Integration Tests`_', and '`Acceptance Tests`_' steps.
* In the `'build-cake' job`_: There is a '`Cake Build`_' step responsible for performing tests internally.

.. _'build' job: https://github.com/search?q=repo%3AThreeMammals%2FOcelot+build%3A+path%3A%2F%5E%5C.github%5C%2Fworkflows%5C%2F%2F&type=code
.. _Unit Tests: https://github.com/search?q=repo%3AThreeMammals%2FOcelot+%22Unit+Tests%22+path%3A%2F%5E%5C.github%5C%2Fworkflows%5C%2F%2F&type=code
.. _Integration Tests: https://github.com/search?q=repo%3AThreeMammals%2FOcelot+%22Integration+Tests%22+path%3A%2F%5E%5C.github%5C%2Fworkflows%5C%2F%2F&type=code
.. _Acceptance Tests: https://github.com/search?q=repo%3AThreeMammals%2FOcelot+%22Acceptance+Tests%22+path%3A%2F%5E%5C.github%5C%2Fworkflows%5C%2F%2F&type=code
.. _'build-cake' job: https://github.com/search?q=repo%3AThreeMammals%2FOcelot+%22-cake%3A%22+path%3A%2F%5E%5C.github%5C%2Fworkflows%5C%2F%2F&type=code
.. _Cake Build: https://github.com/search?q=repo%3AThreeMammals%2FOcelot+%22cake-build%2F%22+path%3A%2F%5E%5C.github%5C%2Fworkflows%5C%2F%2F&type=code

SSL certificate
---------------

To create a certificate for :ref:`b-testing`, you can use `OpenSSL <https://www.openssl.org/>`_:

* Install the `openssl <https://github.com/openssl/openssl>`__ package (if you are using Windows, download the binaries `here <https://www.openssl.org/source/>`_).
* Generate a private key:

  .. code-block:: bash

    openssl genrsa 2048 > private.pem

* Generate a self-signed certificate:

  .. code-block:: bash

    openssl req -x509 -days 1000 -new -key private.pem -out public.pem

* If needed, create a PFX file:

  .. code-block:: bash

    openssl pkcs12 -export -in public.pem -inkey private.pem -out mycert.pfx



================================================
FILE: docs/building/devprocess.rst
================================================
.. _Gitflow Workflow: https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow
.. _GitHub Flow: https://docs.github.com/en/get-started/using-github/github-flow
.. _develop: https://github.com/ThreeMammals/Ocelot/tree/develop
.. _main: https://github.com/ThreeMammals/Ocelot/tree/main
.. _issue(s): https://github.com/ThreeMammals/Ocelot/issues
.. _discussion: https://github.com/ThreeMammals/Ocelot/discussions
.. _fork: https://docs.github.com/en/get-started/quickstart/fork-a-repo
.. _unit: https://github.com/ThreeMammals/Ocelot/tree/develop/test/Ocelot.UnitTests
.. _acceptance: https://github.com/ThreeMammals/Ocelot/tree/develop/test/Ocelot.AcceptanceTests
.. _documentation: https://github.com/ThreeMammals/Ocelot/tree/develop/docs
.. _feature: https://github.com/ThreeMammals/Ocelot/tree/develop/docs/features
.. _Actions: https://github.com/ThreeMammals/Ocelot/actions
.. _Coveralls check: https://coveralls.io/github/ThreeMammals/Ocelot

Development Process
===================

* The *development process* is optimized when using Gitflow branching, as detailed here: `Gitflow Workflow`_.
  It's important to note that the Ocelot team does not utilize `GitHub Flow`_, which, despite being quicker, does not align with the efficiency required for Ocelot's delivery.
* Contributors are free to manage their pull requests and feature branches as they see fit to contribute to the '`develop`_' branch.
* Maintainers have the autonomy to handle pull requests and merges. Any merges to the '`main`_' branch will trigger the release of packages to GitHub and NuGet.
* In conclusion, while users should adhere to the guidelines in :doc:`../building/devprocess`, maintainers should follow the procedures outlined in :doc:`../building/releaseprocess`.

Stages
------

Ocelot project follows this *development process* to integrate work into a merged commit in the '`develop`_' branch:

1. Users either create a new issue or select an existing `issue(s)`_ on GitHub.
   Issues can also be generated from `discussion`_ topics when necessary and agreed upon.

2. Users should create a `fork`_ and branch off of it (unless they are a core team member, in which case they can branch directly from the main/head/upstream repository), e.g., ``feature/xxx``, ``bug/xxx``, etc.
   The "xxx" can be the issue number or a brief description.

3. Once contributors are satisfied with their work, they can submit a pull request against the `develop`_ branch on GitHub with their changes.

4. The Ocelot team will review the pull request and, if satisfactory, merge it; otherwise, they will provide feedback for the contributor to address.
   To expedite pull request approval, contributors should consider:

   - Ensuring all changes are covered by `unit`_ and `acceptance`_ tests.
   - Ensuring that the code coverage percentage from `unit`_ tests does not decrease; thus, the `Coveralls check`_ reports a green status.
   - Updating any `documentation`_ affected by the changes, with a required review of the appropriate `feature`_ document.
   - Verifying that the feature is necessary and does not duplicate existing Ocelot features.

5. A pull request must meet the following criteria before merging:

   - All new code must be covered by `unit`_ tests.
   - There must be at least one `acceptance`_ test for the happy path of the new code.
   - Tests must pass locally, in Visual Studio Test Explorer or in terminal after performing ``dotnet test`` command.
   - The build must have a green status on repository `Actions`_ as passed *checks* of the pull request (aka `Checks`_ tab).
   - The build's performance must not be significantly degraded on repository `Actions`_ page for `PR`_ workflow.
   - The main `Ocelot package`_ must not introduce any non-Microsoft `dependencies`_.

.. _PR: https://github.com/ThreeMammals/Ocelot/actions/workflows/pr.yml
.. _Checks: https://github.com/ThreeMammals/Ocelot/pull/2283/checks
.. _Ocelot package: https://www.nuget.org/packages/Ocelot
.. _dependencies: https://www.nuget.org/packages/Ocelot#dependencies-body-tab
.. _NuGet packages: https://www.nuget.org/profiles/ThreeMammals

6. Once the pull request is merged with *"Squash and Merge"* option into the `develop`_ branch, the ``Ocelot.*`` `NuGet packages`_ will not be updated until a release is crafted.
   The concluding step involves returning to GitHub to close any resolved `issue(s)`_.

Notes
-----

**Note 1**: The `issue(s)`_ linked to the pull request within the *Development* settings (on the right sidebar of the pull request settings) will automatically close upon merging.
It is crucial for developers to utilize the *"Link an issue from this repository"* feature in the *Development* settings.
An alternative way to link `issue(s)`_ is by specifying them in the pull request description, where the developer lists the linked `issue(s)`_ that need to be closed.
For example:

.. code-block:: markdown

  ## Fixes #1222
  - #1222

  ## Closes #1333
  - #1333

  ## Proposed Changes
  - change 1
  - change 2  

This Markdown should automatically link the desired bug/issue in the open status.
For bugs, the developer needs to write "Fixes #xxxx", and for features, "Closes #xxxx".

.. _GitHub Actions: https://docs.github.com/en/actions
.. _workflows: https://github.com/ThreeMammals/Ocelot/tree/main/.github/workflows 

**Note 2**: All pull request builds are conducted using `GitHub Actions`_, but developers have the freedom to build Ocelot as needed.
Details can be found in the :doc:`../building/building` chapter.
Additionally, for a deeper understanding of the current Ocelot CI/CD environment and a clearer view of the CI/CD build process, refer to the "Building :ref:`b-with-ci-cd`" section.

**Note 3**: Should you encounter any confusion or obstacles, do not hesitate to reach out to the members of the 'Ocelot Team' or the repository maintainers.

.. _dev-best-practices:

Best Practices
--------------
* Refer to the Ocelot `Actions`_ dashboard on GitHub to verify the latest build statuses for the three current `workflows`_.
  It is recommended to monitor the build status of each workflow on the `Actions`_ dashboard or directly in the `Checks`_ tab of a pull request.
  If a build fails, initiate a new build by pushing a new commit, or consult with online maintainers or code reviewers to ensure the current pull request build is successful.
* Request a code review after reaching the "Development Complete" stage, and address all feedback issues.
  Code is deemed complete when robust code, relevant `unit`_ and `acceptance`_ tests, and `documentation`_ updates are in place.
* Set up your development environment on Windows OS using Visual Studio IDE.
  While development in Linux OS with alternative IDEs is possible, it is not recommended. For more details, refer to the :ref:`dev-fun` section.
* Remain online after submitting a pull request/issue to ensure maintainers can reach you promptly.
  Note that if you are offline for extended periods, such as days, weeks, or months, maintainers may deprioritize your work.
  A strong contribution ethic implies constant online presence and proactivity.

.. _dev-fun:

Dev Fun
-------

This section is part of the :ref:`dev-best-practices` and is written to be more amusing D)

EOL Gotchas
^^^^^^^^^^^

  *Also known as, "Line-Endings problem"*

  Since the project's inception in 2016, this issue has been persistent.
  Indeed, some lines end with the ``LF`` character, typical of the Linux OS.
  Many of our contributors work on Linux and use IDEs like Visual Studio Code, JetBrains .NET Rider, which defaults to the ``LF`` as the newline character.
  As a result, we have numerous files with inconsistent or mixed EOL characters.

This problem stems from the well-known dilemma of End-of-Line (EOL) characters in cross-OS development.
For the Windows OS, the EOL character is ``CRLF``, while for Linux, it is ``LF``.
Modern IDEs and Git repositories have their own strategies for detecting inconsistencies of mixed EOLs in source files.
However, the GitHub "Files Changed" tool unfortunately registers a line change in two scenarios: ``CRLF`` to ``LF`` and ``LF`` to ``CRLF``, even when there's no actual code change!
Reviewing such pull requests with fictitious ("fake") changes is always challenging because the reviewer's focus should be on actual code changes.

  Please note, if a pull request is filled with "fake" changes in *"Files Changed"*, the code reviewer has the right to not provide a code review, mark the PR as a draft, or even close it.

Our standard practice is to maintain end-of-line characters as they are.
Moreover, we utilize Visual Studio's unique ``.editorconfig`` IDE analyzer settings for EOL to avoid issues with line endings.
These settings are specific to Visual Studio, hence we recommend rebasing a feature branch onto develop using Visual Studio exclusively.

    Special EOL settings can be specified in the ``.gitattributes`` file of the git repository, although we do not currently manage this.

Our current recommendations for addressing the end-of-line (EOL) issue are as follows:

* Ideally, resolve merge conflicts by prioritizing the changes in the `develop`_ branch, then manually incorporate your changes in the merge tool dialog.
  It appears that changes from the feature branch are being included, even if they are minor.
  Conflicts should be addressed by manually applying your changes to the `develop`_ branch with a merge tool.

* If changes from the feature branch are given priority (despite being minor), the merge tool will document them and apply ``CRLF`` end-of-line characters according to the rules specified in ``.editorconfig``.
  This is the source of the issue.

* Renaming a method in an IDE, such as Visual Studio, or using another auto-refactoring command, causes Visual Studio to apply the command using the default styling rules in ``.editorconfig``, which includes `CRLF settings <https://github.com/search?q=repo%3AThreeMammals%2FOcelot%20end_of_line&type=code>`_.
  Thus, applying auto-refactoring commands inadvertently alters the EOL characters, leading to "fake" changes in pull requests.
  Note that Visual Studio analyzers (IDE, StyleCop, etc.) may also recommend auto-refactoring, which could be applied implicitly.
  To preserve the original EOL characters, manual code editing is necessary.
  Therefore, "fake" changes result from auto-refactoring commands in IDEs like Visual Studio, Visual Code, Rider, etc.

* **Our final recommendation** is to boot into Windows, use Visual Studio Community (which is free), refrain from using auto-refactoring commands, and ensure that EOLs remain unchanged.
  If your OS differs, you **must** ensure that the appropriate settings are provided in the ``.gitattributes`` file to always commit files with ``CRLF`` EOL characters.


================================================
FILE: docs/building/releaseprocess.rst
================================================
.. _Gitflow Workflow: https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow
.. _GitHub Flow: https://docs.github.com/en/get-started/using-github/github-flow
.. _develop: https://github.com/ThreeMammals/Ocelot/tree/develop
.. _main: https://github.com/ThreeMammals/Ocelot/tree/main

Release Process
===============

* The *release process* is optimized when using Gitflow branching, as detailed here: `Gitflow Workflow`_.
  It's important to note that the Ocelot team does not utilize `GitHub Flow`_, which, despite being quicker, does not align with the efficiency required for Ocelot's delivery.
* Contributors are free to manage their pull requests and feature branches as they see fit to contribute to the '`develop`_' branch.
* Maintainers have the autonomy to handle pull requests and merges. Any merges to the '`main`_' branch will trigger the release of packages to GitHub and NuGet.
* In conclusion, while users should adhere to the guidelines in :doc:`../building/devprocess`, maintainers should follow the procedures outlined in :doc:`../building/releaseprocess`.

Stages
------
.. _Pair Programming: https://www.bing.com/search?q=Pair+Programming
.. _SemVer: https://semver.org
.. _GitVersion: https://gitversion.net/docs/
.. _Ocelot NuGet packages: https://www.nuget.org/profiles/ThreeMammals
.. _Release: https://github.com/ThreeMammals/Ocelot/actions/workflows/release.yml
.. _Environments: https://github.com/ThreeMammals/Ocelot/settings/environments
.. _build.cake: https://github.com/ThreeMammals/Ocelot/blob/main/build.cake
.. _ThreeMammals: https://github.com/ThreeMammals
.. _milestone: https://github.com/ThreeMammals/Ocelot/milestones
.. _releases: https://github.com/ThreeMammals/Ocelot/releases

Ocelot project follows this *release process* to incorporate work into NuGet packages:

1. As a code reviewers, maintainers review pull requests and, if satisfactory, merge them; otherwise, they provide feedback for the contributor to address.
   Contributors are supported through continuous `Pair Programming`_ sessions, which include multiple code reviews, resolving code review issues, and problem-solving.

2. As a release engineers, maintainers must adhere to Semantic Versioning (`SemVer`_) supported by `GitVersion`_.
   For breaking changes, maintainers should use the correct commit message (containing *"+semver: breaking|major|minor|patch"*) to ensure `GitVersion`_ applies the appropriate `SemVer`_ tags.
   Manual tagging of the Ocelot repository should be avoided to prevent disruptions.

3. Once a pull request is merged into the '`develop`_' branch, the `Ocelot NuGet packages`_ remain unchanged until a release is initiated.
   When sufficient work warrants a new release, the '`develop`_' branch is merged into '`main`_' as a ``release/X.Y`` branch, triggering the `Release`_ workflow that builds the code, assigns versions, and pushes artifacts to GitHub and packages to NuGet.

4. The release engineer, who holds the integration tokens in GitHub `Environments`_, automates each release build using the primary build script, '`build.cake`_'.
   Automated or manual :doc:`../building/building` can be performed :ref:`b-in-terminal` or :ref:`b-with-ci-cd`.
   The release engineer is also responsible for DevOps within the `ThreeMammals`_ organization, across all (sub)repositories, supporting the primary build script, and scripting for other repositories.

5. The release engineer drafts the ``ReleaseNotes.md`` template file, informing the community about key aspects of the release, including new or updated features, bug fixes, documentation updates, breaking changes, contributor acknowledgments, version upgrade guidelines, and more.

6. The final stage of the *release process* involves returning to GitHub to close the current `milestone`_, ensuring that:

   * All issues within the `milestone`_ are closed; any remaining work from open issues should be transferred to the next `milestone`_.
   * All pull requests associated with the `milestone`_ are either closed or reassigned to the upcoming release `milestone`_.
   * Release Notes are published on GitHub `releases`_, with an additional review of the text.
   * The published release is designated as the latest, provided the corresponding `Ocelot NuGet packages`_ have been successfully uploaded to the `ThreeMammals <https://www.nuget.org/profiles/ThreeMammals>`__ account.

7. Optional support for the major version ``X.Y.0`` should be available in cases such as Microsoft official patches and critical Ocelot defects of that major version.
   Maintainers should release patched versions ``X.Y.1-z`` as hot-fix patch versions.

Notes
-----
.. _GitHub Actions: https://docs.github.com/en/actions
.. _Actions: https://github.com/ThreeMammals/Ocelot/actions
.. _Tom Pallister: https://github.com/TomPallister
.. _Raman Maksimchuk: https://github.com/raman-m
.. _Ocelot Team: https://github.com/orgs/ThreeMammals/teams

**Note 1**: All NuGet package builds and releases are conducted through the `GitHub Actions`_ CI/CD provider.
For details, refer to the dedicated `Actions`_ dashboard, which should be used to monitor the current status of three workflows.

**Note 2**: Currently, only `Tom Pallister`_, `Raman Maksimchuk`_, the owners—along with the `Ocelot Team`_ maintainers—have the authority to merge releases into the '`main`_' branch of the Ocelot repository.
This policy ensures that final :ref:`quality-gates` are in place.
The maintainers' primary focus during the final merge is to identify any security issues, as outlined in Stage 7 of the process.

.. _quality-gates:

Quality Gates
-------------
.. _code analysis rule set: https://github.com/search?q=repo%3AThreeMammals%2FOcelot%20%3CCodeAnalysisRuleSet%3E&type=code
.. _codeanalysis.ruleset: https://github.com/ThreeMammals/Ocelot/blob/main/codeanalysis.ruleset
.. _Overview of .NET source code analysis: https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/overview?tabs=net-9
.. _StyleCop.Analyzers: https://www.nuget.org/packages/StyleCop.Analyzers
.. _reference: https://github.com/search?q=repo%3AThreeMammals%2FOcelot%20StyleCop.Analyzers&type=code
.. _here: https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/configuration-options

**Gate 1**: Static code analysis.
The Ocelot repository includes the following integrated style analyzers:

* In-built IDE (.NET SDK):
  The `code analysis rule set`_ is defined in the '`codeanalysis.ruleset`_' file, with configuration instructions available `here`_.
  For comprehensive documentation, refer to the following article:

  - Microsoft Learn: `Overview of .NET source code analysis`_

* `StyleCop.Analyzers`_: The package is somewhat outdated with slow support, but Ocelot projects still `reference`_ it because it has remained functional since 2015/16 as an older style analyzer.
  The Ocelot team plans to replace this library with a more advanced tool in upcoming releases.


================================================
FILE: docs/conf.py
================================================
# Configuration file for the Sphinx documentation builder.
#
# For the full list of built-in configuration values, see the documentation:
# https://www.sphinx-doc.org/en/master/usage/configuration.html

# -- Project information -----------------------------------------------------
# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information

project = 'Ocelot Gateway'
copyright = ' 2016-2026 Three Mammals'
author = 'Tom Gardham-Pallister, Raman Maksimchuk'
release = '25.0 ".NET 10"' # OK displayed
version = '25.0' # version is not displayed in either HTML pages or PDF docs

# -- General configuration ---------------------------------------------------
# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration

extensions = [
    'sphinx_copybutton'
]

templates_path = ['_templates']
exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']

# -- Options for HTML output -------------------------------------------------
# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output

# HTML theming: https://www.sphinx-doc.org/en/master/usage/theming.html
# HTML theme development: https://www.sphinx-doc.org/en/master/development/html_themes/index.html
# https://alabaster.readthedocs.io/en/latest/
# https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-html_theme
html_theme = 'alabaster'

# https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-html_static_path
html_static_path = ['_static']
html_css_files = ['overrides.css']


================================================
FILE: docs/features/administration.rst
================================================
.. _IdentityServer: https://github.com/DuendeArchive/IdentityServer4
.. _IdentityServer4: https://www.nuget.org/packages/IdentityServer4
.. _Program: https://github.com/ThreeMammals/Ocelot.Administration.IdentityServer4/blob/main/sample/Program.cs
.. _Ocelot.Administration.IdentityServer4: https://www.nuget.org/packages/Ocelot.Administration.IdentityServer4
.. _24.0: https://github.com/ThreeMammals/Ocelot/releases/tag/24.0.0
.. _Ocelot.postman_collection.json: https://github.com/ThreeMammals/Ocelot.Administration.IdentityServer4/blob/main/sample/Ocelot.postman_collection.json

Administration
==============

  **Ocelot extension package**: `Ocelot.Administration.IdentityServer4`_ with integrated `IdentityServer4`_ package by `IdentityServer org <https://github.com/IdentityServer>`_ (archived on March 6, 2025)

Ocelot supports changing configuration during runtime via an authenticated HTTP API.
This can be authenticated in two ways either using Ocelot's internal `IdentityServer`_ (for authenticating requests to the :ref:`administration-api` only) or hooking the :ref:`administration-api` authentication into your own `IdentityServer`_.

The first thing you need to do if you want to use the :ref:`administration-api` is bring in the relevant `Ocelot.Administration.IdentityServer4`_ package:

.. code-block:: powershell

  NuGet\Install-Package Ocelot.Administration.IdentityServer4
  dotnet add package Ocelot.Administration.IdentityServer4

This will bring down everything needed by the :ref:`administration-api`.

  **Warning!** Currently, the *Administration* feature relies solely on the `IdentityServer4`_ package, whose `repository <https://github.com/DuendeArchive/IdentityServer4>`_ was archived by its owner on July 31, 2024 (for the first time) and again on March 6, 2025.
  In release `24.0`_, the Ocelot team deprecated the `Ocelot.Administration.IdentityServer4`_ extension package.
  However, `the repository <https://github.com/ThreeMammals/Ocelot.Administration.IdentityServer4>`_ remains available, allowing for potential patches.

.. _ad-your-own-identityserver:

Your Own IdentityServer [#f1]_
------------------------------

All you need to do to hook into your own `IdentityServer`_ is add the following configuration options with authentication to your `Program`_.
After that, we must pass these options to the ``AddAdministration()`` extension of the ``OcelotBuilder`` being returned by ``AddOcelot()`` [#f2]_, as shown below:

.. code-block:: csharp

    Action<JwtBearerOptions> options = o =>
    {
        o.Authority = "https://identity-server-host:3333";
        o.RequireHttpsMetadata = true; // false in development environment
        o.TokenValidationParameters = new()
        {
            ValidateAudience = false,
        };
        //...
    };
    builder.Services
        .AddOcelot(builder.Configuration)
        .AddAdministration("/administration", options);

You now need to get a token from your `IdentityServer`_ and use in subsequent requests to Ocelot's :ref:`administration-api`.

  **Note**: This feature is useful because the `IdentityServer`_ authentication middleware needs the URL of the server.
  If you are using the :ref:`ad-internal-identityserver`, it might not always be possible to have the Ocelot URL.

.. _ad-internal-identityserver:

Internal IdentityServer
-----------------------

The API is authenticated using Bearer tokens that you request from Ocelot itself.
This is provided by the amazing `IdentityServer`_ project that the .NET community has been using for several years.
Check it out.

In order to enable the administration section, you need to do a few things. First of all, add this to your initial `Program`_.

The path can be anything you want and it is obviously recommended don't use a URL you would like to route through with Ocelot as this will not work.
The administration uses the ``MapWhen`` functionality of ASP.NET Core and all requests to ``{root}/administration`` will be sent there not to the Ocelot middleware.

The secret is the client secret that Ocelot's internal `IdentityServer`_ will use to authenticate requests to the :ref:`administration-api`.
This can be whatever you want it to be!
In order to pass this secret string as parameter, we must call the ``AddAdministration()`` extension of the ``OcelotBuilder`` being returned by ``AddOcelot()`` [#f2]_, as shown below:

.. code-block:: csharp

    builder.Services
        .AddOcelot(builder.Configuration)
        .AddAdministration("/administration", "secret");

In order for the :ref:`administration-api` to work, Ocelot and `IdentityServer`_ must be able to call themselves for validation.
This means that you need to add the base URL of Ocelot to the global configuration if it is not the default ``http://localhost:5000``.

  **Note**: If you are using something like Docker to host Ocelot, it might not be able to call back to ``localhost``, etc., and you need to know what you are doing with Docker networking in this scenario.

Configuration can be done as follows:

* If you want to run on a different host and port locally:

  .. code-block:: json

      "GlobalConfiguration": {
        "BaseUrl": "http://localho
Download .txt
gitextract_iih378bx/

├── .config/
│   └── dotnet-tools.json
├── .dockerignore
├── .editorconfig
├── .gitattributes
├── .github/
│   ├── CODE_OF_CONDUCT.md
│   ├── CONTRIBUTING.md
│   ├── ISSUE_TEMPLATE.md
│   ├── PULL_REQUEST_TEMPLATE.md
│   ├── steps/
│   │   ├── check-dotnet.sh
│   │   ├── macos.add-dns-records.sh
│   │   ├── macos.install-certificate.sh
│   │   ├── prepare-coveralls.sh
│   │   ├── ubuntu.add-dns-records.sh
│   │   ├── ubuntu.install-certificate.sh
│   │   ├── windows.add-dns-records.ps1
│   │   └── windows.install-certificate.ps1
│   └── workflows/
│       ├── develop.yml
│       ├── pr-closed.yml
│       ├── pr.yml
│       └── release.yml
├── .gitignore
├── .readthedocs.yaml
├── GitVersion.yml
├── LICENSE.md
├── Ocelot.Samples.sln
├── Ocelot.Samples.slnx
├── Ocelot.sln
├── Ocelot.slnx
├── README.md
├── ReleaseNotes.md
├── build.cake
├── codeanalysis.ruleset
├── codecov.yml
├── coverlet.runsettings
├── docker/
│   ├── Dockerfile.base
│   ├── Dockerfile.build
│   ├── Dockerfile.release
│   ├── Dockerfile.windows
│   ├── README.md
│   ├── build-windows.sh
│   ├── build.sh
│   └── outdated/
│       ├── Dockerfile.8.21.0.base
│       └── Dockerfile.8.23.2.base
├── docs/
│   ├── Makefile
│   ├── _static/
│   │   └── overrides.css
│   ├── building/
│   │   ├── building.rst
│   │   ├── devprocess.rst
│   │   └── releaseprocess.rst
│   ├── conf.py
│   ├── features/
│   │   ├── administration.rst
│   │   ├── aggregation.rst
│   │   ├── authentication.rst
│   │   ├── authorization.rst
│   │   ├── caching.rst
│   │   ├── claimstransformation.rst
│   │   ├── configuration.rst
│   │   ├── delegatinghandlers.rst
│   │   ├── dependencyinjection.rst
│   │   ├── errorcodes.rst
│   │   ├── graphql.rst
│   │   ├── headerstransformation.rst
│   │   ├── kubernetes.rst
│   │   ├── loadbalancer.rst
│   │   ├── logging.rst
│   │   ├── metadata.rst
│   │   ├── methodtransformation.rst
│   │   ├── middlewareinjection.rst
│   │   ├── qualityofservice.rst
│   │   ├── ratelimiting.rst
│   │   ├── routing.rst
│   │   ├── servicediscovery.rst
│   │   ├── servicefabric.rst
│   │   ├── tracing.rst
│   │   └── websockets.rst
│   ├── index.rst
│   ├── introduction/
│   │   ├── bigpicture.rst
│   │   ├── gettingstarted.rst
│   │   ├── gotchas.rst
│   │   └── notsupported.rst
│   ├── make.bat
│   ├── make.ps1
│   ├── make.sh
│   ├── readme.md
│   ├── releasenotes.rst
│   └── requirements.txt
├── postman/
│   └── ocelot.postman_collection.json
├── samples/
│   ├── Basic/
│   │   ├── API.http
│   │   ├── Ocelot.Samples.Basic.csproj
│   │   ├── Program.cs
│   │   ├── Properties/
│   │   │   └── launchSettings.json
│   │   ├── appsettings.Development.json
│   │   ├── appsettings.json
│   │   ├── ocelot.json
│   │   └── packages.lock.json
│   ├── Configuration/
│   │   ├── API.http
│   │   ├── Ocelot.Samples.Configuration.csproj
│   │   ├── Program.cs
│   │   ├── Properties/
│   │   │   └── launchSettings.json
│   │   ├── appsettings.Development.json
│   │   ├── appsettings.json
│   │   ├── ocelot-configuration/
│   │   │   ├── ocelot.docs.json
│   │   │   ├── ocelot.global.json
│   │   │   ├── ocelot.posts.json
│   │   │   └── ocelot.weather.json
│   │   └── packages.lock.json
│   ├── Eureka/
│   │   ├── ApiGateway/
│   │   │   ├── Ocelot.Samples.Eureka.ApiGateway.csproj
│   │   │   ├── Program.cs
│   │   │   ├── Properties/
│   │   │   │   └── launchSettings.json
│   │   │   ├── appsettings.json
│   │   │   ├── ocelot.json
│   │   │   └── packages.lock.json
│   │   ├── DownstreamService/
│   │   │   ├── Controllers/
│   │   │   │   └── CategoryController.cs
│   │   │   ├── Ocelot.Samples.Eureka.DownstreamService.csproj
│   │   │   ├── Program.cs
│   │   │   ├── Properties/
│   │   │   │   └── launchSettings.json
│   │   │   ├── appsettings.Development.json
│   │   │   ├── appsettings.json
│   │   │   └── packages.lock.json
│   │   ├── OcelotEureka.sln
│   │   └── README.md
│   ├── GraphQL/
│   │   ├── GraphQlDelegatingHandler.cs
│   │   ├── Models/
│   │   │   ├── Hero.cs
│   │   │   └── Query.cs
│   │   ├── Ocelot.Samples.GraphQL.csproj
│   │   ├── OcelotGraphQL.sln
│   │   ├── Program.cs
│   │   ├── Properties/
│   │   │   └── launchSettings.json
│   │   ├── README.md
│   │   ├── ocelot.json
│   │   └── packages.lock.json
│   ├── Kubernetes/
│   │   ├── .dockerignore
│   │   ├── ApiGateway/
│   │   │   ├── Dockerfile
│   │   │   ├── Ocelot.Samples.Kubernetes.ApiGateway.csproj
│   │   │   ├── Program.cs
│   │   │   ├── Properties/
│   │   │   │   └── launchSettings.json
│   │   │   ├── appsettings.Development.json
│   │   │   ├── appsettings.json
│   │   │   ├── ocelot.json
│   │   │   └── packages.lock.json
│   │   ├── Dockerfile
│   │   ├── DownstreamService/
│   │   │   ├── Controllers/
│   │   │   │   ├── ValuesController.cs
│   │   │   │   └── WeatherForecastController.cs
│   │   │   ├── Dockerfile
│   │   │   ├── Models/
│   │   │   │   └── WeatherForecast.cs
│   │   │   ├── Ocelot.Samples.Kubernetes.DownstreamService.csproj
│   │   │   ├── Program.cs
│   │   │   ├── Properties/
│   │   │   │   └── launchSettings.json
│   │   │   ├── appsettings.Development.json
│   │   │   ├── appsettings.json
│   │   │   └── packages.lock.json
│   │   └── OcelotKube.sln
│   ├── Metadata/
│   │   ├── API.http
│   │   ├── MetadataResponder.cs
│   │   ├── Models/
│   │   │   ├── PostsPlugin2.cs
│   │   │   ├── TestDeflateResponse.cs
│   │   │   ├── TestGZipResponse.cs
│   │   │   ├── WeatherCurrent.cs
│   │   │   ├── WeatherCurrentCondition.cs
│   │   │   ├── WeatherLocation.cs
│   │   │   └── WeatherResponse.cs
│   │   ├── MyMiddlewares.cs
│   │   ├── Ocelot.Samples.Metadata.csproj
│   │   ├── Program.cs
│   │   ├── Properties/
│   │   │   └── launchSettings.json
│   │   ├── appsettings.Development.json
│   │   ├── appsettings.json
│   │   ├── ocelot.json
│   │   └── packages.lock.json
│   ├── OpenTracing/
│   │   ├── Ocelot.Samples.OpenTracing.csproj
│   │   ├── Program.cs
│   │   ├── Properties/
│   │   │   └── launchSettings.json
│   │   ├── appsettings.Development.json
│   │   ├── appsettings.json
│   │   ├── ocelot.json
│   │   └── packages.lock.json
│   ├── ServiceDiscovery/
│   │   ├── .dockerignore
│   │   ├── ApiGateway/
│   │   │   ├── Ocelot.Samples.ServiceDiscovery.ApiGateway.csproj
│   │   │   ├── Program.cs
│   │   │   ├── Properties/
│   │   │   │   └── launchSettings.json
│   │   │   ├── ServiceDiscovery/
│   │   │   │   ├── MyServiceDiscoveryProvider.cs
│   │   │   │   └── MyServiceDiscoveryProviderFactory.cs
│   │   │   ├── appsettings.Development.json
│   │   │   ├── appsettings.json
│   │   │   ├── ocelot.json
│   │   │   └── packages.lock.json
│   │   ├── DownstreamService/
│   │   │   ├── Controllers/
│   │   │   │   ├── CategoriesController.cs
│   │   │   │   ├── HealthController.cs
│   │   │   │   └── WeatherForecastController.cs
│   │   │   ├── Models/
│   │   │   │   ├── HealthResult.cs
│   │   │   │   ├── MicroserviceResult.cs
│   │   │   │   ├── ReadyResult.cs
│   │   │   │   └── WeatherForecast.cs
│   │   │   ├── Ocelot.Samples.ServiceDiscovery.DownstreamService.csproj
│   │   │   ├── Program.cs
│   │   │   ├── Properties/
│   │   │   │   └── launchSettings.json
│   │   │   ├── appsettings.Development.json
│   │   │   ├── appsettings.json
│   │   │   └── packages.lock.json
│   │   ├── Ocelot.Samples.ServiceDiscovery.sln
│   │   └── README.md
│   ├── ServiceFabric/
│   │   ├── .gitignore
│   │   ├── ApiGateway/
│   │   │   ├── Ocelot.Samples.ServiceFabric.ApiGateway.csproj
│   │   │   ├── OcelotApplicationApiGateway.cs
│   │   │   ├── Program.cs
│   │   │   ├── Properties/
│   │   │   │   └── launchSettings.json
│   │   │   ├── ServiceEventListener.cs
│   │   │   ├── ServiceEventSource.cs
│   │   │   ├── WebCommunicationListener.cs
│   │   │   ├── appsettings.Development.json
│   │   │   ├── appsettings.json
│   │   │   ├── ocelot.json
│   │   │   └── packages.lock.json
│   │   ├── CONTRIBUTING.md
│   │   ├── DownstreamService/
│   │   │   ├── ApiGateway.cs
│   │   │   ├── Controllers/
│   │   │   │   └── ValuesController.cs
│   │   │   ├── Ocelot.Samples.ServiceFabric.DownstreamService.csproj
│   │   │   ├── Program.cs
│   │   │   ├── Properties/
│   │   │   │   └── launchSettings.json
│   │   │   ├── ServiceEventSource.cs
│   │   │   └── packages.lock.json
│   │   ├── LICENSE.md
│   │   ├── Ocelot.Samples.ServiceFabric.sln
│   │   ├── OcelotApplication/
│   │   │   ├── ApplicationManifest.xml
│   │   │   ├── OcelotApplicationApiGatewayPkg/
│   │   │   │   ├── Code/
│   │   │   │   │   ├── entryPoint.cmd
│   │   │   │   │   └── entryPoint.sh
│   │   │   │   ├── Config/
│   │   │   │   │   ├── Settings.xml
│   │   │   │   │   └── _readme.txt
│   │   │   │   ├── Data/
│   │   │   │   │   └── _readme.txt
│   │   │   │   ├── ServiceManifest-Linux.xml
│   │   │   │   ├── ServiceManifest-Windows.xml
│   │   │   │   └── ServiceManifest.xml
│   │   │   └── OcelotApplicationServicePkg/
│   │   │       ├── Code/
│   │   │       │   ├── entryPoint.cmd
│   │   │       │   └── entryPoint.sh
│   │   │       ├── Config/
│   │   │       │   ├── Settings.xml
│   │   │       │   └── _readme.txt
│   │   │       ├── Data/
│   │   │       │   └── _readme.txt
│   │   │       ├── ServiceManifest-Linux.xml
│   │   │       ├── ServiceManifest-Windows.xml
│   │   │       └── ServiceManifest.xml
│   │   ├── README.md
│   │   ├── build.bat
│   │   ├── build.sh
│   │   ├── dotnet-include.sh
│   │   ├── install.ps1
│   │   ├── install.sh
│   │   ├── uninstall.ps1
│   │   └── uninstall.sh
│   └── Web/
│       ├── DownstreamHostBuilder.cs
│       ├── Ocelot.Samples.Web.csproj
│       ├── OcelotHostBuilder.cs
│       ├── Properties/
│       │   └── launchSettings.json
│       └── packages.lock.json
├── src/
│   ├── Ocelot/
│   │   ├── Administration/
│   │   │   ├── AdministrationPath.cs
│   │   │   ├── FileConfigurationController.cs
│   │   │   ├── IAdministrationPath.cs
│   │   │   └── OutputCacheController.cs
│   │   ├── Authentication/
│   │   │   └── AuthenticationMiddleware.cs
│   │   ├── Authorization/
│   │   │   ├── AuthorizationMiddleware.cs
│   │   │   ├── ClaimValueNotAuthorizedError.cs
│   │   │   ├── ClaimsAuthorizer.cs
│   │   │   ├── IClaimsAuthorizer.cs
│   │   │   ├── IScopesAuthorizer.cs
│   │   │   ├── ScopeNotAuthorizedError.cs
│   │   │   ├── ScopesAuthorizer.cs
│   │   │   ├── UnauthorizedError.cs
│   │   │   └── UserDoesNotHaveClaimError.cs
│   │   ├── Cache/
│   │   │   ├── CachedResponse.cs
│   │   │   ├── DefaultCacheKeyGenerator.cs
│   │   │   ├── DefaultMemoryCache.cs
│   │   │   ├── ICacheKeyGenerator.cs
│   │   │   ├── IOcelotCache.cs
│   │   │   ├── MD5Helper.cs
│   │   │   └── OutputCacheMiddleware.cs
│   │   ├── Claims/
│   │   │   ├── AddClaimsToRequest.cs
│   │   │   ├── IAddClaimsToRequest.cs
│   │   │   └── Middleware/
│   │   │       └── ClaimsToClaimsMiddleware.cs
│   │   ├── Configuration/
│   │   │   ├── AuthenticationOptions.cs
│   │   │   ├── Builder/
│   │   │   │   ├── DownstreamRouteBuilder.cs
│   │   │   │   ├── MetadataOptionsBuilder.cs
│   │   │   │   ├── ServiceProviderConfigurationBuilder.cs
│   │   │   │   └── UpstreamPathTemplateBuilder.cs
│   │   │   ├── CacheOptions.cs
│   │   │   ├── ChangeTracking/
│   │   │   │   ├── IOcelotConfigurationChangeTokenSource.cs
│   │   │   │   ├── OcelotConfigurationChangeToken.cs
│   │   │   │   ├── OcelotConfigurationChangeTokenSource.cs
│   │   │   │   └── OcelotConfigurationMonitor.cs
│   │   │   ├── ClaimToThing.cs
│   │   │   ├── Creator/
│   │   │   │   ├── AddHeader.cs
│   │   │   │   ├── AggregatesCreator.cs
│   │   │   │   ├── AuthenticationOptionsCreator.cs
│   │   │   │   ├── CacheOptionsCreator.cs
│   │   │   │   ├── ClaimsToThingCreator.cs
│   │   │   │   ├── ConfigurationCreator.cs
│   │   │   │   ├── DefaultMetadataCreator.cs
│   │   │   │   ├── DownstreamAddressesCreator.cs
│   │   │   │   ├── DynamicRoutesCreator.cs
│   │   │   │   ├── FileInternalConfigurationCreator.cs
│   │   │   │   ├── HeaderFindAndReplaceCreator.cs
│   │   │   │   ├── HeaderTransformations.cs
│   │   │   │   ├── HttpHandlerOptionsCreator.cs
│   │   │   │   ├── HttpVersionCreator.cs
│   │   │   │   ├── HttpVersionPolicyCreator.cs
│   │   │   │   ├── IAggregatesCreator.cs
│   │   │   │   ├── IAuthenticationOptionsCreator.cs
│   │   │   │   ├── ICacheOptionsCreator.cs
│   │   │   │   ├── IClaimsToThingCreator.cs
│   │   │   │   ├── IConfigurationCreator.cs
│   │   │   │   ├── IDownstreamAddressesCreator.cs
│   │   │   │   ├── IDynamicsCreator.cs
│   │   │   │   ├── IHeaderFindAndReplaceCreator.cs
│   │   │   │   ├── IHttpHandlerOptionsCreator.cs
│   │   │   │   ├── IInternalConfigurationCreator.cs
│   │   │   │   ├── ILoadBalancerOptionsCreator.cs
│   │   │   │   ├── IMetadataCreator.cs
│   │   │   │   ├── IQoSOptionsCreator.cs
│   │   │   │   ├── IRateLimitOptionsCreator.cs
│   │   │   │   ├── IRequestIdKeyCreator.cs
│   │   │   │   ├── IRouteKeyCreator.cs
│   │   │   │   ├── IRoutesCreator.cs
│   │   │   │   ├── ISecurityOptionsCreator.cs
│   │   │   │   ├── IServiceProviderConfigurationCreator.cs
│   │   │   │   ├── IUpstreamHeaderTemplatePatternCreator.cs
│   │   │   │   ├── IUpstreamTemplatePatternCreator.cs
│   │   │   │   ├── IVersionCreator.cs
│   │   │   │   ├── IVersionPolicyCreator.cs
│   │   │   │   ├── LoadBalancerOptionsCreator.cs
│   │   │   │   ├── QoSOptionsCreator.cs
│   │   │   │   ├── RateLimitOptionsCreator.cs
│   │   │   │   ├── RequestIdKeyCreator.cs
│   │   │   │   ├── RouteKeyCreator.cs
│   │   │   │   ├── SecurityOptionsCreator.cs
│   │   │   │   ├── ServiceProviderConfigurationCreator.cs
│   │   │   │   ├── StaticRoutesCreator.cs
│   │   │   │   ├── UpstreamHeaderTemplatePatternCreator.cs
│   │   │   │   ├── UpstreamTemplatePatternCreator.cs
│   │   │   │   └── VersionPolicies.cs
│   │   │   ├── DownstreamHostAndPort.cs
│   │   │   ├── DownstreamRoute.cs
│   │   │   ├── File/
│   │   │   │   ├── AggregateRouteConfig.cs
│   │   │   │   ├── FileAggregateRoute.cs
│   │   │   │   ├── FileAuthenticationOptions.cs
│   │   │   │   ├── FileCacheOptions.cs
│   │   │   │   ├── FileConfiguration.cs
│   │   │   │   ├── FileDynamicRoute.cs
│   │   │   │   ├── FileGlobalAuthenticationOptions.cs
│   │   │   │   ├── FileGlobalCacheOptions.cs
│   │   │   │   ├── FileGlobalConfiguration.cs
│   │   │   │   ├── FileGlobalHttpHandlerOptions.cs
│   │   │   │   ├── FileGlobalLoadBalancerOptions.cs
│   │   │   │   ├── FileGlobalQoSOptions.cs
│   │   │   │   ├── FileGlobalRateLimit.cs
│   │   │   │   ├── FileGlobalRateLimitByAspNetRule.cs
│   │   │   │   ├── FileGlobalRateLimitByHeaderRule.cs
│   │   │   │   ├── FileGlobalRateLimitByIpRule.cs
│   │   │   │   ├── FileGlobalRateLimitByMethodRule.cs
│   │   │   │   ├── FileGlobalRateLimiting.cs
│   │   │   │   ├── FileHostAndPort.cs
│   │   │   │   ├── FileHttpHandlerOptions.cs
│   │   │   │   ├── FileLoadBalancerOptions.cs
│   │   │   │   ├── FileMetadataOptions.cs
│   │   │   │   ├── FileQoSOptions.cs
│   │   │   │   ├── FileRateLimitByAspNetRule.cs
│   │   │   │   ├── FileRateLimitByHeaderRule.cs
│   │   │   │   ├── FileRateLimitByIpRule.cs
│   │   │   │   ├── FileRateLimitByMethodRule.cs
│   │   │   │   ├── FileRateLimitRule.cs
│   │   │   │   ├── FileRateLimiting.cs
│   │   │   │   ├── FileRoute.cs
│   │   │   │   ├── FileRouteBase.cs
│   │   │   │   ├── FileSecurityOptions.cs
│   │   │   │   ├── FileServiceDiscoveryProvider.cs
│   │   │   │   ├── IRouteGroup.cs
│   │   │   │   ├── IRouteGrouping.cs
│   │   │   │   ├── IRouteRateLimiting.cs
│   │   │   │   └── IRouteUpstream.cs
│   │   │   ├── HeaderFindAndReplace.cs
│   │   │   ├── HttpHandlerOptions.cs
│   │   │   ├── IInternalConfiguration.cs
│   │   │   ├── InternalConfiguration.cs
│   │   │   ├── LoadBalancerOptions.cs
│   │   │   ├── MetadataOptions.cs
│   │   │   ├── Parser/
│   │   │   │   ├── ClaimToThingConfigurationParser.cs
│   │   │   │   ├── IClaimToThingConfigurationParser.cs
│   │   │   │   ├── InstructionNotForClaimsError.cs
│   │   │   │   ├── NoInstructionsError.cs
│   │   │   │   └── ParsingConfigurationHeaderError.cs
│   │   │   ├── QoSOptions.cs
│   │   │   ├── RateLimitOptions.cs
│   │   │   ├── RateLimitRule.cs
│   │   │   ├── Repository/
│   │   │   │   ├── ConsulFileConfigurationPollerOption.cs
│   │   │   │   ├── DiskFileConfigurationRepository.cs
│   │   │   │   ├── FileConfigurationPoller.cs
│   │   │   │   ├── IFileConfigurationPollerOptions.cs
│   │   │   │   ├── IFileConfigurationRepository.cs
│   │   │   │   ├── IInternalConfigurationRepository.cs
│   │   │   │   ├── InMemoryFileConfigurationPollerOptions.cs
│   │   │   │   └── InMemoryInternalConfigurationRepository.cs
│   │   │   ├── Route.cs
│   │   │   ├── SecurityOptions.cs
│   │   │   ├── ServiceProviderConfiguration.cs
│   │   │   ├── Setter/
│   │   │   │   ├── FileAndInternalConfigurationSetter.cs
│   │   │   │   └── IFileConfigurationSetter.cs
│   │   │   └── Validator/
│   │   │       ├── ConfigurationValidationResult.cs
│   │   │       ├── FileAuthenticationOptionsValidator.cs
│   │   │       ├── FileConfigurationFluentValidator.cs
│   │   │       ├── FileGlobalConfigurationFluentValidator.cs
│   │   │       ├── FileQoSOptionsFluentValidator.cs
│   │   │       ├── FileValidationFailedError.cs
│   │   │       ├── HostAndPortValidator.cs
│   │   │       ├── IConfigurationValidator.cs
│   │   │       └── RouteFluentValidator.cs
│   │   ├── DependencyInjection/
│   │   │   ├── ConfigurationBuilderExtensions.cs
│   │   │   ├── Features.cs
│   │   │   ├── IOcelotBuilder.cs
│   │   │   ├── MergeOcelotJson.cs
│   │   │   ├── OcelotBuilder.cs
│   │   │   └── ServiceCollectionExtensions.cs
│   │   ├── DownstreamPathManipulation/
│   │   │   ├── ChangeDownstreamPathTemplate.cs
│   │   │   ├── IChangeDownstreamPathTemplate.cs
│   │   │   └── Middleware/
│   │   │       └── ClaimsToDownstreamPathMiddleware.cs
│   │   ├── DownstreamRouteFinder/
│   │   │   ├── DownstreamRouteHolder.cs
│   │   │   ├── Finder/
│   │   │   │   ├── DiscoveryDownstreamRouteFinder.cs
│   │   │   │   ├── DownstreamRouteFinder.cs
│   │   │   │   ├── DownstreamRouteProviderFactory.cs
│   │   │   │   ├── IDownstreamRouteProvider.cs
│   │   │   │   ├── IDownstreamRouteProviderFactory.cs
│   │   │   │   └── UnableToFindDownstreamRouteError.cs
│   │   │   ├── HeaderMatcher/
│   │   │   │   ├── HeaderPlaceholderNameAndValueFinder.cs
│   │   │   │   ├── HeadersToHeaderTemplatesMatcher.cs
│   │   │   │   ├── IHeaderPlaceholderNameAndValueFinder.cs
│   │   │   │   └── IHeadersToHeaderTemplatesMatcher.cs
│   │   │   ├── Middleware/
│   │   │   │   └── DownstreamRouteFinderMiddleware.cs
│   │   │   └── UrlMatcher/
│   │   │       ├── IPlaceholderNameAndValueFinder.cs
│   │   │       ├── IUrlPathToUrlTemplateMatcher.cs
│   │   │       ├── PlaceholderNameAndValue.cs
│   │   │       ├── RegExUrlMatcher.cs
│   │   │       ├── UrlMatch.cs
│   │   │       └── UrlPathPlaceholderNameAndValueFinder.cs
│   │   ├── DownstreamUrlCreator/
│   │   │   ├── DownstreamPathPlaceholderReplacer.cs
│   │   │   ├── DownstreamUrlCreatorMiddleware.cs
│   │   │   └── IDownstreamPathPlaceholderReplacer.cs
│   │   ├── Errors/
│   │   │   ├── Error.cs
│   │   │   ├── Middleware/
│   │   │   │   └── ExceptionHandlerMiddleware.cs
│   │   │   ├── OcelotErrorCode.cs
│   │   │   └── RequestTimedOutError.cs
│   │   ├── Headers/
│   │   │   ├── AddHeadersToRequest.cs
│   │   │   ├── AddHeadersToResponse.cs
│   │   │   ├── HttpContextRequestHeaderReplacer.cs
│   │   │   ├── HttpResponseHeaderReplacer.cs
│   │   │   ├── IAddHeadersToRequest.cs
│   │   │   ├── IAddHeadersToResponse.cs
│   │   │   ├── IHttpContextRequestHeaderReplacer.cs
│   │   │   ├── IHttpResponseHeaderReplacer.cs
│   │   │   ├── IRemoveOutputHeaders.cs
│   │   │   ├── Middleware/
│   │   │   │   ├── ClaimsToHeadersMiddleware.cs
│   │   │   │   └── HttpHeadersTransformationMiddleware.cs
│   │   │   └── RemoveOutputHeaders.cs
│   │   ├── Infrastructure/
│   │   │   ├── CannotAddPlaceholderError.cs
│   │   │   ├── CannotRemovePlaceholderError.cs
│   │   │   ├── Claims/
│   │   │   │   ├── CannotFindClaimError.cs
│   │   │   │   ├── ClaimsParser.cs
│   │   │   │   └── IClaimsParser.cs
│   │   │   ├── ConfigAwarePlaceholders.cs
│   │   │   ├── CouldNotFindPlaceholderError.cs
│   │   │   ├── DelayedMessage.cs
│   │   │   ├── DesignPatterns/
│   │   │   │   └── Retry.cs
│   │   │   ├── Extensions/
│   │   │   │   ├── ErrorListExtensions.cs
│   │   │   │   ├── HttpContextExtensions.cs
│   │   │   │   ├── HttpRequestExtensions.cs
│   │   │   │   ├── IEnumerableExtensions.cs
│   │   │   │   ├── Int32Extensions.cs
│   │   │   │   ├── StringBuilderExtensions.cs
│   │   │   │   └── StringExtensions.cs
│   │   │   ├── FrameworkDescription.cs
│   │   │   ├── IBus.cs
│   │   │   ├── IFrameworkDescription.cs
│   │   │   ├── IPlaceholders.cs
│   │   │   ├── InMemoryBus.cs
│   │   │   ├── Placeholders.cs
│   │   │   ├── RegexGlobal.cs
│   │   │   └── RequestData/
│   │   │       ├── CannotAddDataError.cs
│   │   │       ├── CannotFindDataError.cs
│   │   │       ├── HttpDataRepository.cs
│   │   │       └── IRequestScopedDataRepository.cs
│   │   ├── LoadBalancer/
│   │   │   ├── Balancers/
│   │   │   │   ├── CookieStickySessions.cs
│   │   │   │   ├── LeastConnection.cs
│   │   │   │   ├── NoLoadBalancer.cs
│   │   │   │   └── RoundRobin.cs
│   │   │   ├── Creators/
│   │   │   │   ├── CookieStickySessionsCreator.cs
│   │   │   │   ├── DelegateInvokingLoadBalancerCreator.cs
│   │   │   │   ├── LeastConnectionCreator.cs
│   │   │   │   ├── NoLoadBalancerCreator.cs
│   │   │   │   └── RoundRobinCreator.cs
│   │   │   ├── Errors/
│   │   │   │   ├── CouldNotFindLoadBalancerCreatorError.cs
│   │   │   │   ├── InvokingLoadBalancerCreatorError.cs
│   │   │   │   ├── ServicesAreEmptyError.cs
│   │   │   │   ├── ServicesAreNullError.cs
│   │   │   │   └── UnableToFindLoadBalancerError.cs
│   │   │   ├── Interfaces/
│   │   │   │   ├── ILoadBalancer.cs
│   │   │   │   ├── ILoadBalancerCreator.cs
│   │   │   │   ├── ILoadBalancerFactory.cs
│   │   │   │   └── ILoadBalancerHouse.cs
│   │   │   ├── Lease.cs
│   │   │   ├── LeaseEventArgs.cs
│   │   │   ├── LoadBalancerFactory.cs
│   │   │   ├── LoadBalancerHouse.cs
│   │   │   ├── LoadBalancingMiddleware.cs
│   │   │   └── StickySession.cs
│   │   ├── Logging/
│   │   │   ├── IOcelotLogger.cs
│   │   │   ├── IOcelotLoggerFactory.cs
│   │   │   ├── IOcelotTracer.cs
│   │   │   ├── ITracingHandler.cs
│   │   │   ├── ITracingHandlerFactory.cs
│   │   │   ├── OcelotDiagnosticListener.cs
│   │   │   ├── OcelotHttpTracingHandler.cs
│   │   │   ├── OcelotLogger.cs
│   │   │   ├── OcelotLoggerFactory.cs
│   │   │   └── TracingHandlerFactory.cs
│   │   ├── Metadata/
│   │   │   └── DownstreamRouteExtensions.cs
│   │   ├── Middleware/
│   │   │   ├── BaseUrlFinder.cs
│   │   │   ├── ConfigurationMiddleware.cs
│   │   │   ├── DownstreamResponse.cs
│   │   │   ├── Header.cs
│   │   │   ├── HttpItemsExtensions.cs
│   │   │   ├── IBaseUrlFinder.cs
│   │   │   ├── OcelotMiddleware.cs
│   │   │   ├── OcelotMiddlewareConfigurationDelegate.cs
│   │   │   ├── OcelotMiddlewareExtensions.cs
│   │   │   ├── OcelotPipelineConfiguration.cs
│   │   │   ├── OcelotPipelineExtensions.cs
│   │   │   └── UnauthenticatedError.cs
│   │   ├── Multiplexer/
│   │   │   ├── CouldNotFindAggregatorError.cs
│   │   │   ├── IDefinedAggregator.cs
│   │   │   ├── IDefinedAggregatorProvider.cs
│   │   │   ├── IResponseAggregator.cs
│   │   │   ├── IResponseAggregatorFactory.cs
│   │   │   ├── InMemoryResponseAggregatorFactory.cs
│   │   │   ├── MultiplexingMiddleware.cs
│   │   │   ├── ServiceLocatorDefinedAggregatorProvider.cs
│   │   │   ├── SimpleJsonResponseAggregator.cs
│   │   │   └── UserDefinedResponseAggregator.cs
│   │   ├── Ocelot.csproj
│   │   ├── QualityOfService/
│   │   │   ├── IQosFactory.cs
│   │   │   ├── NoQosDelegatingHandler.cs
│   │   │   ├── QosDelegatingHandlerDelegate.cs
│   │   │   ├── QosFactory.cs
│   │   │   └── UnableToFindQoSProviderError.cs
│   │   ├── QueryStrings/
│   │   │   ├── AddQueriesToRequest.cs
│   │   │   ├── ClaimsToQueryStringMiddleware.cs
│   │   │   └── IAddQueriesToRequest.cs
│   │   ├── RateLimiting/
│   │   │   ├── ClientRequestIdentity.cs
│   │   │   ├── DistributedCacheRateLimitStorage.cs
│   │   │   ├── IRateLimitStorage.cs
│   │   │   ├── IRateLimiting.cs
│   │   │   ├── MemoryCacheRateLimitStorage.cs
│   │   │   ├── QuotaExceededError.cs
│   │   │   ├── RateLimitCounter.cs
│   │   │   ├── RateLimitHeaders.cs
│   │   │   ├── RateLimiting.cs
│   │   │   ├── RateLimitingHeaders.cs
│   │   │   └── RateLimitingMiddleware.cs
│   │   ├── Request/
│   │   │   ├── Creator/
│   │   │   │   ├── DownstreamRequestCreator.cs
│   │   │   │   └── IDownstreamRequestCreator.cs
│   │   │   ├── Mapper/
│   │   │   │   ├── IRequestMapper.cs
│   │   │   │   ├── PayloadTooLargeError.cs
│   │   │   │   ├── RequestMapper.cs
│   │   │   │   ├── StreamHttpContent.cs
│   │   │   │   └── UnmappableRequestError.cs
│   │   │   └── Middleware/
│   │   │       ├── DownstreamRequest.cs
│   │   │       └── DownstreamRequestInitialiserMiddleware.cs
│   │   ├── RequestId/
│   │   │   ├── DefaultRequestIdKey.cs
│   │   │   ├── Middleware/
│   │   │   │   └── RequestIdMiddleware.cs
│   │   │   └── RequestId.cs
│   │   ├── Requester/
│   │   │   ├── ConnectionToDownstreamServiceError.cs
│   │   │   ├── DelegatingHandlerFactory.cs
│   │   │   ├── GlobalDelegatingHandler.cs
│   │   │   ├── HttpExceptionToErrorMapper.cs
│   │   │   ├── IDelegatingHandlerFactory.cs
│   │   │   ├── IExceptionToErrorMapper.cs
│   │   │   ├── IHttpRequester.cs
│   │   │   ├── IMessageInvokerPool.cs
│   │   │   ├── MessageInvokerHttpRequester.cs
│   │   │   ├── MessageInvokerPool.cs
│   │   │   ├── Middleware/
│   │   │   │   └── HttpRequesterMiddleware.cs
│   │   │   ├── RequestCanceledError.cs
│   │   │   ├── ServiceCollectionExtensions.cs
│   │   │   ├── TimeoutDelegatingHandler.cs
│   │   │   └── UnableToCompleteRequestError.cs
│   │   ├── Responder/
│   │   │   ├── ErrorsToHttpStatusCodeMapper.cs
│   │   │   ├── HttpContextResponder.cs
│   │   │   ├── IErrorsToHttpStatusCodeMapper.cs
│   │   │   ├── IHttpResponder.cs
│   │   │   └── Middleware/
│   │   │       └── ResponderMiddleware.cs
│   │   ├── Responses/
│   │   │   ├── ErrorResponse.cs
│   │   │   ├── OkResponse.cs
│   │   │   └── Response.cs
│   │   ├── Security/
│   │   │   ├── IPSecurity/
│   │   │   │   └── IPSecurityPolicy.cs
│   │   │   ├── ISecurityPolicy.cs
│   │   │   └── Middleware/
│   │   │       └── SecurityMiddleware.cs
│   │   ├── ServiceDiscovery/
│   │   │   ├── Configuration/
│   │   │   │   └── ServiceFabricConfiguration.cs
│   │   │   ├── IServiceDiscoveryProviderFactory.cs
│   │   │   ├── Providers/
│   │   │   │   ├── ConfigurationServiceProvider.cs
│   │   │   │   ├── IServiceDiscoveryProvider.cs
│   │   │   │   └── ServiceFabricServiceDiscoveryProvider.cs
│   │   │   ├── ServiceDiscoveryFinderDelegate.cs
│   │   │   ├── ServiceDiscoveryProviderFactory.cs
│   │   │   └── UnableToFindServiceDiscoveryProviderError.cs
│   │   ├── Usings.cs
│   │   ├── Values/
│   │   │   ├── DownstreamPath.cs
│   │   │   ├── DownstreamPathTemplate.cs
│   │   │   ├── Service.cs
│   │   │   ├── ServiceHostAndPort.cs
│   │   │   ├── UpstreamHeaderTemplate.cs
│   │   │   └── UpstreamPathTemplate.cs
│   │   ├── WebSockets/
│   │   │   ├── ClientWebSocketConnector.cs
│   │   │   ├── ClientWebSocketOptionsProxy.cs
│   │   │   ├── ClientWebSocketProxy.cs
│   │   │   ├── IClientWebSocket.cs
│   │   │   ├── IClientWebSocketOptions.cs
│   │   │   ├── IWebSocketsFactory.cs
│   │   │   ├── WebSocketsFactory.cs
│   │   │   └── WebSocketsProxyMiddleware.cs
│   │   └── packages.lock.json
│   ├── Ocelot.Provider.Consul/
│   │   ├── Consul.cs
│   │   ├── ConsulClientFactory.cs
│   │   ├── ConsulFileConfigurationRepository.cs
│   │   ├── ConsulMiddlewareConfigurationProvider.cs
│   │   ├── ConsulProviderFactory.cs
│   │   ├── ConsulRegistryConfiguration.cs
│   │   ├── DefaultConsulServiceBuilder.cs
│   │   ├── Interfaces/
│   │   │   ├── IConsulClientFactory.cs
│   │   │   └── IConsulServiceBuilder.cs
│   │   ├── Ocelot.Provider.Consul.csproj
│   │   ├── OcelotBuilderExtensions.cs
│   │   ├── PollConsul.cs
│   │   ├── UnableToSetConfigInConsulError.cs
│   │   ├── Usings.cs
│   │   └── packages.lock.json
│   ├── Ocelot.Provider.Eureka/
│   │   ├── Eureka.cs
│   │   ├── EurekaMiddlewareConfigurationProvider.cs
│   │   ├── EurekaProviderFactory.cs
│   │   ├── Ocelot.Provider.Eureka.csproj
│   │   ├── OcelotBuilderExtensions.cs
│   │   ├── Usings.cs
│   │   └── packages.lock.json
│   ├── Ocelot.Provider.Kubernetes/
│   │   ├── EndPointClientV1.cs
│   │   ├── Interfaces/
│   │   │   ├── IEndPointClient.cs
│   │   │   ├── IKubeApiClientFactory.cs
│   │   │   ├── IKubeServiceBuilder.cs
│   │   │   └── IKubeServiceCreator.cs
│   │   ├── Kube.cs
│   │   ├── KubeApiClientExtensions.cs
│   │   ├── KubeApiClientFactory.cs
│   │   ├── KubeRegistryConfiguration.cs
│   │   ├── KubeServiceBuilder.cs
│   │   ├── KubeServiceCreator.cs
│   │   ├── KubernetesProviderFactory.cs
│   │   ├── ObservableExtensions.cs
│   │   ├── Ocelot.Provider.Kubernetes.csproj
│   │   ├── OcelotBuilderExtensions.cs
│   │   ├── PollKube.cs
│   │   ├── Usings.cs
│   │   ├── WatchKube.cs
│   │   └── packages.lock.json
│   └── Ocelot.Provider.Polly/
│       ├── CircuitBreakerStrategy.cs
│       ├── Interfaces/
│       │   └── IPollyQoSResiliencePipelineProvider.cs
│       ├── Ocelot.Provider.Polly.csproj
│       ├── OcelotBuilderExtensions.cs
│       ├── OcelotResiliencePipelineKey.cs
│       ├── PollyQoSResiliencePipelineProvider.cs
│       ├── PollyResiliencePipelineDelegatingHandler.cs
│       ├── TimeoutStrategy.cs
│       ├── Usings.cs
│       └── packages.lock.json
├── test/
│   ├── Ocelot.AcceptanceTests/
│   │   ├── .gitignore
│   │   ├── Administration/
│   │   │   ├── AdministrationSteps.cs
│   │   │   ├── CacheManagerTests.cs
│   │   │   └── OcelotBuilderExtensions.cs
│   │   ├── AggregateTests.cs
│   │   ├── Authentication/
│   │   │   ├── AuthenticationTests.cs
│   │   │   └── MultipleAuthSchemesFeatureTests.cs
│   │   ├── Authorization/
│   │   │   ├── AuthorizationSteps.cs
│   │   │   └── AuthorizationTests.cs
│   │   ├── Caching/
│   │   │   └── CachingTests.cs
│   │   ├── CancelRequestTests.cs
│   │   ├── CannotStartOcelotTests.cs
│   │   ├── CaseSensitiveRoutingTests.cs
│   │   ├── ConcurrentSteps.cs
│   │   ├── Configuration/
│   │   │   ├── ConfigurationInConsulTests.cs
│   │   │   ├── ConfigurationMergeTests.cs
│   │   │   ├── ConfigurationReloadTests.cs
│   │   │   ├── DownstreamHttpVersionTests.cs
│   │   │   └── TimeoutTests.cs
│   │   ├── ContentTests.cs
│   │   ├── Core/
│   │   │   ├── LoadTests.cs
│   │   │   └── ThreadSafeHeadersTests.cs
│   │   ├── CustomMiddlewareTests.cs
│   │   ├── DefaultVersionPolicyTests.cs
│   │   ├── GzipTests.cs
│   │   ├── HttpDelegatingHandlersTests.cs
│   │   ├── LoadBalancer/
│   │   │   ├── CookieStickySessionsTests.cs
│   │   │   ├── ILoadBalancerAnalyzer.cs
│   │   │   ├── LeastConnectionAnalyzer.cs
│   │   │   ├── LeastConnectionAnalyzerCreator.cs
│   │   │   ├── LoadBalancerAnalyzer.cs
│   │   │   ├── LoadBalancerTests.cs
│   │   │   ├── RoundRobinAnalyzer.cs
│   │   │   └── RoundRobinAnalyzerCreator.cs
│   │   ├── LogLevelTests.cs
│   │   ├── Logging/
│   │   │   ├── MemoryLogger.cs
│   │   │   └── TestLoggerFactory.cs
│   │   ├── Metadata/
│   │   │   └── DownstreamMetadataTests.cs
│   │   ├── Ocelot.AcceptanceTests.csproj
│   │   ├── Properties/
│   │   │   ├── AssemblyInfo.cs
│   │   │   ├── BddfyConfig.cs
│   │   │   └── GlobalSuppressions.cs
│   │   ├── QualityOfService/
│   │   │   ├── PollyQoSTests.cs
│   │   │   └── QosSteps.cs
│   │   ├── RateLimiting/
│   │   │   ├── ClientHeaderRateLimitingTests.cs
│   │   │   └── RateLimitingSteps.cs
│   │   ├── ReasonPhraseTests.cs
│   │   ├── Request/
│   │   │   ├── RequestMapperTests.cs
│   │   │   └── StreamContentTests.cs
│   │   ├── RequestIdTests.cs
│   │   ├── Requester/
│   │   │   ├── MessageInvokerPoolTests.cs
│   │   │   ├── PayloadTooLargeTests.cs
│   │   │   ├── RequesterSteps.cs
│   │   │   ├── TestMessageInvokerPool.cs
│   │   │   └── TestTracer.cs
│   │   ├── ResponseCodeTests.cs
│   │   ├── ReturnsErrorTests.cs
│   │   ├── Routing/
│   │   │   ├── RoutingBasedOnHeadersTests.cs
│   │   │   ├── RoutingTests.cs
│   │   │   ├── RoutingWithQueryStringTests.cs
│   │   │   └── UpstreamHostTests.cs
│   │   ├── Security/
│   │   │   └── SecurityOptionsTests.cs
│   │   ├── SequentialTests.cs
│   │   ├── ServiceDiscovery/
│   │   │   ├── ConsulAgentServiceExtensions.cs
│   │   │   ├── ConsulConfigurationInConsulTests.cs
│   │   │   ├── ConsulIntegrationTests.cs
│   │   │   ├── ConsulServiceDiscoveryTests.cs
│   │   │   ├── ConsulTwoDownstreamServicesTests.cs
│   │   │   ├── ConsulWebSocketTests.cs
│   │   │   ├── DynamicRoutingTests.cs
│   │   │   ├── EurekaServiceDiscoveryTests.cs
│   │   │   ├── KubeIntegrationTests.cs
│   │   │   ├── KubernetesServiceDiscoveryTests.cs
│   │   │   ├── PollKubeConcurrencyIntegrationTests.cs
│   │   │   ├── PollKubeIntegrationTests.cs
│   │   │   └── ServiceFabricTests.cs
│   │   ├── SslTests.cs
│   │   ├── StartupTests.cs
│   │   ├── Steps.cs
│   │   ├── Transformations/
│   │   │   ├── ClaimsToDownstreamPathTests.cs
│   │   │   ├── ClaimsToHeadersForwardingTests.cs
│   │   │   ├── ClaimsToQueryStringForwardingTests.cs
│   │   │   ├── HeaderTests.cs
│   │   │   └── MethodTests.cs
│   │   ├── Usings.cs
│   │   ├── WebSockets/
│   │   │   ├── ClientWebSocketTests.cs
│   │   │   ├── WebSocketsFactoryTests.cs
│   │   │   └── WebSocketsSteps.cs
│   │   ├── appsettings.json
│   │   ├── appsettings.product.json
│   │   ├── mycert2.crt
│   │   └── packages.lock.json
│   ├── Ocelot.Benchmarks/
│   │   ├── AllTheThingsBenchmarks.cs
│   │   ├── BenchmarkSteps.cs
│   │   ├── DownstreamRouteFinderMiddlewareBenchmarks.cs
│   │   ├── ExceptionHandlerMiddlewareBenchmarks.cs
│   │   ├── MsLoggerBenchmarks.cs
│   │   ├── Ocelot.Benchmarks.csproj
│   │   ├── PayloadBenchmarks.cs
│   │   ├── Program.cs
│   │   ├── Properties/
│   │   │   └── AssemblyInfo.cs
│   │   ├── ResponseBenchmarks.cs
│   │   ├── SerilogBenchmarks.cs
│   │   ├── UrlPathToUrlPathTemplateMatcherBenchmarks.cs
│   │   ├── Usings.cs
│   │   └── packages.lock.json
│   ├── Ocelot.ManualTest/
│   │   ├── Actions/
│   │   │   ├── Basic.cs
│   │   │   └── ManualTests.cs
│   │   ├── DelegatingHandlers/
│   │   │   └── FakeHandler.cs
│   │   ├── Dockerfile
│   │   ├── Middlewares/
│   │   │   └── MetadataMiddleware.cs
│   │   ├── Ocelot.ManualTest.csproj
│   │   ├── Ocelot.postman_collection.json
│   │   ├── Program.cs
│   │   ├── Properties/
│   │   │   └── launchSettings.json
│   │   ├── Tests/
│   │   │   └── Bug0930.html
│   │   ├── Usings.cs
│   │   ├── appsettings.Development.json
│   │   ├── appsettings.json
│   │   ├── docker-compose.yaml
│   │   ├── ocelot.identityserver4.json
│   │   ├── ocelot.json
│   │   ├── packages.lock.json
│   │   └── tempkey.rsa
│   └── Ocelot.UnitTests/
│       ├── Authentication/
│       │   ├── AuthenticationMiddlewareTests.cs
│       │   ├── AuthenticationOptionsCreatorTests.cs
│       │   ├── FileAuthenticationOptionsTests.cs
│       │   └── FileGlobalAuthenticationOptionsTests.cs
│       ├── Authorization/
│       │   ├── AuthorizationMiddlewareTests.cs
│       │   ├── ClaimsAuthorizerTests.cs
│       │   ├── UnauthorizedErrorTests.cs
│       │   └── UserDoesNotHaveClaimErrorTests.cs
│       ├── Cache/
│       │   ├── CacheOptionsCreatorTests.cs
│       │   ├── CachedResponseTests.cs
│       │   ├── DefaultCacheKeyGeneratorTests.cs
│       │   ├── DefaultMemoryCacheTests.cs
│       │   ├── FileCacheOptionsTests.cs
│       │   ├── FileGlobalCacheOptionsTests.cs
│       │   └── OutputCacheMiddlewareTests.cs
│       ├── Claims/
│       │   ├── AddClaimsToRequestTests.cs
│       │   └── ClaimsToClaimsMiddlewareTests.cs
│       ├── Configuration/
│       │   ├── AggregatesCreatorTests.cs
│       │   ├── ChangeTracking/
│       │   │   ├── OcelotConfigurationChangeTokenSourceTests.cs
│       │   │   ├── OcelotConfigurationChangeTokenTests.cs
│       │   │   └── OcelotConfigurationMonitorTests.cs
│       │   ├── ClaimToThingConfigurationParserTests.cs
│       │   ├── ClaimsToThingCreatorTests.cs
│       │   ├── ConfigurationCreatorTests.cs
│       │   ├── DefaultMetadataCreatorTests.cs
│       │   ├── DownstreamAddressesCreatorTests.cs
│       │   ├── DownstreamRouteExtensionsTests.cs
│       │   ├── DownstreamRouteTests.cs
│       │   ├── DynamicRoutesCreatorTests.cs
│       │   ├── FileConfigurationSetterTests.cs
│       │   ├── FileInternalConfigurationCreatorTests.cs
│       │   ├── FileModels/
│       │   │   ├── FileDynamicRouteTests.cs
│       │   │   ├── FileGlobalHttpHandlerOptionsTests.cs
│       │   │   ├── FileMetadataOptionsTests.cs
│       │   │   └── FileRouteTests.cs
│       │   ├── HashCreationTests.cs
│       │   ├── HeaderFindAndReplaceCreatorTests.cs
│       │   ├── HeaderFindAndReplaceTests.cs
│       │   ├── HttpHandlerOptionsCreatorTests.cs
│       │   ├── HttpHandlerOptionsTests.cs
│       │   ├── HttpVersionPolicyCreatorTests.cs
│       │   ├── MetadataOptionsTests.cs
│       │   ├── Parser/
│       │   │   └── ParsingConfigurationHeaderErrorTests.cs
│       │   ├── Repository/
│       │   │   ├── ConsulFileConfigurationPollerOptionTests.cs
│       │   │   ├── DiskFileConfigurationRepositoryTests.cs
│       │   │   ├── FileConfigurationPollerTests.cs
│       │   │   ├── InMemoryConfigurationRepositoryTests.cs
│       │   │   └── InMemoryFileConfigurationPollerOptionsTests.cs
│       │   ├── RequestIdKeyCreatorTests.cs
│       │   ├── RouteKeyCreatorTests.cs
│       │   ├── RouteTests.cs
│       │   ├── SecurityOptionsCreatorTests.cs
│       │   ├── ServiceProviderConfigurationCreatorTests.cs
│       │   ├── StaticRoutesCreatorTests.cs
│       │   ├── UpstreamHeaderTemplatePatternCreatorTests.cs
│       │   ├── UpstreamTemplatePatternCreatorTests.cs
│       │   ├── Validation/
│       │   │   ├── FileAuthenticationOptionsValidatorTests.cs
│       │   │   ├── FileConfigurationFluentValidatorTests.cs
│       │   │   ├── FileQoSOptionsFluentValidatorTests.cs
│       │   │   ├── HostAndPortValidatorTests.cs
│       │   │   └── RouteFluentValidatorTests.cs
│       │   └── VersionCreatorTests.cs
│       ├── Consul/
│       │   ├── AgentServiceExtensions.cs
│       │   ├── ConsulFileConfigurationRepositoryTests.cs
│       │   ├── ConsulProviderFactoryTests.cs
│       │   ├── DefaultConsulServiceBuilderTests.cs
│       │   ├── OcelotBuilderExtensionsTests.cs
│       │   └── PollingConsulServiceDiscoveryProviderTests.cs
│       ├── Controllers/
│       │   ├── FileConfigurationControllerTests.cs
│       │   └── OutputCacheControllerTests.cs
│       ├── DependencyInjection/
│       │   ├── ConfigurationBuilderExtensionsTests.cs
│       │   ├── OcelotBuilderTests.cs
│       │   └── ServiceCollectionExtensionsTests.cs
│       ├── DownstreamPathManipulation/
│       │   ├── ChangeDownstreamPathTemplateTests.cs
│       │   └── ClaimsToDownstreamPathMiddlewareTests.cs
│       ├── DownstreamRouteFinder/
│       │   ├── DiscoveryDownstreamRouteFinderTests.cs
│       │   ├── DownstreamRouteFinderMiddlewareTests.cs
│       │   ├── DownstreamRouteFinderTests.cs
│       │   ├── DownstreamRouteHolderTests.cs
│       │   ├── DownstreamRouteProviderFactoryTests.cs
│       │   ├── HeaderMatcher/
│       │   │   ├── HeaderPlaceholderNameAndValueFinderTests.cs
│       │   │   └── HeadersToHeaderTemplatesMatcherTests.cs
│       │   └── UrlMatcher/
│       │       ├── PlaceholderNameAndValueTests.cs
│       │       ├── RegExUrlMatcherTests.cs
│       │       └── UrlPathPlaceholderNameAndValueFinderTests.cs
│       ├── DownstreamUrlCreator/
│       │   ├── DownstreamPathPlaceholderReplacerTests.cs
│       │   └── DownstreamUrlCreatorMiddlewareTests.cs
│       ├── Errors/
│       │   ├── ErrorTests.cs
│       │   └── ExceptionHandlerMiddlewareTests.cs
│       ├── Eureka/
│       │   ├── EurekaMiddlewareConfigurationProviderTests.cs
│       │   ├── EurekaProviderFactoryTests.cs
│       │   ├── EurekaServiceDiscoveryProviderTests.cs
│       │   └── OcelotBuilderExtensionsTests.cs
│       ├── FileUnitTest.cs
│       ├── Headers/
│       │   ├── AddHeadersToRequestClaimToThingTests.cs
│       │   ├── AddHeadersToRequestPlainTests.cs
│       │   ├── AddHeadersToResponseTests.cs
│       │   ├── ClaimsToHeadersMiddlewareTests.cs
│       │   ├── HttpContextRequestHeaderReplacerTests.cs
│       │   ├── HttpHeadersTransformationMiddlewareTests.cs
│       │   ├── HttpResponseHeaderReplacerTests.cs
│       │   └── RemoveHeadersTests.cs
│       ├── Infrastructure/
│       │   ├── ClaimParserTests.cs
│       │   ├── ConfigAwarePlaceholdersTests.cs
│       │   ├── Extensions/
│       │   │   ├── ErrorListExtensionsTests.cs
│       │   │   ├── HttpContextExtensionsTests.cs
│       │   │   ├── HttpRequestExtensionsTests.cs
│       │   │   ├── IEnumerableExtensionsTests.cs
│       │   │   ├── Int32ExtensionsTests.cs
│       │   │   ├── StringBuilderExtensionsTests.cs
│       │   │   └── StringExtensionsTests.cs
│       │   ├── HttpDataRepositoryTests.cs
│       │   ├── InMemoryBusTests.cs
│       │   ├── PlaceholdersTests.cs
│       │   └── ScopesAuthorizerTests.cs
│       ├── Kubernetes/
│       │   ├── EndpointClientV1Tests.cs
│       │   ├── FakeKubeApiClientFactory.cs
│       │   ├── KubeApiClientFactoryTests.cs
│       │   ├── KubeServiceBuilderTests.cs
│       │   ├── KubeServiceCreatorTests.cs
│       │   ├── KubernetesProviderFactoryTests.cs
│       │   ├── ObservableExtensionsTests.cs
│       │   ├── OcelotBuilderExtensionsTests.cs
│       │   ├── PollKubeTests.cs
│       │   └── WatchKubeTests.cs
│       ├── LoadBalancer/
│       │   ├── CookieStickySessionsCreatorTests.cs
│       │   ├── CookieStickySessionsTests.cs
│       │   ├── DelegateInvokingLoadBalancerCreatorTests.cs
│       │   ├── LeaseEventArgsTests.cs
│       │   ├── LeaseTests.cs
│       │   ├── LeastConnectionCreatorTests.cs
│       │   ├── LeastConnectionTests.cs
│       │   ├── LoadBalancerFactoryTests.cs
│       │   ├── LoadBalancerHouseTests.cs
│       │   ├── LoadBalancerMiddlewareTests.cs
│       │   ├── LoadBalancerOptionsCreatorTests.cs
│       │   ├── LoadBalancerOptionsTests.cs
│       │   ├── NoLoadBalancerCreatorTests.cs
│       │   ├── NoLoadBalancerTests.cs
│       │   ├── RoundRobinCreatorTests.cs
│       │   └── RoundRobinTests.cs
│       ├── Logging/
│       │   ├── OcelotDiagnosticListenerTests.cs
│       │   ├── OcelotHttpTracingHandlerTests.cs
│       │   ├── OcelotLoggerFactoryTests.cs
│       │   ├── OcelotLoggerTests.cs
│       │   ├── OcelotLoggerTestsForDisposal.cs
│       │   └── TracingHandlerFactoryTests.cs
│       ├── Middleware/
│       │   ├── BaseUrlFinderTests.cs
│       │   ├── OcelotPipelineExtensionsTests.cs
│       │   └── OcelotPiplineBuilderTests.cs
│       ├── Multiplexing/
│       │   ├── DefinedAggregatorProviderTests.cs
│       │   ├── MultiplexingMiddlewareTests.cs
│       │   ├── ResponseAggregatorFactoryTests.cs
│       │   ├── SimpleJsonResponseAggregatorTests.cs
│       │   └── UserDefinedResponseAggregatorTests.cs
│       ├── Ocelot.UnitTests.csproj
│       ├── Polly/
│       │   ├── CircuitBreakerStrategyTests.cs
│       │   ├── OcelotBuilderExtensionsTests.cs
│       │   ├── PollyQoSResiliencePipelineProviderTests.cs
│       │   ├── PollyResiliencePipelineDelegatingHandlerTests.cs
│       │   └── TimeoutStrategyTests.cs
│       ├── Properties/
│       │   └── AssemblyInfo.cs
│       ├── QualityOfService/
│       │   ├── FileGlobalQoSOptionsTests.cs
│       │   ├── FileQoSOptionsTests.cs
│       │   ├── QoSFactoryTests.cs
│       │   ├── QoSOptionsCreatorTests.cs
│       │   └── QoSOptionsTests.cs
│       ├── QueryStrings/
│       │   ├── AddQueriesToRequestTests.cs
│       │   └── ClaimsToQueryStringMiddlewareTests.cs
│       ├── RateLimiting/
│       │   ├── DistributedCacheRateLimitStorageTests.cs
│       │   ├── FileGlobalRateLimitingTests.cs
│       │   ├── FileRateLimitByHeaderRuleTests.cs
│       │   ├── FileRateLimitRuleTests.cs
│       │   ├── FileRateLimitingTests.cs
│       │   ├── MemoryCacheRateLimitStorageTests.cs
│       │   ├── RateLimitCounterTests.cs
│       │   ├── RateLimitHeadersTests.cs
│       │   ├── RateLimitOptionsCreatorTests.cs
│       │   ├── RateLimitOptionsTests.cs
│       │   ├── RateLimitRuleTests.cs
│       │   ├── RateLimitingHeadersTests.cs
│       │   ├── RateLimitingMiddlewareTests.cs
│       │   └── RateLimitingTests.cs
│       ├── Repository/
│       │   └── HttpDataRepositoryTests.cs
│       ├── Request/
│       │   ├── Creator/
│       │   │   └── DownstreamRequestCreatorTests.cs
│       │   ├── DownstreamRequestInitialiserMiddlewareTests.cs
│       │   ├── DownstreamRequestTests.cs
│       │   └── Mapper/
│       │       ├── RequestMapperTests.cs
│       │       └── StreamHttpContentTests.cs
│       ├── RequestId/
│       │   └── RequestIdMiddlewareTests.cs
│       ├── Requester/
│       │   ├── DelegatingHandlerFactoryTests.cs
│       │   ├── FakeDelegatingHandler.cs
│       │   ├── HttpExceptionToErrorMapperTests.cs
│       │   ├── HttpRequesterMiddlewareTests.cs
│       │   ├── MessageInvokerCacheKeyTests.cs
│       │   ├── MessageInvokerHttpRequesterTests.cs
│       │   ├── MessageInvokerPoolTests.cs
│       │   └── TimeoutDelegatingHandlerTests.cs
│       ├── Responder/
│       │   ├── AnyError.cs
│       │   ├── ErrorsToHttpStatusCodeMapperTests.cs
│       │   ├── HttpContextResponderTests.cs
│       │   └── ResponderMiddlewareTests.cs
│       ├── Security/
│       │   ├── IPSecurityPolicyTests.cs
│       │   └── SecurityMiddlewareTests.cs
│       ├── SequentialTests.cs
│       ├── ServiceDiscovery/
│       │   ├── ConfigurationServiceProviderTests.cs
│       │   ├── ServiceDiscoveryProviderFactoryTests.cs
│       │   ├── ServiceFabricServiceDiscoveryProviderTests.cs
│       │   └── ServiceRegistryTests.cs
│       ├── TestRetry.cs
│       ├── UnitTest.cs
│       ├── UnitTests.runsettings
│       ├── Usings.cs
│       ├── WebSockets/
│       │   ├── ClientWebSocketConnectorTests.cs
│       │   ├── ClientWebSocketOptionsProxyTests.cs
│       │   ├── ClientWebSocketProxyTests.cs
│       │   ├── MockWebSocket.cs
│       │   ├── WebSocketsFactoryTests.cs
│       │   └── WebSocketsProxyMiddlewareTests.cs
│       ├── appsettings.json
│       └── packages.lock.json
└── testing/
    ├── AcceptanceSteps.cs
    ├── Authentication/
    │   ├── AuthenticationSteps.cs
    │   ├── AuthenticationTokenRequest.cs
    │   ├── AuthenticationTokenRequestEventArgs.cs
    │   └── OcelotScopes.cs
    ├── BearerToken.cs
    ├── Boxing/
    │   ├── Box.cs
    │   ├── FileRouteBox.cs
    │   └── FileRouteExtensions.cs
    ├── FileUnit.cs
    ├── Ocelot.Testing.csproj
    ├── Ocelot.cs
    ├── PortFinder.cs
    ├── README.md
    ├── ServiceHandler.cs
    ├── StreamExtensions.cs
    ├── TestHostBuilder.cs
    ├── TestWebBuilder.cs
    ├── Unit.cs
    └── Wait.cs
Download .txt
Showing preview only (532K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (5162 symbols across 770 files)

FILE: samples/Eureka/DownstreamService/Controllers/CategoryController.cs
  class CategoryController (line 5) | [Route("api/[controller]")]
    method Get (line 9) | [HttpGet]

FILE: samples/GraphQL/GraphQlDelegatingHandler.cs
  class GraphQLDelegatingHandler (line 8) | public class GraphQLDelegatingHandler : DelegatingHandler
    method GraphQLDelegatingHandler (line 14) | public GraphQLDelegatingHandler(IDocumentExecuter executer, IGraphQLTe...
    method SendAsync (line 20) | protected override async Task<HttpResponseMessage> SendAsync(HttpReque...

FILE: samples/GraphQL/Models/Hero.cs
  class Hero (line 3) | public class Hero

FILE: samples/GraphQL/Models/Query.cs
  class Query (line 5) | public class Query
    method GetHero (line 15) | [GraphQLMetadata("hero")]

FILE: samples/Kubernetes/DownstreamService/Controllers/ValuesController.cs
  class ValuesController (line 5) | [ApiController]
    method Get (line 10) | [HttpGet]
    method Get (line 17) | [HttpGet("{id}")]
    method Post (line 24) | [HttpPost]
    method Put (line 30) | [HttpPut("{id}")]
    method Delete (line 36) | [HttpDelete("{id}")]

FILE: samples/Kubernetes/DownstreamService/Controllers/WeatherForecastController.cs
  class WeatherForecastController (line 7) | [ApiController]
    method WeatherForecastController (line 18) | public WeatherForecastController(ILogger<WeatherForecastController> lo...
    method Get (line 23) | [HttpGet(Name = "GetWeatherForecast")]

FILE: samples/Kubernetes/DownstreamService/Models/WeatherForecast.cs
  class WeatherForecast (line 3) | public class WeatherForecast

FILE: samples/Metadata/MetadataResponder.cs
  class MetadataResponder (line 14) | public class MetadataResponder : HttpContextResponder
    method MetadataResponder (line 16) | public MetadataResponder(IRemoveOutputHeaders removeOutputHeaders)
    method WriteToUpstreamAsync (line 19) | protected override async Task WriteToUpstreamAsync(HttpContext context...
    method AddMetadataHeader (line 71) | private static void AddMetadataHeader(HttpContext context, IDictionary...
    method DetectEncoding (line 78) | private static Encoding DetectEncoding(HttpContent content)
    method ReadCompressedJsonAsync (line 94) | private static async Task<string> ReadCompressedJsonAsync(HttpResponse...
    method WriteJsonAsync (line 131) | private static Task WriteJsonAsync(HttpResponse to, HttpContent conten...
    method CompressBrotliAsync (line 167) | private static async Task<byte[]> CompressBrotliAsync(byte[] input, Ca...
    method DecompressBrotliAsync (line 177) | private static async Task<byte[]> DecompressBrotliAsync(Stream input, ...
    method DecompressZstandardAsync (line 186) | private static async Task<byte[]> DecompressZstandardAsync(Stream inpu...
    method DecompressDeflateAsync (line 195) | private static async Task<byte[]> DecompressDeflateAsync(Stream input,...
    method DecompressGZip (line 204) | public static byte[] DecompressGZip(Stream input)

FILE: samples/Metadata/Models/PostsPlugin2.cs
  class PostsPlugin2 (line 3) | public class PostsPlugin2

FILE: samples/Metadata/Models/TestDeflateResponse.cs
  class TestDeflateResponse (line 3) | public class TestDeflateResponse

FILE: samples/Metadata/Models/TestGZipResponse.cs
  class TestGZipResponse (line 3) | public class TestGZipResponse

FILE: samples/Metadata/Models/WeatherCurrent.cs
  class WeatherCurrent (line 3) | public class WeatherCurrent

FILE: samples/Metadata/Models/WeatherCurrentCondition.cs
  class WeatherCurrentCondition (line 3) | public class WeatherCurrentCondition

FILE: samples/Metadata/Models/WeatherLocation.cs
  class WeatherLocation (line 3) | public class WeatherLocation

FILE: samples/Metadata/Models/WeatherResponse.cs
  class WeatherResponse (line 3) | public class WeatherResponse

FILE: samples/Metadata/MyMiddlewares.cs
  class MyMiddlewares (line 10) | class MyMiddlewares
    method PreErrorResponderMiddleware (line 12) | public static async Task PreErrorResponderMiddleware(HttpContext conte...
    method ResponderMiddleware (line 67) | public static async Task ResponderMiddleware(HttpContext context, Func...

FILE: samples/ServiceDiscovery/ApiGateway/ServiceDiscovery/MyServiceDiscoveryProvider.cs
  class MyServiceDiscoveryProvider (line 8) | public class MyServiceDiscoveryProvider : IServiceDiscoveryProvider
    method MyServiceDiscoveryProvider (line 14) | public MyServiceDiscoveryProvider(IServiceProvider serviceProvider, Se...
    method GetAsync (line 21) | public Task<List<Service>> GetAsync()

FILE: samples/ServiceDiscovery/ApiGateway/ServiceDiscovery/MyServiceDiscoveryProviderFactory.cs
  class MyServiceDiscoveryProviderFactory (line 9) | public class MyServiceDiscoveryProviderFactory : IServiceDiscoveryProvid...
    method MyServiceDiscoveryProviderFactory (line 14) | public MyServiceDiscoveryProviderFactory(IOcelotLoggerFactory factory,...
    method Get (line 20) | public Response<IServiceDiscoveryProvider> Get(ServiceProviderConfigur...

FILE: samples/ServiceDiscovery/DownstreamService/Controllers/CategoriesController.cs
  class CategoriesController (line 3) | [ApiController]
    method Get (line 8) | [HttpGet]

FILE: samples/ServiceDiscovery/DownstreamService/Controllers/HealthController.cs
  class HealthController (line 7) | [ApiController]
    method Health (line 15) | [HttpGet]
    method Ready (line 33) | [HttpGet]

FILE: samples/ServiceDiscovery/DownstreamService/Controllers/WeatherForecastController.cs
  class WeatherForecastController (line 5) | [ApiController]
    method WeatherForecastController (line 16) | public WeatherForecastController(ILogger<WeatherForecastController> lo...
    method Get (line 21) | [HttpGet(Name = "GetWeatherForecast")]

FILE: samples/ServiceDiscovery/DownstreamService/Models/HealthResult.cs
  class HealthResult (line 3) | public class HealthResult : MicroserviceResult

FILE: samples/ServiceDiscovery/DownstreamService/Models/MicroserviceResult.cs
  class MicroserviceResult (line 3) | public class MicroserviceResult

FILE: samples/ServiceDiscovery/DownstreamService/Models/ReadyResult.cs
  class ReadyResult (line 5) | public class ReadyResult : MicroserviceResult

FILE: samples/ServiceDiscovery/DownstreamService/Models/WeatherForecast.cs
  class WeatherForecast (line 3) | public class WeatherForecast

FILE: samples/ServiceFabric/ApiGateway/OcelotApplicationApiGateway.cs
  class OcelotServiceWebService (line 14) | internal sealed class OcelotServiceWebService : StatelessService
    method OcelotServiceWebService (line 16) | public OcelotServiceWebService(StatelessServiceContext context)
    method CreateServiceInstanceListeners (line 20) | protected override IEnumerable<ServiceInstanceListener> CreateServiceI...

FILE: samples/ServiceFabric/ApiGateway/ServiceEventListener.cs
  class ServiceEventListener (line 18) | internal class ServiceEventListener : EventListener
    method ServiceEventListener (line 23) | public ServiceEventListener(string appName)
    method OnEventWritten (line 32) | protected override void OnEventWritten(EventWrittenEventArgs eventData)
    method Write (line 47) | private static String Write(string taskName, string eventName, string ...
    method ConvertLevelToString (line 74) | private static string ConvertLevelToString(EventLevel level)

FILE: samples/ServiceFabric/ApiGateway/ServiceEventSource.cs
  class ServiceEventSource (line 13) | public class ServiceEventSource : EventSource
    method Message (line 25) | [NonEvent]
    method Message (line 37) | [Event(MessageEventId, Level = EventLevel.Informational, Message = "{0...
    method ServiceTypeRegistered (line 48) | [Event(ServiceTypeRegisteredEventId, Level = EventLevel.Informational,...
    method ServiceHostInitializationFailed (line 54) | [NonEvent]
    method ServiceHostInitializationFailed (line 62) | [Event(ServiceHostInitializationFailedEventId, Level = EventLevel.Erro...
    method ServiceWebHostBuilderFailed (line 68) | [NonEvent]
    method ServiceWebHostBuilderFailed (line 76) | [Event(ServiceWebHostBuilderFailedEventId, Level = EventLevel.Error, M...

FILE: samples/ServiceFabric/ApiGateway/WebCommunicationListener.cs
  class WebCommunicationListener (line 10) | public class WebCommunicationListener : ICommunicationListener
    method WebCommunicationListener (line 20) | public WebCommunicationListener(string appRoot, ServiceContext service...
    method OpenAsync (line 26) | public async Task<string> OpenAsync(CancellationToken cancellationToken)
    method CloseAsync (line 71) | public Task CloseAsync(CancellationToken cancellationToken) => StopAll...
    method Abort (line 72) | public void Abort() => StopAll().GetAwaiter().GetResult();
    method StopAll (line 75) | private Task StopAll(CancellationToken cancellationToken = default)

FILE: samples/ServiceFabric/DownstreamService/ApiGateway.cs
  class ApiGateway (line 12) | internal sealed class ApiGateway : StatelessService
    method ApiGateway (line 14) | public ApiGateway(StatelessServiceContext context)
    method CreateServiceInstanceListeners (line 21) | protected override IEnumerable<ServiceInstanceListener> CreateServiceI...

FILE: samples/ServiceFabric/DownstreamService/Controllers/ValuesController.cs
  class ValuesController (line 5) | [Route("api/[controller]")]
    method Get (line 9) | [HttpGet]
    method Get (line 16) | [HttpGet("{id}")]
    method Post (line 23) | [HttpPost]
    method Put (line 29) | [HttpPut("{id}")]
    method Delete (line 35) | [HttpDelete("{id}")]

FILE: samples/ServiceFabric/DownstreamService/ServiceEventSource.cs
  class ServiceEventSource (line 6) | [EventSource(Name = "MyCompany-ServiceOcelotApplication-OcelotService")]
    method ServiceEventSource (line 11) | static ServiceEventSource()
    method ServiceEventSource (line 19) | private ServiceEventSource() : base() { }
    class Keywords (line 25) | public static class Keywords
    method Message (line 41) | [NonEvent]
    method Message (line 52) | [Event(MessageEventId, Level = EventLevel.Informational, Message = "{0...
    method ServiceMessage (line 61) | [NonEvent]
    method ServiceMessage (line 84) | [Event(ServiceMessageEventId, Level = EventLevel.Informational, Messag...
    method ServiceTypeRegistered (line 121) | [Event(ServiceTypeRegisteredEventId, Level = EventLevel.Informational,...
    method ServiceHostInitializationFailed (line 128) | [Event(ServiceHostInitializationFailedEventId, Level = EventLevel.Erro...
    method ServiceRequestStart (line 138) | [Event(ServiceRequestStartEventId, Level = EventLevel.Informational, M...
    method ServiceRequestStop (line 145) | [Event(ServiceRequestStopEventId, Level = EventLevel.Informational, Me...
    method GetReplicaOrInstanceId (line 153) | private static long GetReplicaOrInstanceId(ServiceContext context)
    method SizeInBytes (line 168) | private int SizeInBytes(string s)

FILE: samples/Web/DownstreamHostBuilder.cs
  class DownstreamHostBuilder (line 5) | public sealed class DownstreamHostBuilder : WebHostBuilder
    method Create (line 7) | public static IWebHostBuilder Create() => WebHost
    method Create (line 10) | public static IWebHostBuilder Create(Action<ServiceProviderOptions> co...
    method Create (line 14) | public static IWebHostBuilder Create(string[] args) => WebHost
    method Create (line 18) | public static IWebHostBuilder Create(string[] args, Action<ServiceProv...
    method WithEnabledValidateScopes (line 22) | public static void WithEnabledValidateScopes(ServiceProviderOptions op...
    method BasicSetup (line 26) | public static IWebHostBuilder BasicSetup() => Create();

FILE: samples/Web/OcelotHostBuilder.cs
  class OcelotHostBuilder (line 5) | public sealed class OcelotHostBuilder : WebHostBuilder
    method Create (line 7) | public static IWebHostBuilder Create() => WebHost
    method Create (line 10) | public static IWebHostBuilder Create(Action<ServiceProviderOptions> co...
    method Create (line 14) | public static IWebHostBuilder Create(string[] args) => WebHost
    method Create (line 18) | public static IWebHostBuilder Create(string[] args, Action<ServiceProv...
    method WithEnabledValidateScopes (line 22) | public static void WithEnabledValidateScopes(ServiceProviderOptions op...
    method BasicSetup (line 26) | public static IWebHostBuilder BasicSetup() => Create();

FILE: src/Ocelot.Provider.Consul/Consul.cs
  class Consul (line 8) | public class Consul : IServiceDiscoveryProvider
    method Consul (line 15) | public Consul(
    method GetAsync (line 27) | public virtual async Task<List<Service>> GetAsync()
    method BuildServices (line 47) | protected virtual IEnumerable<Service> BuildServices(ServiceEntry[] en...

FILE: src/Ocelot.Provider.Consul/ConsulClientFactory.cs
  class ConsulClientFactory (line 5) | public class ConsulClientFactory : IConsulClientFactory
    method Get (line 9) | public IConsulClient Get(ConsulRegistryConfiguration config)
    method OverrideConfig (line 15) | private static void OverrideConfig(ConsulClientConfiguration to, Consu...

FILE: src/Ocelot.Provider.Consul/ConsulFileConfigurationRepository.cs
  class ConsulFileConfigurationRepository (line 14) | public class ConsulFileConfigurationRepository : IFileConfigurationRepos...
    method ConsulFileConfigurationRepository (line 21) | public ConsulFileConfigurationRepository(
    method Get (line 40) | public async Task<Response<FileConfiguration>> Get()
    method Set (line 61) | public async Task<Response> Set(FileConfiguration ocelotConfiguration)

FILE: src/Ocelot.Provider.Consul/ConsulMiddlewareConfigurationProvider.cs
  class ConsulMiddlewareConfigurationProvider (line 13) | public static class ConsulMiddlewareConfigurationProvider
    method GetAsync (line 17) | private static async Task GetAsync(IApplicationBuilder builder)
    method UsingConsul (line 30) | private static bool UsingConsul(IFileConfigurationRepository fileConfi...
    method SetFileConfigInConsul (line 33) | private static async Task SetFileConfigInConsul(IApplicationBuilder bu...
    method ThrowToStopOcelotStarting (line 73) | private static void ThrowToStopOcelotStarting(Response config)
    method IsError (line 76) | private static bool IsError(Response response)
    method ConfigNotStoredInConsul (line 79) | private static bool ConfigNotStoredInConsul(Response<FileConfiguration...

FILE: src/Ocelot.Provider.Consul/ConsulProviderFactory.cs
  class ConsulProviderFactory (line 17) | public static class ConsulProviderFactory // TODO : IServiceDiscoveryPro...
    method CreateProvider (line 30) | private static IServiceDiscoveryProvider CreateProvider(IServiceProvid...

FILE: src/Ocelot.Provider.Consul/ConsulRegistryConfiguration.cs
  class ConsulRegistryConfiguration (line 3) | public class ConsulRegistryConfiguration // TODO Inherit from ServicePro...
    method ConsulRegistryConfiguration (line 13) | public ConsulRegistryConfiguration(string scheme, string host, int por...

FILE: src/Ocelot.Provider.Consul/DefaultConsulServiceBuilder.cs
  class DefaultConsulServiceBuilder (line 9) | public class DefaultConsulServiceBuilder : IConsulServiceBuilder
    method DefaultConsulServiceBuilder (line 19) | public DefaultConsulServiceBuilder(
    method IsValid (line 37) | public virtual bool IsValid(ServiceEntry entry)
    method BuildServices (line 55) | public virtual IEnumerable<Service> BuildServices(ServiceEntry[] entri...
    method GetNode (line 76) | protected virtual Node GetNode(ServiceEntry entry, Node[] nodes)
    method CreateService (line 79) | public virtual Service CreateService(ServiceEntry entry, Node node)
    method GetServiceName (line 88) | protected virtual string GetServiceName(ServiceEntry entry, Node node)
    method GetServiceHostAndPort (line 91) | protected virtual ServiceHostAndPort GetServiceHostAndPort(ServiceEntr...
    method GetDownstreamHost (line 96) | protected virtual string GetDownstreamHost(ServiceEntry entry, Node node)
    method GetServiceId (line 99) | protected virtual string GetServiceId(ServiceEntry entry, Node node)
    method GetServiceVersion (line 102) | protected virtual string GetServiceVersion(ServiceEntry entry, Node node)
    method GetServiceTags (line 108) | protected virtual IEnumerable<string> GetServiceTags(ServiceEntry entr...

FILE: src/Ocelot.Provider.Consul/Interfaces/IConsulClientFactory.cs
  type IConsulClientFactory (line 3) | public interface IConsulClientFactory
    method Get (line 5) | IConsulClient Get(ConsulRegistryConfiguration config);

FILE: src/Ocelot.Provider.Consul/Interfaces/IConsulServiceBuilder.cs
  type IConsulServiceBuilder (line 5) | public interface IConsulServiceBuilder
    method IsValid (line 9) | bool IsValid(ServiceEntry entry);
    method BuildServices (line 10) | IEnumerable<Service> BuildServices(ServiceEntry[] entries, Node[] nodes);
    method CreateService (line 11) | Service CreateService(ServiceEntry serviceEntry, Node serviceNode);

FILE: src/Ocelot.Provider.Consul/OcelotBuilderExtensions.cs
  class OcelotBuilderExtensions (line 9) | public static class OcelotBuilderExtensions
    method AddConsul (line 23) | public static IOcelotBuilder AddConsul(this IOcelotBuilder builder)
    method AddConsul (line 46) | public static IOcelotBuilder AddConsul<TServiceBuilder>(this IOcelotBu...
    method AddConfigStoredInConsul (line 55) | public static IOcelotBuilder AddConfigStoredInConsul(this IOcelotBuild...

FILE: src/Ocelot.Provider.Consul/PollConsul.cs
  class PollConsul (line 7) | public sealed class PollConsul : IServiceDiscoveryProvider
    method PollConsul (line 17) | public PollConsul(int pollingInterval, string serviceName, IOcelotLogg...
    method GetAsync (line 39) | public Task<List<Service>> GetAsync()

FILE: src/Ocelot.Provider.Consul/UnableToSetConfigInConsulError.cs
  class UnableToSetConfigInConsulError (line 6) | public class UnableToSetConfigInConsulError : Error
    method UnableToSetConfigInConsulError (line 8) | public UnableToSetConfigInConsulError(string s)

FILE: src/Ocelot.Provider.Eureka/Eureka.cs
  class Eureka (line 6) | public class Eureka : IServiceDiscoveryProvider
    method Eureka (line 11) | public Eureka(string serviceName, IDiscoveryClient client)
    method GetAsync (line 17) | public Task<List<Service>> GetAsync()

FILE: src/Ocelot.Provider.Eureka/EurekaMiddlewareConfigurationProvider.cs
  class EurekaMiddlewareConfigurationProvider (line 8) | public class EurekaMiddlewareConfigurationProvider
    method UsingEurekaServiceDiscoveryProvider (line 24) | private static bool UsingEurekaServiceDiscoveryProvider(IInternalConfi...

FILE: src/Ocelot.Provider.Eureka/EurekaProviderFactory.cs
  class EurekaProviderFactory (line 7) | public static class EurekaProviderFactory
    method CreateProvider (line 16) | private static IServiceDiscoveryProvider CreateProvider(IServiceProvid...

FILE: src/Ocelot.Provider.Eureka/OcelotBuilderExtensions.cs
  class OcelotBuilderExtensions (line 7) | public static class OcelotBuilderExtensions
    method AddEureka (line 9) | public static IOcelotBuilder AddEureka(this IOcelotBuilder builder)

FILE: src/Ocelot.Provider.Kubernetes/EndPointClientV1.cs
  class EndPointClientV1 (line 8) | public class EndPointClientV1 : KubeResourceClient, IEndPointClient
    method EndPointClientV1 (line 16) | public EndPointClientV1(IKubeApiClient client) : base(client)
    method GetAsync (line 20) | public Task<EndpointsV1> GetAsync(string serviceName, string kubeNames...
    method Watch (line 34) | public IObservable<IResourceEventV1<EndpointsV1>> Watch(string service...

FILE: src/Ocelot.Provider.Kubernetes/Interfaces/IEndPointClient.cs
  type IEndPointClient (line 6) | public interface IEndPointClient : IKubeResourceClient
    method GetAsync (line 8) | Task<EndpointsV1> GetAsync(string serviceName, string kubeNamespace = ...
    method Watch (line 10) | IObservable<IResourceEventV1<EndpointsV1>> Watch(string serviceName, s...

FILE: src/Ocelot.Provider.Kubernetes/Interfaces/IKubeApiClientFactory.cs
  type IKubeApiClientFactory (line 3) | public interface IKubeApiClientFactory
    method Get (line 5) | KubeApiClient Get(bool usePodServiceAccount);

FILE: src/Ocelot.Provider.Kubernetes/Interfaces/IKubeServiceBuilder.cs
  type IKubeServiceBuilder (line 6) | public interface IKubeServiceBuilder
    method BuildServices (line 8) | IEnumerable<Service> BuildServices(KubeRegistryConfiguration configura...

FILE: src/Ocelot.Provider.Kubernetes/Interfaces/IKubeServiceCreator.cs
  type IKubeServiceCreator (line 6) | public interface IKubeServiceCreator
    method Create (line 8) | IEnumerable<Service> Create(KubeRegistryConfiguration configuration, E...
    method CreateInstance (line 9) | IEnumerable<Service> CreateInstance(KubeRegistryConfiguration configur...

FILE: src/Ocelot.Provider.Kubernetes/Kube.cs
  class Kube (line 16) | public class Kube : IServiceDiscoveryProvider, IDisposable
    method Kube (line 26) | public Kube(
    method GetAsync (line 38) | public virtual async Task<List<Service>> GetAsync()
    method Message (line 54) | private string Message(string details)
    method GetEndpoint (line 57) | private async Task<EndpointsV1> GetEndpoint()
    method CheckErroneousState (line 96) | private bool CheckErroneousState(EndpointsV1 endpoint)
    method GetMessage (line 99) | private string GetMessage(string message)
    method BuildServices (line 102) | protected virtual IEnumerable<Service> BuildServices(KubeRegistryConfi...
    method Dispose (line 107) | protected virtual void Dispose(bool disposing)
    method Dispose (line 121) | public void Dispose()

FILE: src/Ocelot.Provider.Kubernetes/KubeApiClientExtensions.cs
  class KubeApiClientExtensions (line 5) | public static class KubeApiClientExtensions
    method EndpointsV1 (line 7) | public static IEndPointClient EndpointsV1(this IKubeApiClient client)

FILE: src/Ocelot.Provider.Kubernetes/KubeApiClientFactory.cs
  class KubeApiClientFactory (line 7) | public class KubeApiClientFactory : IKubeApiClientFactory
    method KubeApiClientFactory (line 13) | public KubeApiClientFactory(ILoggerFactory logger, IOptions<KubeClient...
    method Get (line 26) | public virtual KubeApiClient Get(bool usePodServiceAccount)

FILE: src/Ocelot.Provider.Kubernetes/KubeRegistryConfiguration.cs
  class KubeRegistryConfiguration (line 3) | public class KubeRegistryConfiguration

FILE: src/Ocelot.Provider.Kubernetes/KubeServiceBuilder.cs
  class KubeServiceBuilder (line 8) | public class KubeServiceBuilder : IKubeServiceBuilder
    method KubeServiceBuilder (line 13) | public KubeServiceBuilder(IOcelotLoggerFactory factory, IKubeServiceCr...
    method BuildServices (line 22) | public virtual IEnumerable<Service> BuildServices(KubeRegistryConfigur...
    method Check (line 35) | private static string Check(string str) => string.IsNullOrEmpty(str) ?...

FILE: src/Ocelot.Provider.Kubernetes/KubeServiceCreator.cs
  class KubeServiceCreator (line 8) | public class KubeServiceCreator : IKubeServiceCreator
    method KubeServiceCreator (line 10) | public KubeServiceCreator(IOcelotLoggerFactory factory)
    method Create (line 16) | public virtual IEnumerable<Service> Create(KubeRegistryConfiguration c...
    method CreateInstance (line 23) | public virtual IEnumerable<Service> CreateInstance(KubeRegistryConfigu...
    method GetServiceName (line 37) | protected virtual string GetServiceName(KubeRegistryConfiguration conf...
    method GetServiceHostAndPort (line 40) | protected virtual ServiceHostAndPort GetServiceHostAndPort(KubeRegistr...
    method GetServiceId (line 53) | protected virtual string GetServiceId(KubeRegistryConfiguration config...
    method GetServiceVersion (line 55) | protected virtual string GetServiceVersion(KubeRegistryConfiguration c...
    method GetServiceTags (line 57) | protected virtual IEnumerable<string> GetServiceTags(KubeRegistryConfi...

FILE: src/Ocelot.Provider.Kubernetes/KubernetesProviderFactory.cs
  class KubernetesProviderFactory (line 10) | public static class KubernetesProviderFactory // TODO : IServiceDiscover...
    method CreateProvider (line 19) | private static IServiceDiscoveryProvider CreateProvider(IServiceProvid...

FILE: src/Ocelot.Provider.Kubernetes/ObservableExtensions.cs
  class ObservableExtensions (line 6) | public static class ObservableExtensions
    method RetryAfter (line 8) | public static IObservable<TSource> RetryAfter<TSource>(this IObservabl...
    method RepeatInfinite (line 11) | private static IEnumerable<IObservable<TSource>> RepeatInfinite<TSourc...

FILE: src/Ocelot.Provider.Kubernetes/OcelotBuilderExtensions.cs
  class OcelotBuilderExtensions (line 14) | public static class OcelotBuilderExtensions
    method AddKubernetes (line 24) | public static IOcelotBuilder AddKubernetes(this IOcelotBuilder builder...
    method AddKubernetes (line 80) | public static IOcelotBuilder AddKubernetes(this IOcelotBuilder builder...
    method Str (line 127) | private static string Str(this IConfigurationSection sec, string key, ...
    method Int (line 133) | private static int Int(this IConfigurationSection sec, string key, int...

FILE: src/Ocelot.Provider.Kubernetes/PollKube.cs
  class PollKube (line 11) | public class PollKube : IServiceDiscoveryProvider, IDisposable
    method PollKube (line 23) | public PollKube(int pollingInterval, IOcelotLoggerFactory factory, ISe...
    method GetAsync (line 30) | public async Task<List<Service>> GetAsync()
    method PollAsync (line 55) | protected virtual async Task<List<Service>> PollAsync(CancellationToke...
    method StartAsync (line 88) | protected async Task StartAsync()
    method Stop (line 108) | protected void Stop()
    method Dispose (line 122) | public void Dispose()
    method Dispose (line 128) | protected virtual void Dispose(bool disposing)

FILE: src/Ocelot.Provider.Kubernetes/WatchKube.cs
  class WatchKube (line 10) | public class WatchKube : IServiceDiscoveryProvider, IDisposable
    method WatchKube (line 42) | public WatchKube(
    method GetAsync (line 59) | public virtual async Task<List<Service>> GetAsync()
    method SetFirstResultsCompletedAfterDelay (line 71) | private void SetFirstResultsCompletedAfterDelay()
    method OnNext (line 79) | private void OnNext(IResourceEventV1<EndpointsV1> endpointEvent)
    method OnCompleted (line 91) | private void OnCompleted() => _logger.LogInformation(() => GetMessage(...
    method OnException (line 92) | private void OnException(Exception ex) => _logger.LogError(() => GetMe...
    method CreateSubscription (line 94) | private IDisposable CreateSubscription() => _kubeApi
    method GetMessage (line 101) | private string GetMessage(string message)
    method Dispose (line 104) | public void Dispose()

FILE: src/Ocelot.Provider.Polly/CircuitBreakerStrategy.cs
  class CircuitBreakerStrategy (line 9) | public static class CircuitBreakerStrategy
    method BreakDuration (line 24) | public static int BreakDuration(int milliseconds) => IsValidBreakDurat...
    method IsValidBreakDuration (line 25) | public static bool IsValidBreakDuration(this int milliseconds) => mill...
    method MinimumThroughput (line 39) | public static int MinimumThroughput(int failures) => IsValidMinimumThr...
    method IsValidMinimumThroughput (line 40) | public static bool IsValidMinimumThroughput(this int failures) => fail...
    method FailureRatio (line 55) | public static double FailureRatio(double ratio) => IsValidFailureRatio...
    method IsValidFailureRatio (line 56) | public static bool IsValidFailureRatio(this double ratio) => ratio > L...
    method SamplingDuration (line 71) | public static int SamplingDuration(int milliseconds) => IsValidSamplin...
    method IsValidSamplingDuration (line 72) | public static bool IsValidSamplingDuration(this int milliseconds) => m...

FILE: src/Ocelot.Provider.Polly/Interfaces/IPollyQoSResiliencePipelineProvider.cs
  type IPollyQoSResiliencePipelineProvider (line 7) | public interface IPollyQoSResiliencePipelineProvider<TResult>
    method GetResiliencePipeline (line 15) | ResiliencePipeline<TResult> GetResiliencePipeline(DownstreamRoute route);

FILE: src/Ocelot.Provider.Polly/OcelotBuilderExtensions.cs
  class OcelotBuilderExtensions (line 15) | public static class OcelotBuilderExtensions
    method CreateRequestTimedOutError (line 28) | private static Error CreateRequestTimedOutError(Exception e) => new Re...
    method AddPolly (line 38) | public static IOcelotBuilder AddPolly<TProvider>(this IOcelotBuilder b...
    method AddPolly (line 56) | public static IOcelotBuilder AddPolly<TProvider>(this IOcelotBuilder b...
    method AddPolly (line 67) | public static IOcelotBuilder AddPolly<TProvider>(this IOcelotBuilder b...
    method AddPolly (line 84) | public static IOcelotBuilder AddPolly<TProvider>(this IOcelotBuilder b...
    method AddPolly (line 101) | public static IOcelotBuilder AddPolly(this IOcelotBuilder builder)
    method GetDelegatingHandler (line 111) | private static DelegatingHandler GetDelegatingHandler(DownstreamRoute ...

FILE: src/Ocelot.Provider.Polly/OcelotResiliencePipelineKey.cs
  type OcelotResiliencePipelineKey (line 9) | public record OcelotResiliencePipelineKey(string Key);

FILE: src/Ocelot.Provider.Polly/PollyQoSResiliencePipelineProvider.cs
  class PollyQoSResiliencePipelineProvider (line 15) | public class PollyQoSResiliencePipelineProvider : IPollyQoSResiliencePip...
    method PollyQoSResiliencePipelineProvider (line 20) | public PollyQoSResiliencePipelineProvider(
    method GetRouteName (line 42) | protected virtual string GetRouteName(DownstreamRoute route) => route....
    method GetResiliencePipeline (line 49) | public ResiliencePipeline<HttpResponseMessage> GetResiliencePipeline(D...
    method ConfigureStrategies (line 63) | protected virtual void ConfigureStrategies(ResiliencePipelineBuilder<H...
    method CircuitBreakerValidationMessage (line 69) | protected virtual string CircuitBreakerValidationMessage(DownstreamRou...
    method IsConfigurationValidForCircuitBreaker (line 72) | protected virtual bool IsConfigurationValidForCircuitBreaker(Downstrea...
    method TimeoutValidationMessage (line 118) | protected virtual string TimeoutValidationMessage(DownstreamRoute route)
    method IsConfigurationValidForTimeout (line 121) | protected virtual bool IsConfigurationValidForTimeout(DownstreamRoute ...
    method ToStr (line 149) | public static string ToStr(int? value) => value.HasValue ? value.ToStr...
    method The (line 151) | public static string The(List<Func<string>> warnings, Func<string> msg)
    method ConfigureCircuitBreaker (line 160) | protected virtual ResiliencePipelineBuilder<HttpResponseMessage> Confi...
    method ConfigureTimeout (line 212) | protected virtual ResiliencePipelineBuilder<HttpResponseMessage> Confi...

FILE: src/Ocelot.Provider.Polly/PollyResiliencePipelineDelegatingHandler.cs
  class PollyResiliencePipelineDelegatingHandler (line 11) | public class PollyResiliencePipelineDelegatingHandler : DelegatingHandler
    method PollyResiliencePipelineDelegatingHandler (line 17) | public PollyResiliencePipelineDelegatingHandler(
    method GetQoSProvider (line 27) | private IPollyQoSResiliencePipelineProvider<HttpResponseMessage> GetQo...
    method SendAsync (line 43) | protected override async Task<HttpResponseMessage> SendAsync(HttpReque...

FILE: src/Ocelot.Provider.Polly/TimeoutStrategy.cs
  class TimeoutStrategy (line 9) | public static class TimeoutStrategy
    method Timeout (line 21) | public static int? Timeout(int milliseconds) => IsValidTimeout(millise...
    method IsValidTimeout (line 22) | public static bool IsValidTimeout(this int milliseconds) => millisecon...

FILE: src/Ocelot/Administration/AdministrationPath.cs
  class AdministrationPath (line 3) | public class AdministrationPath : IAdministrationPath
    method AdministrationPath (line 5) | public AdministrationPath(string path, string apiSecret, Uri externalJ...

FILE: src/Ocelot/Administration/FileConfigurationController.cs
  class FileConfigurationController (line 11) | [Authorize]
    method FileConfigurationController (line 18) | public FileConfigurationController(IFileConfigurationRepository repo, ...
    method Get (line 24) | [HttpGet]
    method Post (line 37) | [HttpPost]

FILE: src/Ocelot/Administration/IAdministrationPath.cs
  type IAdministrationPath (line 3) | public interface IAdministrationPath

FILE: src/Ocelot/Administration/OutputCacheController.cs
  class OutputCacheController (line 9) | [Authorize]
    method OutputCacheController (line 15) | public OutputCacheController(IOcelotCache<CachedResponse> cache)
    method Delete (line 20) | [HttpDelete]

FILE: src/Ocelot/Authentication/AuthenticationMiddleware.cs
  class AuthenticationMiddleware (line 10) | public sealed class AuthenticationMiddleware : OcelotMiddleware
    method AuthenticationMiddleware (line 14) | public AuthenticationMiddleware(RequestDelegate next, IOcelotLoggerFac...
    method Invoke (line 20) | public async Task Invoke(HttpContext context)
    method SetUnauthenticatedError (line 53) | private void SetUnauthenticatedError(HttpContext httpContext, string p...
    method AuthenticateAsync (line 61) | private async Task<AuthenticateResult> AuthenticateAsync(HttpContext c...

FILE: src/Ocelot/Authorization/AuthorizationMiddleware.cs
  class AuthorizationMiddleware (line 8) | public class AuthorizationMiddleware : OcelotMiddleware
    method AuthorizationMiddleware (line 14) | public AuthorizationMiddleware(RequestDelegate next,
    method Invoke (line 25) | public async Task Invoke(HttpContext context)

FILE: src/Ocelot/Authorization/ClaimValueNotAuthorizedError.cs
  class ClaimValueNotAuthorizedError (line 5) | public class ClaimValueNotAuthorizedError : Error
    method ClaimValueNotAuthorizedError (line 7) | public ClaimValueNotAuthorizedError(string message)

FILE: src/Ocelot/Authorization/ClaimsAuthorizer.cs
  class ClaimsAuthorizer (line 12) | public partial class ClaimsAuthorizer : IClaimsAuthorizer
    method ClaimsAuthorizer (line 16) | public ClaimsAuthorizer(IClaimsParser claimsParser)
    method RegexAuthorize (line 21) | [GeneratedRegex(@"^{(?<variable>.+)}$", RegexOptions.None, RegexGlobal...
    method Authorize (line 24) | public Response<bool> Authorize(

FILE: src/Ocelot/Authorization/IClaimsAuthorizer.cs
  type IClaimsAuthorizer (line 7) | public interface IClaimsAuthorizer
    method Authorize (line 9) | Response<bool> Authorize(

FILE: src/Ocelot/Authorization/IScopesAuthorizer.cs
  type IScopesAuthorizer (line 6) | public interface IScopesAuthorizer
    method Authorize (line 20) | Response<bool> Authorize(ClaimsPrincipal claimsPrincipal, List<string>...

FILE: src/Ocelot/Authorization/ScopeNotAuthorizedError.cs
  class ScopeNotAuthorizedError (line 6) | public class ScopeNotAuthorizedError : Error
    method ScopeNotAuthorizedError (line 8) | public ScopeNotAuthorizedError(string message)

FILE: src/Ocelot/Authorization/ScopesAuthorizer.cs
  class ScopesAuthorizer (line 8) | public class ScopesAuthorizer : IScopesAuthorizer
    method ScopesAuthorizer (line 15) | public ScopesAuthorizer(IClaimsParser claimsParser)
    method Authorize (line 24) | public Response<bool> Authorize(ClaimsPrincipal claimsPrincipal, List<...

FILE: src/Ocelot/Authorization/UnauthorizedError.cs
  class UnauthorizedError (line 6) | public class UnauthorizedError : Error
    method UnauthorizedError (line 8) | public UnauthorizedError(string message)

FILE: src/Ocelot/Authorization/UserDoesNotHaveClaimError.cs
  class UserDoesNotHaveClaimError (line 6) | public class UserDoesNotHaveClaimError : Error
    method UserDoesNotHaveClaimError (line 8) | public UserDoesNotHaveClaimError(string message)

FILE: src/Ocelot/Cache/CachedResponse.cs
  class CachedResponse (line 3) | public class CachedResponse
    method CachedResponse (line 5) | public CachedResponse(

FILE: src/Ocelot/Cache/DefaultCacheKeyGenerator.cs
  class DefaultCacheKeyGenerator (line 6) | public class DefaultCacheKeyGenerator : ICacheKeyGenerator
    method GenerateRequestCacheKey (line 10) | public async ValueTask<string> GenerateRequestCacheKey(DownstreamReque...

FILE: src/Ocelot/Cache/DefaultMemoryCache.cs
  class DefaultMemoryCache (line 6) | public class DefaultMemoryCache<T> : IOcelotCache<T>
    method DefaultMemoryCache (line 11) | public DefaultMemoryCache(IMemoryCache memoryCache)
    method Add (line 17) | public bool Add(string key, T value, string region, TimeSpan ttl)
    method AddOrUpdate (line 29) | public T AddOrUpdate(string key, T value, string region, TimeSpan ttl)
    method Get (line 40) | public T Get(string key, string region)
    method ClearRegion (line 50) | public void ClearRegion(string region)
    method SetRegion (line 63) | private void SetRegion(string region, string key)
    method TryGetValue (line 78) | public bool TryGetValue(string key, string region, out T value)

FILE: src/Ocelot/Cache/ICacheKeyGenerator.cs
  type ICacheKeyGenerator (line 6) | public interface ICacheKeyGenerator
    method GenerateRequestCacheKey (line 8) | ValueTask<string> GenerateRequestCacheKey(DownstreamRequest downstream...

FILE: src/Ocelot/Cache/IOcelotCache.cs
  type IOcelotCache (line 3) | public interface IOcelotCache<T>
    method Add (line 16) | bool Add(string key, T value, string region, TimeSpan ttl);
    method AddOrUpdate (line 17) | T AddOrUpdate(string key, T value, string region, TimeSpan ttl);
    method Get (line 19) | T Get(string key, string region);
    method ClearRegion (line 21) | void ClearRegion(string region);
    method TryGetValue (line 23) | bool TryGetValue(string key, string region, out T value);

FILE: src/Ocelot/Cache/MD5Helper.cs
  class MD5Helper (line 6) | public static class MD5Helper
    method GenerateMd5 (line 8) | public static string GenerateMd5(byte[] contentBytes)
    method GenerateMd5 (line 21) | public static string GenerateMd5(string contentString)

FILE: src/Ocelot/Cache/OutputCacheMiddleware.cs
  class OutputCacheMiddleware (line 7) | public class OutputCacheMiddleware : OcelotMiddleware
    method OutputCacheMiddleware (line 13) | public OutputCacheMiddleware(RequestDelegate next,
    method Invoke (line 24) | public async Task Invoke(HttpContext httpContext)
    method SetHttpResponseMessageThisRequest (line 67) | private static void SetHttpResponseMessageThisRequest(HttpContext cont...
    method CreateHttpResponseMessage (line 70) | private static DownstreamResponse CreateHttpResponseMessage(CachedResp...
    method CreateCachedResponse (line 82) | private static async Task<CachedResponse> CreateCachedResponse(Downstr...

FILE: src/Ocelot/Claims/AddClaimsToRequest.cs
  class AddClaimsToRequest (line 9) | public class AddClaimsToRequest : IAddClaimsToRequest
    method AddClaimsToRequest (line 13) | public AddClaimsToRequest(IClaimsParser claimsParser)
    method SetClaimsOnContext (line 18) | public Response SetClaimsOnContext(List<ClaimToThing> claimsToThings, ...

FILE: src/Ocelot/Claims/IAddClaimsToRequest.cs
  type IAddClaimsToRequest (line 7) | public interface IAddClaimsToRequest
    method SetClaimsOnContext (line 9) | Response SetClaimsOnContext(List<ClaimToThing> claimsToThings,

FILE: src/Ocelot/Claims/Middleware/ClaimsToClaimsMiddleware.cs
  class ClaimsToClaimsMiddleware (line 7) | public class ClaimsToClaimsMiddleware : OcelotMiddleware
    method ClaimsToClaimsMiddleware (line 12) | public ClaimsToClaimsMiddleware(RequestDelegate next,
    method Invoke (line 21) | public async Task Invoke(HttpContext httpContext)

FILE: src/Ocelot/Configuration/AuthenticationOptions.cs
  class AuthenticationOptions (line 6) | public sealed class AuthenticationOptions
    method AuthenticationOptions (line 8) | public AuthenticationOptions()
    method AuthenticationOptions (line 15) | public AuthenticationOptions(FileAuthenticationOptions options)
    method AuthenticationOptions (line 22) | public AuthenticationOptions(List<string> allowedScopes, string[] auth...
    method Merge (line 29) | private static string[] Merge(string primaryKey, string[] keys)

FILE: src/Ocelot/Configuration/Builder/DownstreamRouteBuilder.cs
  class DownstreamRouteBuilder (line 7) | public class DownstreamRouteBuilder
    method DownstreamRouteBuilder (line 44) | public DownstreamRouteBuilder()
    method WithDownstreamAddresses (line 52) | public DownstreamRouteBuilder WithDownstreamAddresses(List<DownstreamH...
    method WithDownStreamHttpMethod (line 58) | public DownstreamRouteBuilder WithDownStreamHttpMethod(string method)
    method WithLoadBalancerOptions (line 64) | public DownstreamRouteBuilder WithLoadBalancerOptions(LoadBalancerOpti...
    method WithDownstreamScheme (line 70) | public DownstreamRouteBuilder WithDownstreamScheme(string downstreamSc...
    method WithDownstreamPathTemplate (line 76) | public DownstreamRouteBuilder WithDownstreamPathTemplate(string input)
    method WithUpstreamPathTemplate (line 82) | public DownstreamRouteBuilder WithUpstreamPathTemplate(UpstreamPathTem...
    method WithUpstreamHttpMethod (line 88) | public DownstreamRouteBuilder WithUpstreamHttpMethod(IEnumerable<strin...
    method WithRequestIdKey (line 94) | public DownstreamRouteBuilder WithRequestIdKey(string input)
    method WithClaimsToHeaders (line 100) | public DownstreamRouteBuilder WithClaimsToHeaders(List<ClaimToThing> i...
    method WithClaimsToClaims (line 106) | public DownstreamRouteBuilder WithClaimsToClaims(List<ClaimToThing> in...
    method WithRouteClaimsRequirement (line 112) | public DownstreamRouteBuilder WithRouteClaimsRequirement(Dictionary<st...
    method WithClaimsToQueries (line 118) | public DownstreamRouteBuilder WithClaimsToQueries(List<ClaimToThing> i...
    method WithClaimsToDownstreamPath (line 124) | public DownstreamRouteBuilder WithClaimsToDownstreamPath(List<ClaimToT...
    method WithCacheOptions (line 130) | public DownstreamRouteBuilder WithCacheOptions(CacheOptions input)
    method WithQosOptions (line 136) | public DownstreamRouteBuilder WithQosOptions(QoSOptions input)
    method WithLoadBalancerKey (line 142) | public DownstreamRouteBuilder WithLoadBalancerKey(string loadBalancerKey)
    method WithAuthenticationOptions (line 148) | public DownstreamRouteBuilder WithAuthenticationOptions(Authentication...
    method WithRateLimitOptions (line 154) | public DownstreamRouteBuilder WithRateLimitOptions(RateLimitOptions in...
    method WithHttpHandlerOptions (line 160) | public DownstreamRouteBuilder WithHttpHandlerOptions(HttpHandlerOption...
    method WithServiceName (line 166) | public DownstreamRouteBuilder WithServiceName(string serviceName)
    method WithServiceNamespace (line 172) | public DownstreamRouteBuilder WithServiceNamespace(string serviceNames...
    method WithUpstreamHeaderFindAndReplace (line 178) | public DownstreamRouteBuilder WithUpstreamHeaderFindAndReplace(List<He...
    method WithDownstreamHeaderFindAndReplace (line 184) | public DownstreamRouteBuilder WithDownstreamHeaderFindAndReplace(List<...
    method WithKey (line 190) | public DownstreamRouteBuilder WithKey(string key)
    method WithDelegatingHandlers (line 196) | public DownstreamRouteBuilder WithDelegatingHandlers(List<string> dele...
    method WithAddHeadersToDownstream (line 202) | public DownstreamRouteBuilder WithAddHeadersToDownstream(List<AddHeade...
    method WithAddHeadersToUpstream (line 208) | public DownstreamRouteBuilder WithAddHeadersToUpstream(List<AddHeader>...
    method WithDangerousAcceptAnyServerCertificateValidator (line 214) | public DownstreamRouteBuilder WithDangerousAcceptAnyServerCertificateV...
    method WithSecurityOptions (line 220) | public DownstreamRouteBuilder WithSecurityOptions(SecurityOptions secu...
    method WithDownstreamHttpVersion (line 226) | public DownstreamRouteBuilder WithDownstreamHttpVersion(Version downst...
    method WithUpstreamHeaders (line 232) | public DownstreamRouteBuilder WithUpstreamHeaders(Dictionary<string, U...
    method WithDownstreamHttpVersionPolicy (line 238) | public DownstreamRouteBuilder WithDownstreamHttpVersionPolicy(HttpVers...
    method WithMetadata (line 244) | public DownstreamRouteBuilder WithMetadata(MetadataOptions metadataOpt...
    method WithTimeout (line 250) | public DownstreamRouteBuilder WithTimeout(int? timeout)
    method Build (line 256) | public DownstreamRoute Build()

FILE: src/Ocelot/Configuration/Builder/MetadataOptionsBuilder.cs
  class MetadataOptionsBuilder (line 5) | public class MetadataOptionsBuilder
    method WithSeparators (line 14) | public MetadataOptionsBuilder WithSeparators(string[] separators)
    method WithTrimChars (line 20) | public MetadataOptionsBuilder WithTrimChars(char[] trimChars)
    method WithStringSplitOption (line 26) | public MetadataOptionsBuilder WithStringSplitOption(string stringSplit...
    method WithNumberStyle (line 32) | public MetadataOptionsBuilder WithNumberStyle(string numberStyle)
    method WithCurrentCulture (line 38) | public MetadataOptionsBuilder WithCurrentCulture(string currentCulture)
    method WithMetadata (line 44) | public MetadataOptionsBuilder WithMetadata(IDictionary<string, string>...
    method Build (line 50) | public MetadataOptions Build()

FILE: src/Ocelot/Configuration/Builder/ServiceProviderConfigurationBuilder.cs
  class ServiceProviderConfigurationBuilder (line 3) | public class ServiceProviderConfigurationBuilder
    method WithScheme (line 14) | public ServiceProviderConfigurationBuilder WithScheme(string serviceDi...
    method WithHost (line 20) | public ServiceProviderConfigurationBuilder WithHost(string serviceDisc...
    method WithPort (line 26) | public ServiceProviderConfigurationBuilder WithPort(int serviceDiscove...
    method WithType (line 32) | public ServiceProviderConfigurationBuilder WithType(string type)
    method WithToken (line 38) | public ServiceProviderConfigurationBuilder WithToken(string token)
    method WithConfigurationKey (line 44) | public ServiceProviderConfigurationBuilder WithConfigurationKey(string...
    method WithPollingInterval (line 50) | public ServiceProviderConfigurationBuilder WithPollingInterval(int pol...
    method WithNamespace (line 56) | public ServiceProviderConfigurationBuilder WithNamespace(string @names...
    method Build (line 62) | public ServiceProviderConfiguration Build() => new()

FILE: src/Ocelot/Configuration/Builder/UpstreamPathTemplateBuilder.cs
  class UpstreamPathTemplateBuilder (line 5) | public class UpstreamPathTemplateBuilder
    method WithTemplate (line 12) | public UpstreamPathTemplateBuilder WithTemplate(string template)
    method WithPriority (line 18) | public UpstreamPathTemplateBuilder WithPriority(int priority)
    method WithContainsQueryString (line 24) | public UpstreamPathTemplateBuilder WithContainsQueryString(bool contai...
    method WithOriginalValue (line 30) | public UpstreamPathTemplateBuilder WithOriginalValue(string originalVa...
    method Build (line 36) | public UpstreamPathTemplate Build()

FILE: src/Ocelot/Configuration/CacheOptions.cs
  class CacheOptions (line 7) | public class CacheOptions
    method CacheOptions (line 16) | internal CacheOptions() { }
    method CacheOptions (line 17) | public CacheOptions(FileCacheOptions from, string defaultRegion)
    method CacheOptions (line 35) | public CacheOptions(int? ttlSeconds, string region, string header, boo...

FILE: src/Ocelot/Configuration/ChangeTracking/IOcelotConfigurationChangeTokenSource.cs
  type IOcelotConfigurationChangeTokenSource (line 8) | public interface IOcelotConfigurationChangeTokenSource
    method Activate (line 12) | void Activate();

FILE: src/Ocelot/Configuration/ChangeTracking/OcelotConfigurationChangeToken.cs
  class OcelotConfigurationChangeToken (line 5) | public class OcelotConfigurationChangeToken : IChangeToken
    method RegisterChangeCallback (line 13) | public IDisposable RegisterChangeCallback(Action<object> callback, obj...
    method Activate (line 23) | public void Activate()
    class CallbackWrapper (line 41) | private class CallbackWrapper : IDisposable
      method CallbackWrapper (line 46) | public CallbackWrapper(Action<object> callback, object state, IColle...
      method Invoke (line 54) | public void Invoke()
      method Dispose (line 59) | public void Dispose()

FILE: src/Ocelot/Configuration/ChangeTracking/OcelotConfigurationChangeTokenSource.cs
  class OcelotConfigurationChangeTokenSource (line 5) | public class OcelotConfigurationChangeTokenSource : IOcelotConfiguration...
    method Activate (line 11) | public void Activate()

FILE: src/Ocelot/Configuration/ChangeTracking/OcelotConfigurationMonitor.cs
  class OcelotConfigurationMonitor (line 6) | public class OcelotConfigurationMonitor : IOptionsMonitor<IInternalConfi...
    method OcelotConfigurationMonitor (line 11) | public OcelotConfigurationMonitor(IInternalConfigurationRepository rep...
    method Get (line 19) | public IInternalConfiguration Get(string name)
    method OnChange (line 24) | public IDisposable OnChange(Action<IInternalConfiguration, string> lis...

FILE: src/Ocelot/Configuration/ClaimToThing.cs
  class ClaimToThing (line 3) | public class ClaimToThing
    method ClaimToThing (line 5) | public ClaimToThing(string existingKey, string newKey, string delimite...

FILE: src/Ocelot/Configuration/Creator/AddHeader.cs
  class AddHeader (line 3) | public class AddHeader
    method AddHeader (line 5) | public AddHeader(string key, string value)

FILE: src/Ocelot/Configuration/Creator/AggregatesCreator.cs
  class AggregatesCreator (line 6) | public class AggregatesCreator : IAggregatesCreator
    method AggregatesCreator (line 11) | public AggregatesCreator(IUpstreamTemplatePatternCreator creator, IUps...
    method Create (line 17) | public List<Route> Create(FileConfiguration fileConfiguration, IReadOn...
    method SetUpAggregateRoute (line 25) | private Route SetUpAggregateRoute(IEnumerable<Route> routes, FileAggre...

FILE: src/Ocelot/Configuration/Creator/AuthenticationOptionsCreator.cs
  class AuthenticationOptionsCreator (line 6) | public class AuthenticationOptionsCreator : IAuthenticationOptionsCreator
    method Create (line 8) | public AuthenticationOptions Create(FileAuthenticationOptions options)
    method Create (line 11) | public AuthenticationOptions Create(FileRoute route, FileGlobalConfigu...
    method Create (line 18) | public AuthenticationOptions Create(FileDynamicRoute route, FileGlobal...
    method Create (line 25) | protected virtual AuthenticationOptions Create(IRouteGrouping grouping...
    method Merge (line 51) | protected virtual AuthenticationOptions Merge(FileAuthenticationOption...

FILE: src/Ocelot/Configuration/Creator/CacheOptionsCreator.cs
  class CacheOptionsCreator (line 6) | public class CacheOptionsCreator : ICacheOptionsCreator
    method Create (line 8) | public CacheOptions Create(FileCacheOptions options)
    method Create (line 11) | public CacheOptions Create(FileRoute route, FileGlobalConfiguration gl...
    method Create (line 18) | public CacheOptions Create(FileDynamicRoute route, FileGlobalConfigura...
    method Create (line 25) | protected virtual CacheOptions Create(IRouteGrouping grouping, FileCac...
    method Merge (line 55) | protected virtual CacheOptions Merge(FileCacheOptions options, FileCac...

FILE: src/Ocelot/Configuration/Creator/ClaimsToThingCreator.cs
  class ClaimsToThingCreator (line 6) | public class ClaimsToThingCreator : IClaimsToThingCreator
    method ClaimsToThingCreator (line 11) | public ClaimsToThingCreator(IClaimToThingConfigurationParser claimToTh...
    method Create (line 18) | public List<ClaimToThing> Create(Dictionary<string, string> inputToBeP...

FILE: src/Ocelot/Configuration/Creator/ConfigurationCreator.cs
  class ConfigurationCreator (line 7) | public class ConfigurationCreator : IConfigurationCreator
    method ConfigurationCreator (line 21) | public ConfigurationCreator(
    method Create (line 47) | public InternalConfiguration Create(FileConfiguration configuration, R...

FILE: src/Ocelot/Configuration/Creator/DefaultMetadataCreator.cs
  class DefaultMetadataCreator (line 9) | public class DefaultMetadataCreator : IMetadataCreator
    method Create (line 11) | public MetadataOptions Create(IDictionary<string, string> metadata, Fi...

FILE: src/Ocelot/Configuration/Creator/DownstreamAddressesCreator.cs
  class DownstreamAddressesCreator (line 5) | public class DownstreamAddressesCreator : IDownstreamAddressesCreator
    method Create (line 7) | public List<DownstreamHostAndPort> Create(FileRoute route)

FILE: src/Ocelot/Configuration/Creator/DynamicRoutesCreator.cs
  class DynamicRoutesCreator (line 7) | public class DynamicRoutesCreator : IDynamicsCreator
    method DynamicRoutesCreator (line 20) | public DynamicRoutesCreator(
    method Create (line 44) | public IReadOnlyList<Route> Create(FileConfiguration fileConfiguration)
    method CreateTimeout (line 53) | public virtual int CreateTimeout(FileDynamicRoute route, FileGlobalCon...
    method SetUpDynamicRoute (line 59) | private Route SetUpDynamicRoute(FileDynamicRoute dynamicRoute, FileGlo...

FILE: src/Ocelot/Configuration/Creator/FileInternalConfigurationCreator.cs
  class FileInternalConfigurationCreator (line 7) | public class FileInternalConfigurationCreator : IInternalConfigurationCr...
    method FileInternalConfigurationCreator (line 15) | public FileInternalConfigurationCreator(
    method Create (line 30) | public async Task<Response<IInternalConfiguration>> Create(FileConfigu...

FILE: src/Ocelot/Configuration/Creator/HeaderFindAndReplaceCreator.cs
  class HeaderFindAndReplaceCreator (line 10) | public class HeaderFindAndReplaceCreator : IHeaderFindAndReplaceCreator
    method HeaderFindAndReplaceCreator (line 16) | public HeaderFindAndReplaceCreator(IPlaceholders placeholders, IOcelot...
    method Create (line 23) | public HeaderTransformations Create(FileRoute route)
    method Create (line 26) | public HeaderTransformations Create(FileRoute route, FileGlobalConfigu...
    method Merge (line 42) | public static IEnumerable<Header> Merge(IDictionary<string, string> lo...
    method ProcessHeaders (line 50) | private (List<HeaderFindAndReplace> StreamHeaders, List<AddHeader> Add...
    method Map (line 79) | private HeaderFindAndReplace Map(Header input)

FILE: src/Ocelot/Configuration/Creator/HeaderTransformations.cs
  class HeaderTransformations (line 3) | public class HeaderTransformations
    method HeaderTransformations (line 5) | public HeaderTransformations(

FILE: src/Ocelot/Configuration/Creator/HttpHandlerOptionsCreator.cs
  class HttpHandlerOptionsCreator (line 7) | public class HttpHandlerOptionsCreator : IHttpHandlerOptionsCreator
    method HttpHandlerOptionsCreator (line 10) | public HttpHandlerOptionsCreator(IServiceProvider services)
    method Create (line 13) | public HttpHandlerOptions Create(FileHttpHandlerOptions options)
    method Create (line 20) | public HttpHandlerOptions Create(FileRoute route, FileGlobalConfigurat...
    method Create (line 27) | public HttpHandlerOptions Create(FileDynamicRoute route, FileGlobalCon...
    method Create (line 34) | protected virtual HttpHandlerOptions Create(IRouteGrouping grouping, F...
    method Merge (line 64) | protected virtual HttpHandlerOptions Merge(FileHttpHandlerOptions opti...

FILE: src/Ocelot/Configuration/Creator/HttpVersionCreator.cs
  class HttpVersionCreator (line 3) | public class HttpVersionCreator : IVersionCreator
    method Create (line 5) | public Version Create(string downstreamHttpVersion)

FILE: src/Ocelot/Configuration/Creator/HttpVersionPolicyCreator.cs
  class HttpVersionPolicyCreator (line 6) | public class HttpVersionPolicyCreator : IVersionPolicyCreator
    method Create (line 13) | public HttpVersionPolicy Create(string downstreamHttpVersionPolicy) =>...

FILE: src/Ocelot/Configuration/Creator/IAggregatesCreator.cs
  type IAggregatesCreator (line 5) | public interface IAggregatesCreator
    method Create (line 7) | List<Route> Create(FileConfiguration fileConfiguration, IReadOnlyList<...

FILE: src/Ocelot/Configuration/Creator/IAuthenticationOptionsCreator.cs
  type IAuthenticationOptionsCreator (line 5) | public interface IAuthenticationOptionsCreator
    method Create (line 7) | AuthenticationOptions Create(FileAuthenticationOptions options);
    method Create (line 8) | AuthenticationOptions Create(FileRoute route, FileGlobalConfiguration ...
    method Create (line 9) | AuthenticationOptions Create(FileDynamicRoute route, FileGlobalConfigu...

FILE: src/Ocelot/Configuration/Creator/ICacheOptionsCreator.cs
  type ICacheOptionsCreator (line 8) | public interface ICacheOptionsCreator
    method Create (line 10) | CacheOptions Create(FileCacheOptions options);
    method Create (line 11) | CacheOptions Create(FileRoute route, FileGlobalConfiguration globalCon...
    method Create (line 12) | CacheOptions Create(FileDynamicRoute route, FileGlobalConfiguration gl...

FILE: src/Ocelot/Configuration/Creator/IClaimsToThingCreator.cs
  type IClaimsToThingCreator (line 3) | public interface IClaimsToThingCreator
    method Create (line 5) | List<ClaimToThing> Create(Dictionary<string, string> thingsBeingAdded);

FILE: src/Ocelot/Configuration/Creator/IConfigurationCreator.cs
  type IConfigurationCreator (line 5) | public interface IConfigurationCreator
    method Create (line 7) | InternalConfiguration Create(FileConfiguration configuration, Route[] ...

FILE: src/Ocelot/Configuration/Creator/IDownstreamAddressesCreator.cs
  type IDownstreamAddressesCreator (line 5) | public interface IDownstreamAddressesCreator
    method Create (line 7) | List<DownstreamHostAndPort> Create(FileRoute route);

FILE: src/Ocelot/Configuration/Creator/IDynamicsCreator.cs
  type IDynamicsCreator (line 5) | public interface IDynamicsCreator
    method Create (line 7) | IReadOnlyList<Route> Create(FileConfiguration fileConfiguration);
    method CreateTimeout (line 15) | int CreateTimeout(FileDynamicRoute route, FileGlobalConfiguration glob...

FILE: src/Ocelot/Configuration/Creator/IHeaderFindAndReplaceCreator.cs
  type IHeaderFindAndReplaceCreator (line 5) | public interface IHeaderFindAndReplaceCreator
    method Create (line 7) | HeaderTransformations Create(FileRoute fileRoute);
    method Create (line 8) | HeaderTransformations Create(FileRoute route, FileGlobalConfiguration ...

FILE: src/Ocelot/Configuration/Creator/IHttpHandlerOptionsCreator.cs
  type IHttpHandlerOptionsCreator (line 5) | public interface IHttpHandlerOptionsCreator
    method Create (line 7) | HttpHandlerOptions Create(FileHttpHandlerOptions options);
    method Create (line 8) | HttpHandlerOptions Create(FileRoute route, FileGlobalConfiguration glo...
    method Create (line 9) | HttpHandlerOptions Create(FileDynamicRoute route, FileGlobalConfigurat...

FILE: src/Ocelot/Configuration/Creator/IInternalConfigurationCreator.cs
  type IInternalConfigurationCreator (line 6) | public interface IInternalConfigurationCreator
    method Create (line 8) | Task<Response<IInternalConfiguration>> Create(FileConfiguration fileCo...

FILE: src/Ocelot/Configuration/Creator/ILoadBalancerOptionsCreator.cs
  type ILoadBalancerOptionsCreator (line 5) | public interface ILoadBalancerOptionsCreator
    method Create (line 7) | LoadBalancerOptions Create(FileLoadBalancerOptions options);
    method Create (line 8) | LoadBalancerOptions Create(FileRoute route, FileGlobalConfiguration gl...
    method Create (line 9) | LoadBalancerOptions Create(FileDynamicRoute route, FileGlobalConfigura...

FILE: src/Ocelot/Configuration/Creator/IMetadataCreator.cs
  type IMetadataCreator (line 8) | public interface IMetadataCreator
    method Create (line 10) | MetadataOptions Create(IDictionary<string, string> metadata, FileGloba...

FILE: src/Ocelot/Configuration/Creator/IQoSOptionsCreator.cs
  type IQoSOptionsCreator (line 5) | public interface IQoSOptionsCreator
    method Create (line 7) | QoSOptions Create(FileQoSOptions options);
    method Create (line 8) | QoSOptions Create(FileRoute route, FileGlobalConfiguration globalConfi...
    method Create (line 9) | QoSOptions Create(FileDynamicRoute route, FileGlobalConfiguration glob...

FILE: src/Ocelot/Configuration/Creator/IRateLimitOptionsCreator.cs
  type IRateLimitOptionsCreator (line 5) | public interface IRateLimitOptionsCreator
    method Create (line 7) | RateLimitOptions Create(FileGlobalConfiguration globalConfiguration);
    method Create (line 8) | RateLimitOptions Create(IRouteRateLimiting route, FileGlobalConfigurat...

FILE: src/Ocelot/Configuration/Creator/IRequestIdKeyCreator.cs
  type IRequestIdKeyCreator (line 5) | public interface IRequestIdKeyCreator
    method Create (line 7) | string Create(FileRoute fileRoute, FileGlobalConfiguration globalConfi...

FILE: src/Ocelot/Configuration/Creator/IRouteKeyCreator.cs
  type IRouteKeyCreator (line 5) | public interface IRouteKeyCreator
    method Create (line 7) | string Create(FileRoute route, LoadBalancerOptions loadBalancing);
    method Create (line 8) | string Create(FileDynamicRoute route, LoadBalancerOptions loadBalancing);
    method Create (line 9) | string Create(string serviceNamespace, string serviceName, LoadBalance...

FILE: src/Ocelot/Configuration/Creator/IRoutesCreator.cs
  type IRoutesCreator (line 5) | public interface IRoutesCreator
    method Create (line 7) | IReadOnlyList<Route> Create(FileConfiguration fileConfiguration);
    method CreateTimeout (line 15) | int CreateTimeout(FileRoute route, FileGlobalConfiguration global);

FILE: src/Ocelot/Configuration/Creator/ISecurityOptionsCreator.cs
  type ISecurityOptionsCreator (line 5) | public interface ISecurityOptionsCreator
    method Create (line 7) | SecurityOptions Create(FileSecurityOptions securityOptions, FileGlobal...

FILE: src/Ocelot/Configuration/Creator/IServiceProviderConfigurationCreator.cs
  type IServiceProviderConfigurationCreator (line 5) | public interface IServiceProviderConfigurationCreator
    method Create (line 7) | ServiceProviderConfiguration Create(FileGlobalConfiguration globalConf...

FILE: src/Ocelot/Configuration/Creator/IUpstreamHeaderTemplatePatternCreator.cs
  type IUpstreamHeaderTemplatePatternCreator (line 10) | public interface IUpstreamHeaderTemplatePatternCreator
    method Create (line 17) | IDictionary<string, UpstreamHeaderTemplate> Create(IRouteUpstream route);
    method Create (line 19) | IDictionary<string, UpstreamHeaderTemplate> Create(IHeaderDictionary u...

FILE: src/Ocelot/Configuration/Creator/IUpstreamTemplatePatternCreator.cs
  type IUpstreamTemplatePatternCreator (line 6) | public interface IUpstreamTemplatePatternCreator
    method Create (line 8) | UpstreamPathTemplate Create(IRouteUpstream route);

FILE: src/Ocelot/Configuration/Creator/IVersionCreator.cs
  type IVersionCreator (line 3) | public interface IVersionCreator
    method Create (line 5) | Version Create(string downstreamHttpVersion);

FILE: src/Ocelot/Configuration/Creator/IVersionPolicyCreator.cs
  type IVersionPolicyCreator (line 6) | public interface IVersionPolicyCreator
    method Create (line 13) | HttpVersionPolicy Create(string downstreamHttpVersionPolicy);

FILE: src/Ocelot/Configuration/Creator/LoadBalancerOptionsCreator.cs
  class LoadBalancerOptionsCreator (line 6) | public class LoadBalancerOptionsCreator : ILoadBalancerOptionsCreator
    method Create (line 8) | public LoadBalancerOptions Create(FileLoadBalancerOptions options)
    method Create (line 11) | public LoadBalancerOptions Create(FileRoute route, FileGlobalConfigura...
    method Create (line 18) | public LoadBalancerOptions Create(FileDynamicRoute route, FileGlobalCo...
    method Create (line 25) | protected virtual LoadBalancerOptions Create(IRouteGrouping grouping, ...
    method Merge (line 55) | protected virtual LoadBalancerOptions Merge(FileLoadBalancerOptions op...

FILE: src/Ocelot/Configuration/Creator/QoSOptionsCreator.cs
  class QoSOptionsCreator (line 5) | public class QoSOptionsCreator : IQoSOptionsCreator
    method Create (line 7) | public QoSOptions Create(FileQoSOptions options)
    method Create (line 10) | public QoSOptions Create(FileRoute route, FileGlobalConfiguration glob...
    method Create (line 17) | public QoSOptions Create(FileDynamicRoute route, FileGlobalConfigurati...
    method Create (line 24) | protected virtual QoSOptions Create(IRouteGrouping grouping, FileQoSOp...
    method Merge (line 50) | protected virtual QoSOptions Merge(FileQoSOptions options, FileQoSOpti...

FILE: src/Ocelot/Configuration/Creator/RateLimitOptionsCreator.cs
  class RateLimitOptionsCreator (line 6) | public class RateLimitOptionsCreator : IRateLimitOptionsCreator
    method RateLimitOptionsCreator (line 8) | public RateLimitOptionsCreator() { }
    method Create (line 10) | public RateLimitOptions Create(FileGlobalConfiguration globalConfigura...
    method Create (line 15) | public RateLimitOptions Create(IRouteRateLimiting route, FileGlobalCon...
    method MergeHeaderRules (line 51) | protected virtual RateLimitOptions MergeHeaderRules(FileRateLimitByHea...

FILE: src/Ocelot/Configuration/Creator/RequestIdKeyCreator.cs
  class RequestIdKeyCreator (line 5) | public class RequestIdKeyCreator : IRequestIdKeyCreator
    method Create (line 7) | public string Create(FileRoute fileRoute, FileGlobalConfiguration glob...

FILE: src/Ocelot/Configuration/Creator/RouteKeyCreator.cs
  class RouteKeyCreator (line 8) | public class RouteKeyCreator : IRouteKeyCreator
    method Create (line 22) | public string Create(FileRoute route, LoadBalancerOptions loadBalancing)
    method Create (line 41) | public string Create(FileDynamicRoute route, LoadBalancerOptions loadB...
    method Create (line 53) | public string Create(string serviceNamespace, string serviceName, Load...
    method TryStickySession (line 64) | protected virtual bool TryStickySession(LoadBalancerOptions loadBalanc...
    method AsString (line 74) | public static string AsString(FileHostAndPort host) => host?.ToString();
  class RouteKeyCreatorHelpers (line 77) | internal static class RouteKeyCreatorHelpers
    method AppendNext (line 84) | public static StringBuilder AppendNext(this StringBuilder builder, str...

FILE: src/Ocelot/Configuration/Creator/SecurityOptionsCreator.cs
  class SecurityOptionsCreator (line 6) | public class SecurityOptionsCreator : ISecurityOptionsCreator
    method Create (line 8) | public SecurityOptions Create(FileSecurityOptions securityOptions, Fil...
    method Parse (line 19) | private static string[] Parse(string ipValue)

FILE: src/Ocelot/Configuration/Creator/ServiceProviderConfigurationCreator.cs
  class ServiceProviderConfigurationCreator (line 6) | public class ServiceProviderConfigurationCreator : IServiceProviderConfi...
    method Create (line 8) | public ServiceProviderConfiguration Create(FileGlobalConfiguration glo...

FILE: src/Ocelot/Configuration/Creator/StaticRoutesCreator.cs
  class StaticRoutesCreator (line 7) | public class StaticRoutesCreator : IRoutesCreator
    method StaticRoutesCreator (line 27) | public StaticRoutesCreator(
    method Create (line 66) | public IReadOnlyList<Route> Create(FileConfiguration fileConfiguration)
    method CreateTimeout (line 75) | public virtual int CreateTimeout(FileRoute route, FileGlobalConfigurat...
    method SetUpDownstreamRoute (line 81) | private DownstreamRoute SetUpDownstreamRoute(FileRoute fileRoute, File...
    method SetUpRoute (line 158) | private Route SetUpRoute(FileRoute fileRoute, DownstreamRoute downstre...

FILE: src/Ocelot/Configuration/Creator/UpstreamHeaderTemplatePatternCreator.cs
  class UpstreamHeaderTemplatePatternCreator (line 12) | public partial class UpstreamHeaderTemplatePatternCreator : IUpstreamHea...
    method RegexPlaceholders (line 14) | [GeneratedRegex(@"(\{header:.*?\})", RegexOptions.IgnoreCase | RegexOp...
    method Create (line 17) | public IDictionary<string, UpstreamHeaderTemplate> Create(IRouteUpstre...
    method Create (line 22) | public IDictionary<string, UpstreamHeaderTemplate> Create(IHeaderDicti...
    method Create (line 28) | protected virtual IDictionary<string, UpstreamHeaderTemplate> Create(I...

FILE: src/Ocelot/Configuration/Creator/UpstreamTemplatePatternCreator.cs
  class UpstreamTemplatePatternCreator (line 8) | public class UpstreamTemplatePatternCreator : IUpstreamTemplatePatternCr...
    method UpstreamTemplatePatternCreator (line 18) | public UpstreamTemplatePatternCreator(IOcelotCache<Regex> cache)
    method Create (line 23) | public UpstreamPathTemplate Create(IRouteUpstream route)
    method GetRegex (line 96) | protected Regex GetRegex(string key)
    method CreateTemplate (line 112) | protected UpstreamPathTemplate CreateTemplate(string template, int pri...
    method ForwardSlashAndOnePlaceHolder (line 118) | private static bool ForwardSlashAndOnePlaceHolder(string upstreamTempl...
    method IsPlaceHolder (line 123) | private static bool IsPlaceHolder(string upstreamTemplate, int i)

FILE: src/Ocelot/Configuration/Creator/VersionPolicies.cs
  class VersionPolicies (line 6) | public class VersionPolicies

FILE: src/Ocelot/Configuration/DownstreamHostAndPort.cs
  class DownstreamHostAndPort (line 3) | public class DownstreamHostAndPort
    method DownstreamHostAndPort (line 5) | public DownstreamHostAndPort(string host, int port)

FILE: src/Ocelot/Configuration/DownstreamRoute.cs
  class DownstreamRoute (line 7) | public class DownstreamRoute
    method DownstreamRoute (line 9) | public DownstreamRoute(
    method Name (line 139) | public string Name() => Name(false);
    method Name (line 143) | public string Name(bool escapePath)
    method ToString (line 160) | public override string ToString() => LoadBalancerKey;

FILE: src/Ocelot/Configuration/File/AggregateRouteConfig.cs
  class AggregateRouteConfig (line 3) | public class AggregateRouteConfig

FILE: src/Ocelot/Configuration/File/FileAggregateRoute.cs
  class FileAggregateRoute (line 5) | public class FileAggregateRoute : IRouteUpstream, IRouteGroup
    method FileAggregateRoute (line 17) | public FileAggregateRoute()

FILE: src/Ocelot/Configuration/File/FileAuthenticationOptions.cs
  class FileAuthenticationOptions (line 5) | public class FileAuthenticationOptions
    method FileAuthenticationOptions (line 7) | public FileAuthenticationOptions()
    method FileAuthenticationOptions (line 10) | public FileAuthenticationOptions(string authScheme) : this()
    method FileAuthenticationOptions (line 13) | public FileAuthenticationOptions(FileAuthenticationOptions options)
    method ToString (line 40) | public override string ToString() => new StringBuilder()

FILE: src/Ocelot/Configuration/File/FileCacheOptions.cs
  class FileCacheOptions (line 3) | public class FileCacheOptions
    method FileCacheOptions (line 5) | public FileCacheOptions() { }
    method FileCacheOptions (line 6) | public FileCacheOptions(int ttl) => TtlSeconds = ttl;
    method FileCacheOptions (line 7) | public FileCacheOptions(FileCacheOptions from)

FILE: src/Ocelot/Configuration/File/FileConfiguration.cs
  class FileConfiguration (line 3) | public class FileConfiguration
    method FileConfiguration (line 5) | public FileConfiguration()

FILE: src/Ocelot/Configuration/File/FileDynamicRoute.cs
  class FileDynamicRoute (line 6) | public class FileDynamicRoute : FileRouteBase, IRouteGrouping, IRouteRat...

FILE: src/Ocelot/Configuration/File/FileGlobalAuthenticationOptions.cs
  class FileGlobalAuthenticationOptions (line 3) | public class FileGlobalAuthenticationOptions : FileAuthenticationOptions...
    method FileGlobalAuthenticationOptions (line 5) | public FileGlobalAuthenticationOptions() : base() { }
    method FileGlobalAuthenticationOptions (line 6) | public FileGlobalAuthenticationOptions(string authScheme) : base(authS...
    method FileGlobalAuthenticationOptions (line 7) | public FileGlobalAuthenticationOptions(FileAuthenticationOptions from)...

FILE: src/Ocelot/Configuration/File/FileGlobalCacheOptions.cs
  class FileGlobalCacheOptions (line 3) | public class FileGlobalCacheOptions : FileCacheOptions, IRouteGroup
    method FileGlobalCacheOptions (line 5) | public FileGlobalCacheOptions() : base() { }
    method FileGlobalCacheOptions (line 6) | public FileGlobalCacheOptions(FileCacheOptions from) : base(from) { }
    method FileGlobalCacheOptions (line 7) | public FileGlobalCacheOptions(int ttl) : base(ttl) { }

FILE: src/Ocelot/Configuration/File/FileGlobalConfiguration.cs
  class FileGlobalConfiguration (line 3) | public class FileGlobalConfiguration
    method FileGlobalConfiguration (line 5) | public FileGlobalConfiguration()

FILE: src/Ocelot/Configuration/File/FileGlobalHttpHandlerOptions.cs
  class FileGlobalHttpHandlerOptions (line 3) | public class FileGlobalHttpHandlerOptions : FileHttpHandlerOptions, IRou...
    method FileGlobalHttpHandlerOptions (line 5) | public FileGlobalHttpHandlerOptions() : base() { }
    method FileGlobalHttpHandlerOptions (line 6) | public FileGlobalHttpHandlerOptions(FileHttpHandlerOptions from) : bas...

FILE: src/Ocelot/Configuration/File/FileGlobalLoadBalancerOptions.cs
  class FileGlobalLoadBalancerOptions (line 3) | public class FileGlobalLoadBalancerOptions : FileLoadBalancerOptions, IR...
    method FileGlobalLoadBalancerOptions (line 5) | public FileGlobalLoadBalancerOptions() : base() { }
    method FileGlobalLoadBalancerOptions (line 6) | public FileGlobalLoadBalancerOptions(string type) : base(type) { }

FILE: src/Ocelot/Configuration/File/FileGlobalQoSOptions.cs
  class FileGlobalQoSOptions (line 3) | public class FileGlobalQoSOptions : FileQoSOptions, IRouteGroup
    method FileGlobalQoSOptions (line 5) | public FileGlobalQoSOptions() : base() { }
    method FileGlobalQoSOptions (line 6) | public FileGlobalQoSOptions(FileQoSOptions from) : base(from) { }
    method FileGlobalQoSOptions (line 7) | public FileGlobalQoSOptions(QoSOptions from) : base(from) { }

FILE: src/Ocelot/Configuration/File/FileGlobalRateLimit.cs
  class FileGlobalRateLimit (line 3) | public sealed class FileGlobalRateLimit :

FILE: src/Ocelot/Configuration/File/FileGlobalRateLimitByAspNetRule.cs
  class FileGlobalRateLimitByAspNetRule (line 3) | public class FileGlobalRateLimitByAspNetRule : FileRateLimitByAspNetRule...

FILE: src/Ocelot/Configuration/File/FileGlobalRateLimitByHeaderRule.cs
  class FileGlobalRateLimitByHeaderRule (line 3) | public class FileGlobalRateLimitByHeaderRule : FileRateLimitByHeaderRule...
    method FileGlobalRateLimitByHeaderRule (line 5) | public FileGlobalRateLimitByHeaderRule()
    method FileGlobalRateLimitByHeaderRule (line 7) | public FileGlobalRateLimitByHeaderRule(FileRateLimitByHeaderRule from)

FILE: src/Ocelot/Configuration/File/FileGlobalRateLimitByIpRule.cs
  class FileGlobalRateLimitByIpRule (line 3) | public class FileGlobalRateLimitByIpRule : FileRateLimitByIpRule, IRoute...

FILE: src/Ocelot/Configuration/File/FileGlobalRateLimitByMethodRule.cs
  class FileGlobalRateLimitByMethodRule (line 3) | public class FileGlobalRateLimitByMethodRule : FileRateLimitByMethodRule...

FILE: src/Ocelot/Configuration/File/FileGlobalRateLimiting.cs
  class FileGlobalRateLimiting (line 3) | public class FileGlobalRateLimiting : FileRateLimitRule

FILE: src/Ocelot/Configuration/File/FileHostAndPort.cs
  class FileHostAndPort (line 3) | public class FileHostAndPort
    method FileHostAndPort (line 5) | public FileHostAndPort() { }
    method FileHostAndPort (line 7) | public FileHostAndPort(FileHostAndPort from)
    method FileHostAndPort (line 13) | public FileHostAndPort(string host, int port)
    method ToString (line 22) | public override string ToString() => $"{Host}:{Port}";

FILE: src/Ocelot/Configuration/File/FileHttpHandlerOptions.cs
  class FileHttpHandlerOptions (line 3) | public class FileHttpHandlerOptions
    method FileHttpHandlerOptions (line 5) | public FileHttpHandlerOptions()
    method FileHttpHandlerOptions (line 8) | public FileHttpHandlerOptions(FileHttpHandlerOptions from)

FILE: src/Ocelot/Configuration/File/FileLoadBalancerOptions.cs
  class FileLoadBalancerOptions (line 3) | public class FileLoadBalancerOptions
    method FileLoadBalancerOptions (line 5) | public FileLoadBalancerOptions()
    method FileLoadBalancerOptions (line 8) | public FileLoadBalancerOptions(string type)
    method FileLoadBalancerOptions (line 14) | public FileLoadBalancerOptions(FileLoadBalancerOptions from)

FILE: src/Ocelot/Configuration/File/FileMetadataOptions.cs
  class FileMetadataOptions (line 5) | public class FileMetadataOptions
    method FileMetadataOptions (line 7) | public FileMetadataOptions()
    method FileMetadataOptions (line 16) | public FileMetadataOptions(FileMetadataOptions from)

FILE: src/Ocelot/Configuration/File/FileQoSOptions.cs
  class FileQoSOptions (line 6) | public class FileQoSOptions
    method FileQoSOptions (line 9) | public FileQoSOptions()
    method FileQoSOptions (line 12) | public FileQoSOptions(FileQoSOptions from)
    method FileQoSOptions (line 24) | public FileQoSOptions(QoSOptions from)

FILE: src/Ocelot/Configuration/File/FileRateLimitByAspNetRule.cs
  class FileRateLimitByAspNetRule (line 3) | public class FileRateLimitByAspNetRule

FILE: src/Ocelot/Configuration/File/FileRateLimitByHeaderRule.cs
  class FileRateLimitByHeaderRule (line 8) | public class FileRateLimitByHeaderRule : FileRateLimitRule
    method FileRateLimitByHeaderRule (line 10) | public FileRateLimitByHeaderRule() : base()
    method FileRateLimitByHeaderRule (line 13) | public FileRateLimitByHeaderRule(FileRateLimitRule from)
    method FileRateLimitByHeaderRule (line 17) | public FileRateLimitByHeaderRule(FileRateLimitByHeaderRule from)
    method ToString (line 41) | public override string ToString()

FILE: src/Ocelot/Configuration/File/FileRateLimitByIpRule.cs
  class FileRateLimitByIpRule (line 3) | public class FileRateLimitByIpRule : FileRateLimitRule

FILE: src/Ocelot/Configuration/File/FileRateLimitByMethodRule.cs
  class FileRateLimitByMethodRule (line 3) | public class FileRateLimitByMethodRule : FileRateLimitRule

FILE: src/Ocelot/Configuration/File/FileRateLimitRule.cs
  class FileRateLimitRule (line 8) | public class FileRateLimitRule
    method FileRateLimitRule (line 10) | public FileRateLimitRule() { }
    method FileRateLimitRule (line 12) | public FileRateLimitRule(FileRateLimitRule from)
    method ToString (line 82) | public override string ToString()

FILE: src/Ocelot/Configuration/File/FileRateLimiting.cs
  class FileRateLimiting (line 3) | public class FileRateLimiting : FileRateLimitRule

FILE: src/Ocelot/Configuration/File/FileRoute.cs
  class FileRoute (line 6) | public class FileRoute : FileRouteBase, IRouteUpstream, IRouteGrouping, ...
    method FileRoute (line 8) | public FileRoute()
    method FileRoute (line 25) | public FileRoute(FileRoute from)
    method Clone (line 57) | public object Clone()
    method DeepCopy (line 64) | public static void DeepCopy(FileRoute from, FileRoute to)
    method ToString (line 104) | public override string ToString()

FILE: src/Ocelot/Configuration/File/FileRouteBase.cs
  class FileRouteBase (line 10) | public abstract class FileRouteBase : IRouteGrouping

FILE: src/Ocelot/Configuration/File/FileSecurityOptions.cs
  class FileSecurityOptions (line 3) | public class FileSecurityOptions
    method FileSecurityOptions (line 5) | public FileSecurityOptions()
    method FileSecurityOptions (line 12) | public FileSecurityOptions(FileSecurityOptions from)
    method FileSecurityOptions (line 19) | public FileSecurityOptions(string allowedIPs = null, string blockedIPs...
    method FileSecurityOptions (line 35) | public FileSecurityOptions(IEnumerable<string> allowedIPs = null, IEnu...
    method IsEmpty (line 50) | public bool IsEmpty() => IPAllowedList.Count == 0 && IPBlockedList.Cou...

FILE: src/Ocelot/Configuration/File/FileServiceDiscoveryProvider.cs
  class FileServiceDiscoveryProvider (line 3) | public class FileServiceDiscoveryProvider

FILE: src/Ocelot/Configuration/File/IRouteGroup.cs
  type IRouteGroup (line 6) | public interface IRouteGroup

FILE: src/Ocelot/Configuration/File/IRouteGrouping.cs
  type IRouteGrouping (line 6) | public interface IRouteGrouping

FILE: src/Ocelot/Configuration/File/IRouteRateLimiting.cs
  type IRouteRateLimiting (line 3) | public interface IRouteRateLimiting : IRouteGrouping

FILE: src/Ocelot/Configuration/File/IRouteUpstream.cs
  type IRouteUpstream (line 3) | public interface IRouteUpstream

FILE: src/Ocelot/Configuration/HeaderFindAndReplace.cs
  class HeaderFindAndReplace (line 3) | public class HeaderFindAndReplace
    method HeaderFindAndReplace (line 7) | public HeaderFindAndReplace(HeaderFindAndReplace from)
    method HeaderFindAndReplace (line 16) | public HeaderFindAndReplace(KeyValuePair<string, string> from)
    method HeaderFindAndReplace (line 33) | public HeaderFindAndReplace(string key, string find, string replace, i...
    method ToString (line 48) | public override string ToString() => $"{nameof(HeaderFindAndReplace)}[...

FILE: src/Ocelot/Configuration/HttpHandlerOptions.cs
  class HttpHandlerOptions (line 8) | public class HttpHandlerOptions //: SocketsHttpHandler // TODO Think abo...
    method HttpHandlerOptions (line 12) | public HttpHandlerOptions()
    method HttpHandlerOptions (line 18) | public HttpHandlerOptions(FileHttpHandlerOptions from)
    method HttpHandlerOptions (line 29) | public HttpHandlerOptions(FileHttpHandlerOptions from, bool useTracing)

FILE: src/Ocelot/Configuration/IInternalConfiguration.cs
  type IInternalConfiguration (line 3) | public interface IInternalConfiguration

FILE: src/Ocelot/Configuration/InternalConfiguration.cs
  class InternalConfiguration (line 5) | public class InternalConfiguration : IInternalConfiguration
    method InternalConfiguration (line 7) | public InternalConfiguration() => Routes = [];
    method InternalConfiguration (line 8) | public InternalConfiguration(Route[] routes) => Routes = routes ?? [];

FILE: src/Ocelot/Configuration/LoadBalancerOptions.cs
  class LoadBalancerOptions (line 7) | public class LoadBalancerOptions
    method LoadBalancerOptions (line 9) | public LoadBalancerOptions()
    method LoadBalancerOptions (line 14) | public LoadBalancerOptions(FileLoadBalancerOptions options)
    method LoadBalancerOptions (line 18) | public LoadBalancerOptions(string type, string key, int? expiryInMs)

FILE: src/Ocelot/Configuration/MetadataOptions.cs
  class MetadataOptions (line 6) | public class MetadataOptions
    method MetadataOptions (line 8) | public MetadataOptions()
    method MetadataOptions (line 18) | public MetadataOptions(MetadataOptions from)
    method MetadataOptions (line 28) | public MetadataOptions(FileMetadataOptions from)
    method MetadataOptions (line 38) | public MetadataOptions(string[] separators, char[] trimChars, StringSp...

FILE: src/Ocelot/Configuration/Parser/ClaimToThingConfigurationParser.cs
  class ClaimToThingConfigurationParser (line 9) | public partial class ClaimToThingConfigurationParser : IClaimToThingConf...
    method ClaimRegex (line 13) | [GeneratedRegex("Claims\\[.*\\]", RegexOptions.None, RegexGlobal.Defau...
    method IndexRegex (line 16) | [GeneratedRegex("value\\[.*\\]", RegexOptions.None, RegexGlobal.Defaul...
    method Extract (line 19) | public Response<ClaimToThing> Extract(string existingKey, string value)
    method GetIndexValue (line 56) | private static string GetIndexValue(string instruction)

FILE: src/Ocelot/Configuration/Parser/IClaimToThingConfigurationParser.cs
  type IClaimToThingConfigurationParser (line 5) | public interface IClaimToThingConfigurationParser
    method Extract (line 7) | Response<ClaimToThing> Extract(string existingKey, string value);

FILE: src/Ocelot/Configuration/Parser/InstructionNotForClaimsError.cs
  class InstructionNotForClaimsError (line 5) | public class InstructionNotForClaimsError : Error
    method InstructionNotForClaimsError (line 7) | public InstructionNotForClaimsError()

FILE: src/Ocelot/Configuration/Parser/NoInstructionsError.cs
  class NoInstructionsError (line 5) | public class NoInstructionsError : Error
    method NoInstructionsError (line 7) | public NoInstructionsError(string splitToken)

FILE: src/Ocelot/Configuration/Parser/ParsingConfigurationHeaderError.cs
  class ParsingConfigurationHeaderError (line 6) | public class ParsingConfigurationHeaderError : Error
    method ParsingConfigurationHeaderError (line 8) | public ParsingConfigurationHeaderError(Exception exception)

FILE: src/Ocelot/Configuration/QoSOptions.cs
  class QoSOptions (line 5) | public class QoSOptions
    method QoSOptions (line 7) | public QoSOptions() { }
    method QoSOptions (line 8) | public QoSOptions(int? timeout) => Timeout = timeout;
    method QoSOptions (line 9) | public QoSOptions(int? exceptions, int? breakMs)
    method QoSOptions (line 18) | public QoSOptions(QoSOptions from)
    method QoSOptions (line 30) | public QoSOptions(FileQoSOptions from)

FILE: src/Ocelot/Configuration/RateLimitOptions.cs
  class RateLimitOptions (line 13) | public class RateLimitOptions
    method RateLimitOptions (line 20) | public RateLimitOptions()
    method RateLimitOptions (line 32) | public RateLimitOptions(bool enableRateLimiting) : this()
    method RateLimitOptions (line 37) | public RateLimitOptions(bool enableRateLimiting, string clientIdHeader...
    method RateLimitOptions (line 50) | public RateLimitOptions(FileRateLimitByHeaderRule fromRule)
    method RateLimitOptions (line 68) | public RateLimitOptions(RateLimitOptions fromOptions)

FILE: src/Ocelot/Configuration/RateLimitRule.cs
  class RateLimitRule (line 6) | public class RateLimitRule
    method RateLimitRule (line 13) | public RateLimitRule(string period, string wait, long limit)
    method ToString (line 20) | public override string ToString() => $"{Limit}/{Period}/w{Wait}";
    method ParseTimespan (line 57) | public static TimeSpan ParseTimespan(string timespan)

FILE: src/Ocelot/Configuration/Repository/ConsulFileConfigurationPollerOption.cs
  class ConsulFileConfigurationPollerOption (line 3) | public class ConsulFileConfigurationPollerOption : IFileConfigurationPol...
    method ConsulFileConfigurationPollerOption (line 8) | public ConsulFileConfigurationPollerOption(IInternalConfigurationRepos...
    method GetDelay (line 17) | private int GetDelay()

FILE: src/Ocelot/Configuration/Repository/DiskFileConfigurationRepository.cs
  class DiskFileConfigurationRepository (line 11) | public class DiskFileConfigurationRepository : IFileConfigurationRepository
    method DiskFileConfigurationRepository (line 19) | public DiskFileConfigurationRepository(IWebHostEnvironment hostingEnvi...
    method DiskFileConfigurationRepository (line 26) | public DiskFileConfigurationRepository(IWebHostEnvironment hostingEnvi...
    method Initialize (line 33) | private void Initialize(string folder)
    method Get (line 43) | public Task<Response<FileConfiguration>> Get()
    method Set (line 57) | public Task<Response> Set(FileConfiguration fileConfiguration)

FILE: src/Ocelot/Configuration/Repository/FileConfigurationPoller.cs
  class FileConfigurationPoller (line 9) | public class FileConfigurationPoller : IHostedService, IDisposable
    method FileConfigurationPoller (line 20) | public FileConfigurationPoller(
    method OnTimer (line 35) | private void OnTimer(object state)
    method StartAsync (line 45) | public Task StartAsync(CancellationToken cancellationToken)
    method StopAsync (line 55) | public Task StopAsync(CancellationToken cancellationToken)
    method PollAsync (line 65) | private async Task PollAsync()
    method ToJson (line 93) | private static string ToJson(FileConfiguration config)
    method Dispose (line 99) | public void Dispose()

FILE: src/Ocelot/Configuration/Repository/IFileConfigurationPollerOptions.cs
  type IFileConfigurationPollerOptions (line 3) | public interface IFileConfigurationPollerOptions

FILE: src/Ocelot/Configuration/Repository/IFileConfigurationRepository.cs
  type IFileConfigurationRepository (line 6) | public interface IFileConfigurationRepository
    method Get (line 8) | Task<Response<FileConfiguration>> Get();
    method Set (line 10) | Task<Response> Set(FileConfiguration fileConfiguration);

FILE: src/Ocelot/Configuration/Repository/IInternalConfigurationRepository.cs
  type IInternalConfigurationRepository (line 5) | public interface IInternalConfigurationRepository
    method Get (line 7) | Response<IInternalConfiguration> Get();
    method AddOrReplace (line 9) | Response AddOrReplace(IInternalConfiguration internalConfiguration);

FILE: src/Ocelot/Configuration/Repository/InMemoryFileConfigurationPollerOptions.cs
  class InMemoryFileConfigurationPollerOptions (line 3) | public class InMemoryFileConfigurationPollerOptions : IFileConfiguration...

FILE: src/Ocelot/Configuration/Repository/InMemoryInternalConfigurationRepository.cs
  class InMemoryInternalConfigurationRepository (line 9) | public class InMemoryInternalConfigurationRepository : IInternalConfigur...
    method InMemoryInternalConfigurationRepository (line 16) | public InMemoryInternalConfigurationRepository(IOcelotConfigurationCha...
    method Get (line 21) | public Response<IInternalConfiguration> Get()
    method AddOrReplace (line 26) | public Response AddOrReplace(IInternalConfiguration internalConfigurat...

FILE: src/Ocelot/Configuration/Route.cs
  class Route (line 6) | public class Route
    method Route (line 8) | public Route() => DownstreamRoute = new();
    method Route (line 9) | public Route(bool isDynamic) : this() => IsDynamic = isDynamic;
    method Route (line 10) | public Route(bool isDynamic, DownstreamRoute route) : this(route) => I...
    method Route (line 11) | public Route(DownstreamRoute route) => DownstreamRoute = [route];
    method Route (line 12) | public Route(DownstreamRoute route, HttpMethod method)

FILE: src/Ocelot/Configuration/SecurityOptions.cs
  class SecurityOptions (line 3) | public class SecurityOptions
    method SecurityOptions (line 5) | public SecurityOptions()
    method SecurityOptions (line 11) | public SecurityOptions(string allowed = null, string blocked = null)
    method SecurityOptions (line 25) | public SecurityOptions(IList<string> allowedList = null, IList<string>...

FILE: src/Ocelot/Configuration/ServiceProviderConfiguration.cs
  class ServiceProviderConfiguration (line 3) | public class ServiceProviderConfiguration

FILE: src/Ocelot/Configuration/Setter/FileAndInternalConfigurationSetter.cs
  class FileAndInternalConfigurationSetter (line 8) | public class FileAndInternalConfigurationSetter : IFileConfigurationSetter
    method FileAndInternalConfigurationSetter (line 14) | public FileAndInternalConfigurationSetter(
    method Set (line 24) | public async Task<Response> Set(FileConfiguration fileConfig)

FILE: src/Ocelot/Configuration/Setter/IFileConfigurationSetter.cs
  type IFileConfigurationSetter (line 6) | public interface IFileConfigurationSetter
    method Set (line 8) | Task<Response> Set(FileConfiguration config);

FILE: src/Ocelot/Configuration/Validator/ConfigurationValidationResult.cs
  class ConfigurationValidationResult (line 5) | public class ConfigurationValidationResult
    method ConfigurationValidationResult (line 7) | public ConfigurationValidationResult(bool isError)
    method ConfigurationValidationResult (line 13) | public ConfigurationValidationResult(bool isError, List<Error> errors)

FILE: src/Ocelot/Configuration/Validator/FileAuthenticationOptionsValidator.cs
  class FileAuthenticationOptionsValidator (line 8) | public class FileAuthenticationOptionsValidator : AbstractValidator<File...
    method FileAuthenticationOptionsValidator (line 12) | public FileAuthenticationOptionsValidator(IAuthenticationSchemeProvide...
    method IsSupportedAuthenticationProviders (line 21) | private async Task<bool> IsSupportedAuthenticationProviders(FileAuthen...

FILE: src/Ocelot/Configuration/Validator/FileConfigurationFluentValidator.cs
  class FileConfigurationFluentValidator (line 13) | public partial class FileConfigurationFluentValidator : AbstractValidato...
    method FileConfigurationFluentValidator (line 17) | public FileConfigurationFluentValidator(IServiceProvider provider, Rou...
    method HaveServiceDiscoveryProviderRegistered (line 66) | private bool HaveServiceDiscoveryProviderRegistered(FileRoute route, F...
    method HaveServiceDiscoveryProviderRegistered (line 73) | private bool HaveServiceDiscoveryProviderRegistered(FileServiceDiscove...
    method IsValid (line 80) | public async Task<Response<ConfigurationValidationResult>> IsValid(Fil...
    method AllRoutesForAggregateExist (line 96) | private static bool AllRoutesForAggregateExist(FileAggregateRoute file...
    method PlaceholderRegex (line 103) | [GeneratedRegex(@"\{\w+\}", RegexOptions.IgnoreCase | RegexOptions.Sin...
    method IsPlaceholderNotDuplicatedIn (line 106) | private static bool IsPlaceholderNotDuplicatedIn(string pathTemplate)
    method DoesNotContainRoutesWithSpecificRequestIdKeys (line 113) | private static bool DoesNotContainRoutesWithSpecificRequestIdKeys(File...
    method IsNotDuplicateIn (line 121) | private static bool IsNotDuplicateIn(FileRoute route, IEnumerable<File...
    method AreTheSame (line 150) | private static bool AreTheSame(IDictionary<string, string> upstreamHea...
    method IsNotDuplicateIn (line 154) | private static bool IsNotDuplicateIn(FileRoute route,
    method IsNotDuplicateIn (line 165) | private static bool IsNotDuplicateIn(FileAggregateRoute route, IEnumer...

FILE: src/Ocelot/Configuration/Validator/FileGlobalConfigurationFluentValidator.cs
  class FileGlobalConfigurationFluentValidator (line 6) | public class FileGlobalConfigurationFluentValidator : AbstractValidator<...
    method FileGlobalConfigurationFluentValidator (line 8) | public FileGlobalConfigurationFluentValidator(

FILE: src/Ocelot/Configuration/Validator/FileQoSOptionsFluentValidator.cs
  class FileQoSOptionsFluentValidator (line 8) | public class FileQoSOptionsFluentValidator : AbstractValidator<FileQoSOp...
    method FileQoSOptionsFluentValidator (line 12) | public FileQoSOptionsFluentValidator(IServiceProvider provider)
    method UseQos (line 18) | private bool UseQos(FileQoSOptions opts) => new QoSOptions(opts).UseQos;
    method CheckRules (line 19) | private void CheckRules()
    method HaveQosHandlerRegistered (line 26) | private bool HaveQosHandlerRegistered(FileQoSOptions arg)

FILE: src/Ocelot/Configuration/Validator/FileValidationFailedError.cs
  class FileValidationFailedError (line 5) | public class FileValidationFailedError : Error
    method FileValidationFailedError (line 7) | public FileValidationFailedError(string message)

FILE: src/Ocelot/Configuration/Validator/HostAndPortValidator.cs
  class HostAndPortValidator (line 6) | public class HostAndPortValidator : AbstractValidator<FileHostAndPort>
    method HostAndPortValidator (line 8) | public HostAndPortValidator()

FILE: src/Ocelot/Configuration/Validator/IConfigurationValidator.cs
  type IConfigurationValidator (line 6) | public interface IConfigurationValidator
    method IsValid (line 8) | Task<Response<ConfigurationValidationResult>> IsValid(FileConfiguratio...

FILE: src/Ocelot/Configuration/Validator/RouteFluentValidator.cs
  class RouteFluentValidator (line 11) | public partial class RouteFluentValidator : AbstractValidator<FileRoute>
    method RouteFluentValidator (line 13) | public RouteFluentValidator(
    method MilliSecondsRegex (line 99) | [GeneratedRegex(@"^\d+(\.\d+)?ms", RegexOptions.None, RegexGlobal.Defa...
    method SecondsRegex (line 102) | [GeneratedRegex(@"^\d+(\.\d+)?s", RegexOptions.None, RegexGlobal.Defau...
    method MinutesRegex (line 105) | [GeneratedRegex(@"^\d+(\.\d+)?m", RegexOptions.None, RegexGlobal.Defau...
    method HoursRegex (line 108) | [GeneratedRegex(@"^\d+(\.\d+)?h", RegexOptions.None, RegexGlobal.Defau...
    method DaysRegex (line 111) | [GeneratedRegex(@"^\d+(\.\d+)?d", RegexOptions.None, RegexGlobal.Defau...
    method IsValidPeriod (line 114) | private static bool IsValidPeriod(FileRateLimitByHeaderRule rateLimitO...

FILE: src/Ocelot/DependencyInjection/ConfigurationBuilderExtensions.cs
  class ConfigurationBuilderExtensions (line 13) | public static partial class ConfigurationBuilderExtensions
    method AddOcelotBaseUrl (line 19) | [Obsolete("Please set BaseUrl in ocelot.json GlobalConfiguration.BaseU...
    method AddOcelot (line 39) | public static IConfigurationBuilder AddOcelot(this IConfigurationBuild...
    method AddOcelot (line 49) | public static IConfigurationBuilder AddOcelot(this IConfigurationBuild...
    method AddOcelot (line 65) | public static IConfigurationBuilder AddOcelot(this IConfigurationBuild...
    method AddOcelot (line 83) | public static IConfigurationBuilder AddOcelot(this IConfigurationBuild...
    method ApplyMergeOcelotJsonOption (line 91) | private static IConfigurationBuilder ApplyMergeOcelotJsonOption(IConfi...
    method SubConfigRegex (line 99) | [GeneratedRegex(@"^ocelot\.(.*?)\.json$", RegexOptions.IgnoreCase | Re...
    method GetMergedOcelotJson (line 102) | private static string GetMergedOcelotJson(string folder, IWebHostEnvir...
    method AddOcelot (line 161) | public static IConfigurationBuilder AddOcelot(this IConfigurationBuild...
    method AddOcelot (line 181) | public static IConfigurationBuilder AddOcelot(this IConfigurationBuild...
    method AddOcelotJsonFile (line 200) | private static IConfigurationBuilder AddOcelotJsonFile(IConfigurationB...
    method AddOcelot (line 218) | public static IConfigurationBuilder AddOcelot(this IConfigurationBuild...

FILE: src/Ocelot/DependencyInjection/Features.cs
  class Features (line 13) | public static class Features
    method AddConfigurationValidators (line 19) | public static IServiceCollection AddConfigurationValidators(this IServ...
    method AddOcelotRateLimiting (line 35) | public static IServiceCollection AddOcelotRateLimiting(this IServiceCo...
    method AddOcelotCache (line 47) | public static IServiceCollection AddOcelotCache(this IServiceCollectio...
    method AddOcelotHeaderRouting (line 60) | public static IServiceCollection AddOcelotHeaderRouting(this IServiceC...
    method AddOcelotLogging (line 65) | public static IServiceCollection AddOcelotLogging(this IServiceCollect...
    method AddOcelotMetadata (line 75) | public static IServiceCollection AddOcelotMetadata(this IServiceCollec...

FILE: src/Ocelot/DependencyInjection/IOcelotBuilder.cs
  type IOcelotBuilder (line 10) | public interface IOcelotBuilder
    method AddDelegatingHandler (line 25) | IOcelotBuilder AddDelegatingHandler(Type delegateType, bool global = f...
    method AddDelegatingHandler (line 33) | IOcelotBuilder AddDelegatingHandler<THandler>(bool global = false)
    method AddSingletonDefinedAggregator (line 36) | IOcelotBuilder AddSingletonDefinedAggregator<T>()
    method AddTransientDefinedAggregator (line 39) | IOcelotBuilder AddTransientDefinedAggregator<T>()
    method AddCustomLoadBalancer (line 42) | IOcelotBuilder AddCustomLoadBalancer<T>()
    method AddCustomLoadBalancer (line 45) | IOcelotBuilder AddCustomLoadBalancer<T>(Func<T> loadBalancerFactoryFunc)
    method AddCustomLoadBalancer (line 48) | IOcelotBuilder AddCustomLoadBalancer<T>(Func<IServiceProvider, T> load...
    method AddCustomLoadBalancer (line 51) | IOcelotBuilder AddCustomLoadBalancer<T>(
    method AddCustomLoadBalancer (line 55) | IOcelotBuilder AddCustomLoadBalancer<T>(
    method AddConfigPlaceholders (line 59) | IOcelotBuilder AddConfigPlaceholders();

FILE: src/Ocelot/DependencyInjection/MergeOcelotJson.cs
  type MergeOcelotJson (line 3) | public enum MergeOcelotJson

FILE: src/Ocelot/DependencyInjection/OcelotBuilder.cs
  class OcelotBuilder (line 44) | public class OcelotBuilder : IOcelotBuilder
    method OcelotBuilder (line 50) | public OcelotBuilder(IServiceCollection services, IConfiguration confi...
    method AddDefaultAspNetServices (line 170) | protected IMvcCoreBuilder AddDefaultAspNetServices(IMvcCoreBuilder bui...
    method AddSingletonDefinedAggregator (line 183) | public IOcelotBuilder AddSingletonDefinedAggregator<T>()
    method AddTransientDefinedAggregator (line 190) | public IOcelotBuilder AddTransientDefinedAggregator<T>()
    method AddCustomLoadBalancer (line 197) | public IOcelotBuilder AddCustomLoadBalancer<TLoadBalancer>()
    method AddCustomLoadBalancer (line 205) | public IOcelotBuilder AddCustomLoadBalancer<TLoadBalancer>(Func<TLoadB...
    method AddCustomLoadBalancer (line 213) | public IOcelotBuilder AddCustomLoadBalancer<TLoadBalancer>(Func<IServi...
    method AddCustomLoadBalancer (line 221) | public IOcelotBuilder AddCustomLoadBalancer<TLoadBalancer>(Func<Downst...
    method AddCustomLoadBalancer (line 229) | public IOcelotBuilder AddCustomLoadBalancer<TLoadBalancer>(Func<IServi...
    method AddDelegatingHandler (line 251) | public IOcelotBuilder AddDelegatingHandler(Type delegateType, bool glo...
    method AddDelegatingHandler (line 281) | public IOcelotBuilder AddDelegatingHandler<THandler>(bool global = false)
    method AddConfigPlaceholders (line 301) | public IOcelotBuilder AddConfigPlaceholders()
    method CreateInstance (line 324) | private static object CreateInstance(IServiceProvider provider, Servic...

FILE: src/Ocelot/DependencyInjection/ServiceCollectionExtensions.cs
  class ServiceCollectionExtensions (line 9) | public static class ServiceCollectionExtensions
    method AddOcelot (line 21) | public static IOcelotBuilder AddOcelot(this IServiceCollection services)
    method AddOcelot (line 36) | public static IOcelotBuilder AddOcelot(this IServiceCollection service...
    method AddOcelotUsingBuilder (line 52) | [Obsolete("Use AddOcelotUsingBuilder() overloaded version with the 'IC...
    method AddOcelotUsingBuilder (line 69) | public static IOcelotBuilder AddOcelotUsingBuilder(this IServiceCollec...
    method DefaultConfiguration (line 75) | private static IConfiguration DefaultConfiguration(IWebHostEnvironment...
    method FindConfiguration (line 78) | private static IConfiguration FindConfiguration(this IServiceCollectio...

FILE: src/Ocelot/DownstreamPathManipulation/ChangeDownstreamPathTemplate.cs
  class ChangeDownstreamPathTemplate (line 11) | public class ChangeDownstreamPathTemplate : IChangeDownstreamPathTemplate
    method ChangeDownstreamPathTemplate (line 15) | public ChangeDownstreamPathTemplate(IClaimsParser claimsParser)
    method ChangeDownstreamPath (line 20) | public Response ChangeDownstreamPath(List<ClaimToThing> claimsToThings...

FILE: src/Ocelot/DownstreamPathManipulation/IChangeDownstreamPathTemplate.cs
  type IChangeDownstreamPathTemplate (line 9) | public interface IChangeDownstreamPathTemplate
    method ChangeDownstreamPath (line 11) | Response ChangeDownstreamPath(List<ClaimToThing> claimsToThings, IEnum...

FILE: src/Ocelot/DownstreamPathManipulation/Middleware/ClaimsToDownstreamPathMiddleware.cs
  class ClaimsToDownstreamPathMiddleware (line 8) | public class ClaimsToDownstreamPathMiddleware : OcelotMiddleware
    method ClaimsToDownstreamPathMiddleware (line 13) | public ClaimsToDownstreamPathMiddleware(RequestDelegate next,
    method Invoke (line 22) | public async Task Invoke(HttpContext httpContext)

FILE: src/Ocelot/DownstreamRouteFinder/DownstreamRouteHolder.cs
  class DownstreamRouteHolder (line 6) | public class DownstreamRouteHolder
    method DownstreamRouteHolder (line 8) | public DownstreamRouteHolder()
    method DownstreamRouteHolder (line 12) | public DownstreamRouteHolder(List<PlaceholderNameAndValue> templatePla...

FILE: src/Ocelot/DownstreamRouteFinder/Finder/DiscoveryDownstreamRouteFinder.cs
  class DiscoveryDownstreamRouteFinder (line 12) | public class DiscoveryDownstreamRouteFinder : IDownstreamRouteProvider
    method DiscoveryDownstreamRouteFinder (line 22) | public DiscoveryDownstreamRouteFinder(
    method Get (line 31) | public Response<DownstreamRouteHolder> Get(string upstreamUrlPath, str...
    method GetDownstreamPath (line 103) | private static string GetDownstreamPath(string upstreamUrlPath)
    method GetServiceName (line 117) | protected virtual string GetServiceName(string upstreamUrlPath, out st...

FILE: src/Ocelot/DownstreamRouteFinder/Finder/DownstreamRouteFinder.cs
  class DownstreamRouteFinder (line 9) | public class DownstreamRouteFinder : IDownstreamRouteProvider
    method DownstreamRouteFinder (line 16) | public DownstreamRouteFinder(
    method Get (line 28) | public Response<DownstreamRouteHolder> Get(string upstreamUrlPath, str...
    method RouteIsApplicableToThisRequest (line 57) | private static bool RouteIsApplicableToThisRequest(Route route, string...
    method GetPlaceholderNamesAndValues (line 65) | private DownstreamRouteHolder GetPlaceholderNamesAndValues(string path...

FILE: src/Ocelot/DownstreamRouteFinder/Finder/DownstreamRouteProviderFactory.cs
  class DownstreamRouteProviderFactory (line 7) | public class DownstreamRouteProviderFactory : IDownstreamRouteProviderFa...
    method DownstreamRouteProviderFactory (line 12) | public DownstreamRouteProviderFactory(IServiceProvider provider, IOcel...
    method Get (line 18) | public IDownstreamRouteProvider Get(IInternalConfiguration config)
    method IsServiceDiscovery (line 32) | private static bool IsServiceDiscovery(ServiceProviderConfiguration co...

FILE: src/Ocelot/DownstreamRouteFinder/Finder/IDownstreamRouteProvider.cs
  type IDownstreamRouteProvider (line 7) | public interface IDownstreamRouteProvider
    method Get (line 9) | Response<DownstreamRouteHolder> Get(string upstreamUrlPath, string ups...

FILE: src/Ocelot/DownstreamRouteFinder/Finder/IDownstreamRouteProviderFactory.cs
  type IDownstreamRouteProviderFactory (line 5) | public interface IDownstreamRouteProviderFactory
    method Get (line 7) | IDownstreamRouteProvider Get(IInternalConfiguration config);

FILE: src/Ocelot/DownstreamRouteFinder/Finder/UnableToFindDownstreamRouteError.cs
  class UnableToFindDownstreamRouteError (line 6) | public class UnableToFindDownstreamRouteError : Error
    method UnableToFindDownstreamRouteError (line 8) | public UnableToFindDownstreamRouteError(string path, string httpVerb)

FILE: src/Ocelot/DownstreamRouteFinder/HeaderMatcher/HeaderPlaceholderNameAndValueFinder.cs
  class HeaderPlaceholderNameAndValueFinder (line 7) | public class HeaderPlaceholderNameAndValueFinder : IHeaderPlaceholderNam...
    method Find (line 9) | public IList<PlaceholderNameAndValue> Find(IHeaderDictionary upstreamH...

FILE: src/Ocelot/DownstreamRouteFinder/HeaderMatcher/HeadersToHeaderTemplatesMatcher.cs
  class HeadersToHeaderTemplatesMatcher (line 7) | public class HeadersToHeaderTemplatesMatcher : IHeadersToHeaderTemplates...
    method Match (line 9) | public bool Match(IHeaderDictionary upstreamHeaders, IDictionary<strin...

FILE: src/Ocelot/DownstreamRouteFinder/HeaderMatcher/IHeaderPlaceholderNameAndValueFinder.cs
  type IHeaderPlaceholderNameAndValueFinder (line 10) | public interface IHeaderPlaceholderNameAndValueFinder
    method Find (line 12) | IList<PlaceholderNameAndValue> Find(IHeaderDictionary upstreamHeaders,...

FILE: src/Ocelot/DownstreamRouteFinder/HeaderMatcher/IHeadersToHeaderTemplatesMatcher.cs
  type IHeadersToHeaderTemplatesMatcher (line 9) | public interface IHeadersToHeaderTemplatesMatcher
    method Match (line 11) | bool Match(IHeaderDictionary upstreamHeaders, IDictionary<string, Upst...

FILE: src/Ocelot/DownstreamRouteFinder/Middleware/DownstreamRouteFinderMiddleware.cs
  class DownstreamRouteFinderMiddleware (line 9) | public class DownstreamRouteFinderMiddleware : OcelotMiddleware
    method DownstreamRouteFinderMiddleware (line 14) | public DownstreamRouteFinderMiddleware(RequestDelegate next,
    method Invoke (line 23) | public async Task Invoke(HttpContext httpContext)

FILE: src/Ocelot/DownstreamRouteFinder/UrlMatcher/IPlaceholderNameAndValueFinder.cs
  type IPlaceholderNameAndValueFinder (line 5) | public interface IPlaceholderNameAndValueFinder
    method Find (line 7) | Response<List<PlaceholderNameAndValue>> Find(string path, string query...

FILE: src/Ocelot/DownstreamRouteFinder/UrlMatcher/IUrlPathToUrlTemplateMatcher.cs
  type IUrlPathToUrlTemplateMatcher (line 5) | public interface IUrlPathToUrlTemplateMatcher
    method Match (line 7) | UrlMatch Match(string upstreamUrlPath, string upstreamQueryString, Ups...

FILE: src/Ocelot/DownstreamRouteFinder/UrlMatcher/PlaceholderNameAndValue.cs
  class PlaceholderNameAndValue (line 5) | public class PlaceholderNameAndValue
    method PlaceholderNameAndValue (line 10) | public PlaceholderNameAndValue(string name, string value)
    method ToString (line 20) | public override string ToString() => $"[{Name}={Value}]";

FILE: src/Ocelot/DownstreamRouteFinder/UrlMatcher/RegExUrlMatcher.cs
  class RegExUrlMatcher (line 5) | public class RegExUrlMatcher : IUrlPathToUrlTemplateMatcher
    method Match (line 7) | public UrlMatch Match(string upstreamUrlPath, string upstreamQueryStri...

FILE: src/Ocelot/DownstreamRouteFinder/UrlMatcher/UrlMatch.cs
  class UrlMatch (line 3) | public class UrlMatch
    method UrlMatch (line 5) | public UrlMatch(bool match)

FILE: src/Ocelot/DownstreamRouteFinder/UrlMatcher/UrlPathPlaceholderNameAndValueFinder.cs
  class UrlPathPlaceholderNameAndValueFinder (line 9) | public partial class UrlPathPlaceholderNameAndValueFinder : IPlaceholder...
    method Find (line 27) | public Response<List<PlaceholderNameAndValue>> Find(string path, strin...
    method RegexPlaceholders (line 46) | [GeneratedRegex(@"\{(.*?)\}", RegexOptions.None, PlaceholdersMilliseco...
    method FindGroups (line 62) | private static List<Group> FindGroups(string path, string query, strin...
    method GenerateRegexPattern (line 86) | private static string GenerateRegexPattern(string escapedTemplate)
    method RegexCatchAllQuery (line 105) | [GeneratedRegex(@"^[^{{}}]*\?\{(.*?)\}$", RegexOptions.None, CatchAllQ...
    method IsCatchAllQuery (line 114) | private static (bool IsMatch, string Placeholder) IsCatchAllQuery(stri...
    method RegexCatchAllPath (line 122) | [GeneratedRegex(@"^[^{{}}]*\{(.*?)\}/?$", RegexOptions.None, CatchAllP...
    method IsCatchAllPath (line 130) | private static bool IsCatchAllPath(string template) => RegexCatchAllPa...
    method ShouldSkipQuery (line 139) | private static bool ShouldSkipQuery(string query, string template) => ...
    method EscapeExceptBraces (line 144) | private static string EscapeExceptBraces(string input)

FILE: src/Ocelot/DownstreamUrlCreator/DownstreamPathPlaceholderReplacer.cs
  class DownstreamPathPlaceholderReplacer (line 9) | public class DownstreamPathPlaceholderReplacer : IDownstreamPathPlacehol...
    method Replace (line 11) | public DownstreamPath Replace(string downstreamPathTemplate, List<Plac...

FILE: src/Ocelot/DownstreamUrlCreator/DownstreamUrlCreatorMiddleware.cs
  class DownstreamUrlCreatorMiddleware (line 15) | public class DownstreamUrlCreatorMiddleware : OcelotMiddleware
    method DownstreamUrlCreatorMiddleware (line 24) | public DownstreamUrlCreatorMiddleware(
    method Invoke (line 34) | public async Task Invoke(HttpContext context)
    method MergeQueryStringsWithoutDuplicateValues (line 96) | protected static string MergeQueryStringsWithoutDuplicateValues(string...
    method RemoveQueryStringParametersThatHaveBeenUsedInTemplate (line 124) | protected static string RemoveQueryStringParametersThatHaveBeenUsedInT...
    method GetPath (line 140) | protected static ReadOnlySpan<char> GetPath(ReadOnlySpan<char> downstr...
    method GetQueryString (line 148) | protected static ReadOnlySpan<char> GetQueryString(ReadOnlySpan<char> ...
    method CreateServiceFabricUri (line 156) | protected (string Path, string Query) CreateServiceFabricUri(Downstrea...
    method ServiceFabricRequest (line 164) | protected static bool ServiceFabricRequest(IInternalConfiguration conf...

FILE: src/Ocelot/DownstreamUrlCreator/IDownstreamPathPlaceholderReplacer.cs
  type IDownstreamPathPlaceholderReplacer (line 6) | public interface IDownstreamPathPlaceholderReplacer
    method Replace (line 8) | DownstreamPath Replace(string downstreamPathTemplate, List<Placeholder...

FILE: src/Ocelot/Errors/Error.cs
  class Error (line 3) | public abstract class Error
    method Error (line 5) | protected Error(string message, OcelotErrorCode code, int httpStatusCode)
    method ToString (line 16) | public override string ToString() => $"{Code}: {Message}";

FILE: src/Ocelot/Errors/Middleware/ExceptionHandlerMiddleware.cs
  class ExceptionHandlerMiddleware (line 13) | public class ExceptionHandlerMiddleware : OcelotMiddleware
    method ExceptionHandlerMiddleware (line 18) | public ExceptionHandlerMiddleware(RequestDelegate next,
    method Invoke (line 27) | public async Task Invoke(HttpContext context)
    method TrySetGlobalRequestId (line 63) | private void TrySetGlobalRequestId(HttpContext context, IInternalConfi...
    method CreateMessage (line 74) | private static string CreateMessage(HttpContext context, Exception e, ...

FILE: src/Ocelot/Errors/OcelotErrorCode.cs
  type OcelotErrorCode (line 3) | public enum OcelotErrorCode

FILE: src/Ocelot/Errors/RequestTimedOutError.cs
  class RequestTimedOutError (line 5) | public class RequestTimedOutError : Error
    method RequestTimedOutError (line 7) | public RequestTimedOutError(Exception exception)

FILE: src/Ocelot/Headers/AddHeadersToRequest.cs
  class AddHeadersToRequest (line 13) | public class AddHeadersToRequest : IAddHeadersToRequest
    method AddHeadersToRequest (line 19) | public AddHeadersToRequest(IClaimsParser claimsParser, IPlaceholders p...
    method SetHeadersOnDownstreamRequest (line 26) | public Response SetHeadersOnDownstreamRequest(List<ClaimToThing> claim...
    method SetHeadersOnDownstreamRequest (line 50) | public void SetHeadersOnDownstreamRequest(IEnumerable<AddHeader> heade...

FILE: src/Ocelot/Headers/AddHeadersToResponse.cs
  class AddHeadersToResponse (line 8) | public class AddHeadersToResponse : IAddHeadersToResponse
    method AddHeadersToResponse (line 13) | public AddHeadersToResponse(IPlaceholders placeholders, IOcelotLoggerF...
    method Add (line 19) | public void Add(List<AddHeader> addHeaders, DownstreamResponse response)

FILE: src/Ocelot/Headers/HttpContextRequestHeaderReplacer.cs
  class HttpContextRequestHeaderReplacer (line 7) | public class HttpContextRequestHeaderReplacer : IHttpContextRequestHeade...
    method Replace (line 9) | public Response Replace(HttpContext context, List<HeaderFindAndReplace...

FILE: src/Ocelot/Headers/HttpResponseHeaderReplacer.cs
  class HttpResponseHeaderReplacer (line 10) | public class HttpResponseHeaderReplacer : IHttpResponseHeaderReplacer
    method HttpResponseHeaderReplacer (line 14) | public HttpResponseHeaderReplacer(IPlaceholders placeholders)
    method Replace (line 19) | public Response Replace(HttpContext httpContext, List<HeaderFindAndRep...

FILE: src/Ocelot/Headers/IAddHeadersToRequest.cs
  type IAddHeadersToRequest (line 9) | public interface IAddHeadersToRequest
    method SetHeadersOnDownstreamRequest (line 11) | Response SetHeadersOnDownstreamRequest(List<ClaimToThing> claimsToThin...
    method SetHeadersOnDownstreamRequest (line 13) | void SetHeadersOnDownstreamRequest(IEnumerable<AddHeader> headers, Htt...

FILE: src/Ocelot/Headers/IAddHeadersToResponse.cs
  type IAddHeadersToResponse (line 6) | public interface IAddHeadersToResponse
    method Add (line 8) | void Add(List<AddHeader> addHeaders, DownstreamResponse response);

FILE: src/Ocelot/Headers/IHttpContextRequestHeaderReplacer.cs
  type IHttpContextRequestHeaderReplacer (line 7) | public interface IHttpContextRequestHeaderReplacer
    method Replace (line 9) | Response Replace(HttpContext context, List<HeaderFindAndReplace> fAndRs);

FILE: src/Ocelot/Headers/IHttpResponseHeaderReplacer.cs
  type IHttpResponseHeaderReplacer (line 7) | public interface IHttpResponseHeaderReplacer
    method Replace (line 9) | public Response Replace(HttpContext httpContext, List<HeaderFindAndRep...

FILE: src/Ocelot/Headers/IRemoveOutputHeaders.cs
  type IRemoveOutputHeaders (line 6) | public interface IRemoveOutputHeaders
    method Remove (line 8) | Response Remove(List<Header> headers);

FILE: src/Ocelot/Headers/Middleware/ClaimsToHeadersMiddleware.cs
  class ClaimsToHeadersMiddleware (line 7) | public class ClaimsToHeadersMiddleware : OcelotMiddleware
    method ClaimsToHeadersMiddleware (line 12) | public ClaimsToHeadersMiddleware(RequestDelegate next,
    method Invoke (line 21) | public async Task Invoke(HttpContext httpContext)

FILE: src/Ocelot/Headers/Middleware/HttpHeadersTransformationMiddleware.cs
  class HttpHeadersTransformationMiddleware (line 7) | public class HttpHeadersTransformationMiddleware : OcelotMiddleware
    method HttpHeadersTransformationMiddleware (line 15) | public HttpHeadersTransformationMiddleware(RequestDelegate next,
    method Invoke (line 31) | public async Task Invoke(HttpContext httpContext)

FILE: src/Ocelot/Headers/RemoveOutputHeaders.cs
  class RemoveOutputHeaders (line 6) | public class RemoveOutputHeaders : IRemoveOutputHeaders
    method Remove (line 18) | public Response Remove(List<Header> headers)

FILE: src/Ocelot/Infrastructure/CannotAddPlaceholderError.cs
  class CannotAddPlaceholderError (line 5) | public class CannotAddPlaceholderError : Error
    method CannotAddPlaceholderError (line 7) | public CannotAddPlaceholderError(string message)

FILE: src/Ocelot/Infrastructure/CannotRemovePlaceholderError.cs
  class CannotRemovePlaceholderError (line 5) | public class CannotRemovePlaceholderError : Error
    method CannotRemovePlaceholderError (line 7) | public CannotRemovePlaceholderError(string message)

FILE: src/Ocelot/Infrastructure/Claims/CannotFindClaimError.cs
  class CannotFindClaimError (line 5) | public class CannotFindClaimError : Error
    method CannotFindClaimError (line 7) | public CannotFindClaimError(string message)

FILE: src/Ocelot/Infrastructure/Claims/ClaimsParser.cs
  class ClaimsParser (line 7) | public class ClaimsParser : IClaimsParser
    method GetValue (line 9) | public Response<string> GetValue(IEnumerable<Claim> claims, string key...
    method GetValuesByClaimType (line 35) | public Response<List<string>> GetValuesByClaimType(IEnumerable<Claim> ...
    method GetValue (line 44) | private static Response<string> GetValue(IEnumerable<Claim> claims, st...

FILE: src/Ocelot/Infrastructure/Claims/IClaimsParser.cs
  type IClaimsParser (line 6) | public interface IClaimsParser
    method GetValue (line 8) | Response<string> GetValue(IEnumerable<Claim> claims, string key, strin...
    method GetValuesByClaimType (line 10) | Response<List<string>> GetValuesByClaimType(IEnumerable<Claim> claims,...

FILE: src/Ocelot/Infrastructure/ConfigAwarePlaceholders.cs
  class ConfigAwarePlaceholders (line 10) | public partial class ConfigAwarePlaceholders : IPlaceholders
    method ConfigAwarePlaceholders (line 15) | public ConfigAwarePlaceholders(IConfiguration configuration, IPlacehol...
    method Get (line 21) | public Response<string> Get(string key)
    method Get (line 33) | public Response<string> Get(string key, DownstreamRequest request)
    method Add (line 45) | public Response Add(string key, Func<Response<string>> func)
    method Remove (line 48) | public Response Remove(string key)
    method Regex (line 51) | [GeneratedRegex(@"[{}]", RegexOptions.None, RegexGlobal.DefaultMatchTi...
    method CleanKey (line 54) | private static string CleanKey(string key)
    method GetFromConfig (line 57) | private Response<string> GetFromConfig(string key)

FILE: src/Ocelot/Infrastructure/CouldNotFindPlaceholderError.cs
  class CouldNotFindPlaceholderError (line 5) | public class CouldNotFindPlaceholderError : Error
    method CouldNotFindPlaceholderError (line 7) | public CouldNotFindPlaceholderError(string placeholder)

FILE: src/Ocelot/Infrastructure/DelayedMessage.cs
  class DelayedMessage (line 3) | internal class DelayedMessage<T>
    method DelayedMessage (line 5) | public DelayedMessage(T message, int delay)

FILE: src/Ocelot/Infrastructure/DesignPatterns/Retry.cs
  class Retry (line 13) | public static class Retry
    method GetMessage (line 18) | private static string GetMessage<T>(T operation, int retryNo, string m...
    method Operation (line 32) | public static TResult Operation<TResult>(
    method OperationAsync (line 84) | public static async Task<TResult> OperationAsync<TResult>(

FILE: src/Ocelot/Infrastructure/Extensions/ErrorListExtensions.cs
  class ErrorListExtensions (line 5) | public static class ErrorListExtensions
    method ToErrorString (line 17) | public static string ToErrorString(this List<Error> errors, bool befor...

FILE: src/Ocelot/Infrastructure/Extensions/HttpContextExtensions.cs
  class HttpContextExtensions (line 5) | public static class HttpContextExtensions
    method IsOptionsMethod (line 7) | public static bool IsOptionsMethod(this HttpContext context)

FILE: src/Ocelot/Infrastructure/Extensions/HttpRequestExtensions.cs
  class HttpRequestExtensions (line 5) | public static class HttpRequestExtensions
    method IsOptionsMethod (line 7) | public static bool IsOptionsMethod(this HttpRequest request)

FILE: src/Ocelot/Infrastructure/Extensions/IEnumerableExtensions.cs
  class IEnumerableExtensions (line 3) | public static class IEnumerableExtensions
    method ToHttpMethods (line 16) | public static HashSet<HttpMethod> ToHttpMethods(this IEnumerable<strin...
    method Csv (line 28) | public static string Csv<T>(this IEnumerable<T> values)
    method NotNull (line 31) | public static IEnumerable<T> NotNull<T>(this IEnumerable<T> collection)

FILE: src/Ocelot/Infrastructure/Extensions/Int32Extensions.cs
  class Int32Extensions (line 3) | public static class Int32Extensions
    method Ensure (line 5) | public static int Ensure(this int value, int low = 0)
    method Positive (line 8) | public static int Positive(this int value)
    method Positive (line 17) | public static int? Positive(this int? value, int toDefault = 1)

FILE: src/Ocelot/Infrastructure/Extensions/StringBuilderExtensions.cs
  class StringBuilderExtensions (line 3) | public static class StringBuilderExtensions
    method AppendNext (line 11) | public static StringBuilder AppendNext(this StringBuilder builder, str...

FILE: src/Ocelot/Infrastructure/Extensions/StringExtensions.cs
  class StringExtensions (line 3) | public static class StringExtensions
    method IsEmpty (line 9) | public static bool IsEmpty(this string str) => string.IsNullOrWhiteSpa...
    method IsNotEmpty (line 10) | public static bool IsNotEmpty(this string str) => !string.IsNullOrWhit...
    method IfEmpty (line 17) | public static string IfEmpty(this string str, string def) => string.Is...
    method TrimPrefix (line 24) | public static string TrimPrefix(this string source, string prefix, Str...
    method LastCharAsForwardSlash (line 45) | public static string LastCharAsForwardSlash(this string source)
    method Plural (line 48) | public static string Plural(this int count) => count == 1 ? string.Emp...
    method Plural (line 49) | public static string Plural(this string source, int count) => count ==...

FILE: src/Ocelot/Infrastructure/FrameworkDescription.cs
  class FrameworkDescription (line 5) | public class FrameworkDescription : IFrameworkDescription
    method Get (line 7) | public string Get()

FILE: src/Ocelot/Infrastructure/IBus.cs
  type IBus (line 3) | public interface IBus<T>
    method Subscribe (line 5) | void Subscribe(Action<T> action);
    method Publish (line 7) | void Publish(T message, int delay);

FILE: src/Ocelot/Infrastructure/IFrameworkDescription.cs
  type IFrameworkDescription (line 3) | public interface IFrameworkDescription
    method Get (line 5) | string Get();

FILE: src/Ocelot/Infrastructure/IPlaceholders.cs
  type IPlaceholders (line 6) | public interface IPlaceholders
    method Get (line 8) | Response<string> Get(string key);
    method Get (line 10) | Response<string> Get(string key, DownstreamRequest request);
    method Add (line 12) | Response Add(string key, Func<Response<string>> func);
    method Remove (line 14) | Response Remove(string key);

FILE: src/Ocelot/Infrastructure/InMemoryBus.cs
  class InMemoryBus (line 3) | public class InMemoryBus<T> : IBus<T>
    method InMemoryBus (line 9) | public InMemoryBus()
    method Subscribe (line 17) | public void Subscribe(Action<T> action)
    method Publish (line 22) | public void Publish(T message, int delay)
    method Process (line 28) | private async Task Process()

FILE: src/Ocelot/Infrastructure/Placeholders.cs
  class Placeholders (line 11) | public class Placeholders : IPlaceholders
    method Placeholders (line 22) | public Placeholders(IBaseUrlFinder finder, IRequestScopedDataRepositor...
    method Get (line 41) | public Response<string> Get(string key)
    method Get (line 55) | public Response<string> Get(string key, DownstreamRequest request)
    method Add (line 62) | public Response Add(string key, Func<Response<string>> func)
    method Remove (line 69) | public Response Remove(string key)
    method GetRemoteIpAddress (line 80) | private Response<string> GetRemoteIpAddress()
    method GetDownstreamBaseUrl (line 97) | private static string GetDownstreamBaseUrl(DownstreamRequest x)
    method GetTraceId (line 108) | private Response<string> GetTraceId()
    method GetBaseUrl (line 116) | private Response<string> GetBaseUrl() => new OkResponse<string>(_finde...
    method GetUpstreamHost (line 118) | private Response<string> GetUpstreamHost()

FILE: src/Ocelot/Infrastructure/RegexGlobal.cs
  class RegexGlobal (line 5) | public static class RegexGlobal
    method RegexGlobal (line 7) | static RegexGlobal()
    method New (line 37) | public static Regex New(string pattern)
    method New (line 39) | public static Regex New(string pattern, RegexOptions options)
    method New (line 41) | public static Regex New(string pattern, RegexOptions options, TimeSpan...

FILE: src/Ocelot/Infrastructure/RequestData/CannotAddDataError.cs
  class CannotAddDataError (line 5) | public class CannotAddDataError : Error
    method CannotAddDataError (line 7) | public CannotAddDataError(string message) : base(message, OcelotErrorC...

FILE: src/Ocelot/Infrastructure/RequestData/CannotFindDataError.cs
  class CannotFindDataError (line 5) | public class CannotFindDataError : Error
    method CannotFindDataError (line 7) | public CannotFindDataError(string message) : base(message, OcelotError...

FILE: src/Ocelot/Infrastructure/RequestData/HttpDataRepository.cs
  class HttpDataRepository (line 6) | public class HttpDataRepository : IRequestScopedDataRepository
    method HttpDataRepository (line 10) | public HttpDataRepository(IHttpContextAccessor contextAccessor)
    method Add (line 15) | public Response Add<T>(string key, T value)
    method Update (line 28) | public Response Update<T>(string key, T value)
    method Get (line 41) | public Response<T> Get<T>(string key)

FILE: src/Ocelot/Infrastructure/RequestData/IRequestScopedDataRepository.cs
  type IRequestScopedDataRepository (line 5) | public interface IRequestScopedDataRepository
    method Add (line 7) | Response Add<T>(string key, T value);
    method Update (line 9) | Response Update<T>(string key, T value);
    method Get (line 11) | Response<T> Get<T>(string key);

FILE: src/Ocelot/LoadBalancer/Balancers/CookieStickySessions.cs
  class CookieStickySessions (line 10) | public class CookieStickySessions : ILoadBalancer
    method CookieStickySessions (line 23) | static CookieStickySessions()
    method CookieStickySessions (line 47) | public CookieStickySessions(ILoadBalancer loadBalancer, string cookieN...
    method CheckExpiry (line 56) | private void CheckExpiry(StickySession sticky)
    method LeaseAsync (line 71) | public Task<Response<ServiceHostAndPort>> LeaseAsync(HttpContext httpC...
    method Update (line 99) | protected void Update(string key, StickySession value)
    method Release (line 108) | public void Release(ServiceHostAndPort hostAndPort)

FILE: src/Ocelot/LoadBalancer/Balancers/LeastConnection.cs
  class LeastConnection (line 9) | public class LeastConnection : ILoadBalancer
    method LeastConnection (line 22) | public LeastConnection(Func<Task<List<Service>>> services, string serv...
    method OnLeased (line 30) | protected virtual void OnLeased(LeaseEventArgs e) => Leased?.Invoke(th...
    method LeaseAsync (line 32) | public async Task<Response<ServiceHostAndPort>> LeaseAsync(HttpContext...
    method Release (line 55) | public void Release(ServiceHostAndPort hostAndPort)
    method Update (line 67) | private int Update(ref Lease item, bool increase)
    method GetLeaseWithLeastConnections (line 75) | private Lease GetLeaseWithLeastConnections()
    method UpdateLeasing (line 81) | private void UpdateLeasing(List<Service> services)

FILE: src/Ocelot/LoadBalancer/Balancers/NoLoadBalancer.cs
  class NoLoadBalancer (line 9) | public class NoLoadBalancer : ILoadBalancer
    method NoLoadBalancer (line 13) | public NoLoadBalancer(Func<Task<List<Service>>> services)
    method LeaseAsync (line 20) | public async Task<Response<ServiceHostAndPort>> LeaseAsync(HttpContext...
    method Release (line 33) | public void Release(ServiceHostAndPort hostAndPort)

FILE: src/Ocelot/LoadBalancer/Balancers/RoundRobin.cs
  class RoundRobin (line 9) | public class RoundRobin : ILoadBalancer
    method RoundRobin (line 17) | public RoundRobin(Func<Task<List<Service>>> services, string serviceName)
    method OnLeased (line 33) | protected virtual void OnLeased(LeaseEventArgs e) => Leased?.Invoke(th...
    method LeaseAsync (line 35) | public virtual async Task<Response<ServiceHostAndPort>> LeaseAsync(Htt...
    method Release (line 56) | public virtual void Release(ServiceHostAndPort hostAndPort) { }
    method CaptureState (line 62) | private static Service[] CaptureState(List<Service> services, out int ...
    method TryScanNext (line 76) | private bool TryScanNext(Service[] readme, out Service next, out int i...
    method ProcessLeasing (line 100) | private void ProcessLeasing(Service[] readme, Service next, int index)
    method Update (line 108) | private int Update(ref Lease item, bool increase)
    method GetLease (line 116) | private Lease GetLease(Service @for) => _leasing.Find(l => l == @for.H...
    method UpdateLeasing (line 118) | private void UpdateLeasing(IList<Service> services)

FILE: src/Ocelot/LoadBalancer/Creators/CookieStickySessionsCreator.cs
  class CookieStickySessionsCreator (line 10) | public class CookieStickySessionsCreator : ILoadBalancerCreator
    method Create (line 12) | public Response<ILoadBalancer> Create(DownstreamRoute route, IServiceD...

FILE: src/Ocelot/LoadBalancer/Creators/DelegateInvokingLoadBalancerCreator.cs
  class DelegateInvokingLoadBalancerCreator (line 9) | public class DelegateInvokingLoadBalancerCreator<T> : ILoadBalancerCreator
    method DelegateInvokingLoadBalancerCreator (line 14) | public DelegateInvokingLoadBalancerCreator(
    method Create (line 20) | public Response<ILoadBalancer> Create(DownstreamRoute route, IServiceD...

FILE: src/Ocelot/LoadBalancer/Creators/LeastConnectionCreator.cs
  class LeastConnectionCreator (line 9) | public class LeastConnectionCreator : ILoadBalancerCreator
    method Create (line 11) | public Response<ILoadBalancer> Create(DownstreamRoute route, IServiceD...

FILE: src/Ocelot/LoadBalancer/Creators/NoLoadBalancerCreator.cs
  class NoLoadBalancerCreator (line 9) | public class NoLoadBalancerCreator : ILoadBalancerCreator
    method Create (line 11) | public Response<ILoadBalancer> Create(DownstreamRoute route, IServiceD...

FILE: src/Ocelot/LoadBalancer/Creators/RoundRobinCreator.cs
  class RoundRobinCreator (line 9) | public class RoundRobinCreator : ILoadBalancerCreator
    method Create (line 11) | public Response<ILoadBalancer> Create(DownstreamRoute route, IServiceD...

FILE: src/Ocelot/LoadBalancer/Errors/CouldNotFindLoadBalancerCreatorError.cs
  class CouldNotFindLoadBalancerCreatorError (line 6) | public class CouldNotFindLoadBalancerCreatorError : Error
    method CouldNotFindLoadBalancerCreatorError (line 8) | public CouldNotFindLoadBalancerCreatorError(string message)

FILE: src/Ocelot/LoadBalancer/Errors/InvokingLoadBalancerCreatorError.cs
  class InvokingLoadBalancerCreatorError (line 6) | public class InvokingLoadBalancerCreatorError : Error
    method InvokingLoadBalancerCreatorError (line 8) | public InvokingLoadBalancerCreatorError(Exception e)

FILE: src/Ocelot/LoadBalancer/Errors/ServicesAreEmptyError.cs
  class ServicesAreEmptyError (line 6) | public class ServicesAreEmptyError : Error
    method ServicesAreEmptyError (line 8) | public ServicesAreEmptyError(string message)

FILE: src/Ocelot/LoadBalancer/Errors/ServicesAreNullError.cs
  class ServicesAreNullError (line 6) | public class ServicesAreNullError : Error
    method ServicesAreNullError (line 8) | public ServicesAreNullError(string message)

FILE: src/Ocelot/LoadBalancer/Errors/UnableToFindLoadBalancerError.cs
  class UnableToFindLoadBalancerError (line 6) | public class UnableToFindLoadBalancerError : Error
    method UnableToFindLoadBalancerError (line 8) | public UnableToFindLoadBalancerError(string message)

FILE: src/Ocelot/LoadBalancer/Interfaces/ILoadBalancer.cs
  type ILoadBalancer (line 9) | public interface ILoadBalancer
    method LeaseAsync (line 11) | Task<Response<ServiceHostAndPort>> LeaseAsync(HttpContext httpContext);
    method Release (line 13) | void Release(ServiceHostAndPort hostAndPort);

FILE: src/Ocelot/LoadBalancer/Interfaces/ILoadBalancerCreator.cs
  type ILoadBalancerCreator (line 7) | public interface ILoadBalancerCreator
    method Create (line 9) | Response<ILoadBalancer> Create(DownstreamRoute route, IServiceDiscover...

FILE: src/Ocelot/LoadBalancer/Interfaces/ILoadBalancerFactory.cs
  type ILoadBalancerFactory (line 6) | public interface ILoadBalancerFactory
    method Get (line 8) | Response<ILoadBalancer> Get(DownstreamRoute route, ServiceProviderConf...

FILE: src/Ocelot/LoadBalancer/Interfaces/ILoadBalancerHouse.cs
  type ILoadBalancerHouse (line 6) | public interface ILoadBalancerHouse
    method Get (line 8) | Response<ILoadBalancer> Get(DownstreamRoute route, ServiceProviderConf...

FILE: src/Ocelot/LoadBalancer/Lease.cs
  type Lease (line 5) | public struct Lease : IEquatable<Lease>
    method Lease (line 7) | public Lease()
    method Lease (line 13) | public Lease(Lease from)
    method Lease (line 19) | public Lease(ServiceHostAndPort hostAndPort)
    method Lease (line 25) | public Lease(ServiceHostAndPort hostAndPort, int connections)
    method ToString (line 36) | public override readonly string ToString() => $"({HostAndPort}+{Connec...
    method GetHashCode (line 37) | public override readonly int GetHashCode() => HostAndPort.GetHashCode();
    method Equals (line 38) | public override readonly bool Equals(object obj) => obj is Lease l && ...
    method Equals (line 39) | public readonly bool Equals(Lease other) => this == other;

FILE: src/Ocelot/LoadBalancer/LeaseEventArgs.cs
  class LeaseEventArgs (line 5) | public class LeaseEventArgs : EventArgs
    method LeaseEventArgs (line 7) | public LeaseEventArgs(Lease lease, Service service, int serviceIndex)

FILE: src/Ocelot/LoadBalancer/LoadBalancerFactory.cs
  class LoadBalancerFactory (line 10) | public class LoadBalancerFactory : ILoadBalancerFactory
    method LoadBalancerFactory (line 15) | public LoadBalancerFactory(IServiceDiscoveryProviderFactory servicePro...
    method Get (line 21) | public Response<ILoadBalancer> Get(DownstreamRoute route, ServiceProvi...

FILE: src/Ocelot/LoadBalancer/LoadBalancerHouse.cs
  class LoadBalancerHouse (line 8) | public class LoadBalancerHouse : ILoadBalancerHouse
    method LoadBalancerHouse (line 18) | public LoadBalancerHouse(ILoadBalancerFactory factory)
    method Get (line 24) | public Response<ILoadBalancer> Get(DownstreamRoute route, ServiceProvi...
    method GetResponse (line 43) | private Response<ILoadBalancer> GetResponse(DownstreamRoute route, Ser...

FILE: src/Ocelot/LoadBalancer/LoadBalancingMiddleware.cs
  class LoadBalancingMiddleware (line 8) | public class LoadBalancingMiddleware : OcelotMiddleware
    method LoadBalancingMiddleware (line 13) | public LoadBalancingMiddleware(RequestDelegate next,
    method Invoke (line 22) | public async Task Invoke(HttpContext httpContext)

FILE: src/Ocelot/LoadBalancer/StickySession.cs
  class StickySession (line 5) | public class StickySession
    method StickySession (line 7) | public StickySession(ServiceHostAndPort hostAndPort, DateTime expiry, ...

FILE: src/Ocelot/Logging/IOcelotLogger.cs
  type IOcelotLogger (line 9) | public interface IOcelotLogger : IDisposable
    method LogTrace (line 11) | void LogTrace(string message);
    method LogTrace (line 12) | void LogTrace(Func<string> messageFactory);
    method LogDebug (line 14) | void LogDebug(string message);
    method LogDebug (line 15) | void LogDebug(Func<string> messageFactory);
    method LogInformation (line 17) | void LogInformation(string message);
    method LogInformation (line 18) | void LogInformation(Func<string> messageFactory);
    method LogWarning (line 20) | void LogWarning(string message);
    method LogWarning (line 21) | void LogWarning(Func<string> messageFactory);
    method LogError (line 23) | void LogError(string message, Exception exception);
    method LogError (line 24) | void LogError(Func<string> messageFactory, Exception exception);
    method LogCritical (line 26) | void LogCritical(string message, Exception exception);
    method LogCritical (line 27) | void LogCritical(Func<string> messageFactory, Exception exception);

FILE: src/Ocelot/Logging/IOcelotLoggerFactory.cs
  type IOcelotLoggerFactory (line 3) | public interface IOcelotLoggerFactory : IDisposable
    method CreateLogger (line 5) | IOcelotLogger CreateLogger<T>();

FILE: src/Ocelot/Logging/IOcelotTracer.cs
  type IOcelotTracer (line 5) | public interface IOcelotTracer
    method Event (line 7) | void Event(HttpContext httpContext, string @event);
    method SendAsync (line 9) | Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,

FILE: src/Ocelot/Logging/ITracingHandler.cs
  type ITracingHandler (line 3) | public interface ITracingHandler

FILE: src/Ocelot/Logging/ITracingHandlerFactory.cs
  type ITracingHandlerFactory (line 3) | public interface ITracingHandlerFactory
    method Get (line 5) | ITracingHandler Get();

FILE: src/Ocelot/Logging/OcelotDiagnosticListener.cs
  class OcelotDiagnosticListener (line 7) | public class OcelotDiagnosticListener
    method OcelotDiagnosticListener (line 12) | public OcelotDiagnosticListener(IOcelotLoggerFactory factory, IService...
    method OnMiddlewareStarting (line 18) | [DiagnosticName("Microsoft.AspNetCore.MiddlewareAnalysis.MiddlewareSta...
    method OnMiddlewareException (line 25) | [DiagnosticName("Microsoft.AspNetCore.MiddlewareAnalysis.MiddlewareExc...
    method OnMiddlewareFinished (line 31) | [DiagnosticName("Microsoft.AspNetCore.MiddlewareAnalysis.MiddlewareFin...
    method Event (line 38) | protected virtual void Event(HttpContext httpContext, string @event)

FILE: src/Ocelot/Logging/OcelotHttpTracingHandler.cs
  class OcelotHttpTracingHandler (line 5) | public class OcelotHttpTracingHandler : DelegatingHandler, ITracingHandler
    method OcelotHttpTracingHandler (line 12) | public OcelotHttpTracingHandler(
    method SendAsync (line 22) | protected override Task<HttpResponseMessage> SendAsync(HttpRequestMess...
    method AddTraceId (line 25) | protected virtual void AddTraceId(string id)

FILE: src/Ocelot/Logging/OcelotLogger.cs
  class OcelotLogger (line 10) | public class OcelotLogger : IOcelotLogger, IDisposable
    method OcelotLogger (line 27) | public OcelotLogger(ILogger logger, IRequestScopedDataRepository scope...
    method LogTrace (line 33) | public void LogTrace(string message) => WriteLog(LogLevel.Trace, messa...
    method LogTrace (line 34) | public void LogTrace(Func<string> messageFactory) => WriteLog(LogLevel...
    method LogDebug (line 36) | public void LogDebug(string message) => WriteLog(LogLevel.Debug, messa...
    method LogDebug (line 37) | public void LogDebug(Func<string> messageFactory) => WriteLog(LogLevel...
    method LogInformation (line 39) | public void LogInformation(string message) => WriteLog(LogLevel.Inform...
    method LogInformation (line 40) | public void LogInformation(Func<string> messageFactory) => WriteLog(Lo...
    method LogWarning (line 42) | public void LogWarning(string message) => WriteLog(LogLevel.Warning, m...
    method LogWarning (line 43) | public void LogWarning(Func<string> messageFactory) => WriteLog(LogLev...
    method LogError (line 45) | public void LogError(string message, Exception exception) => WriteLog(...
    method LogError (line 46) | public void LogError(Func<string> messageFactory, Exception exception)...
    method LogCritical (line 48) | public void LogCritical(string message, Exception exception) => WriteL...
    method LogCritical (line 49) | public void LogCritical(Func<string> messageFactory, Exception excepti...
    method GetOcelotRequestId (line 51) | private string GetOcelotRequestId()
    method GetOcelotPreviousRequestId (line 57) | private string GetOcelotPreviousRequestId()
    method WriteLog (line 63) | private void WriteLog(LogLevel logLevel, string message, Exception exc...
    method WriteLog (line 68) | private void WriteLog(LogLevel logLevel, Func<string> messageFactory, ...
    method WriteLog (line 73) | private void WriteLog(LogLevel logLevel, Func<string> messageFactory, ...
    method NoFormatter (line 99) | public static string NoFormatter(string state, Exception e) => state;
    method ExceptionFormatter (line 100) | public static string ExceptionFormatter(string state, Exception e)
    method Dispose (line 103) | protected virtual void Dispose(bool disposing)
    method Dispose (line 115) | public void Dispose()

FILE: src/Ocelot/Logging/OcelotLoggerFactory.cs
  class OcelotLoggerFactory (line 6) | public class OcelotLoggerFactory : IOcelotLoggerFactory, IDisposable
    method OcelotLoggerFactory (line 12) | public OcelotLoggerFactory(ILoggerFactory loggerFactory, IRequestScope...
    method CreateLogger (line 18) | public IOcelotLogger CreateLogger<T>()
    method Dispose (line 25) | public void Dispose()
    method Dispose (line 31) | protected virtual void Dispose(bool disposing)

FILE: src/Ocelot/Logging/TracingHandlerFactory.cs
  class TracingHandlerFactory (line 6) | public class TracingHandlerFactory : ITracingHandlerFactory
    method TracingHandlerFactory (line 11) | public TracingHandlerFactory(
    method Get (line 19) | public ITracingHandler Get()

FILE: src/Ocelot/Metadata/DownstreamRouteExtensions.cs
  class DownstreamRouteExtensions (line 8) | public static class DownstreamRouteExtensions
    method GetMetadata (line 66) | public static T GetMetadata<T>(this DownstreamRoute route, string key,...
    method GetMetadataNode (line 75) | private static JsonNode GetMetadataNode(this DownstreamRoute route, st...
    method ConvertTo (line 92) | private static object ConvertTo(Type targetType, string value, Metadat...
    method ConvertToNumericType (line 135) | private static object ConvertToNumericType(string value, Type targetTy...

FILE: src/Ocelot/Middleware/BaseUrlFinder.cs
  class BaseUrlFinder (line 6) | public class BaseUrlFinder : IBaseUrlFinder
    method BaseUrlFinder (line 10) | public BaseUrlFinder(IConfiguration config)
    method Find (line 15) | public string Find()

FILE: src/Ocelot/Middleware/ConfigurationMiddleware.cs
  class ConfigurationMiddleware (line 8) | public class ConfigurationMiddleware : OcelotMiddleware
    method ConfigurationMiddleware (line 13) | public ConfigurationMiddleware(RequestDelegate next, IOcelotLoggerFact...
    method Invoke (line 20) | public async Task Invoke(HttpContext httpContext)

FILE: src/Ocelot/Middleware/DownstreamResponse.cs
  class DownstreamResponse (line 3) | public class DownstreamResponse : IDisposable
    method DownstreamResponse (line 9) | public DownstreamResponse(HttpContent content, HttpStatusCode statusCo...
    method DownstreamResponse (line 18) | public DownstreamResponse(HttpResponseMessage response)
    method DownstreamResponse (line 25) | public DownstreamResponse(HttpContent content, HttpStatusCode statusCode,
    method Dispose (line 37) | public void Dispose()
    method Dispose (line 46) | protected virtual void Dispose(bool disposing)

FILE: src/Ocelot/Middleware/Header.cs
  class Header (line 3) | public class Header
    method Header (line 5) | public Header(string key, IEnumerable<string> values)

FILE: src/Ocelot/Middleware/HttpItemsExtensions.cs
  class HttpItemsExtensions (line 8) | public static class HttpItemsExtensions
    method UpsertDownstreamRequest (line 10) | public static void UpsertDownstreamRequest(this IDictionary<object, ob...
    method UpsertDownstreamResponse (line 15) | public static void UpsertDownstreamResponse(this IDictionary<object, o...
    method UpsertDownstreamRoute (line 20) | public static void UpsertDownstreamRoute(this IDictionary<object, obje...
    method UpsertTemplatePlaceholderNameAndValues (line 25) | public static void UpsertTemplatePlaceholderNameAndValues(this IDictio...
    method UpsertDownstreamRoute (line 30) | public static void UpsertDownstreamRoute(this IDictionary<object, obje...
    method UpsertErrors (line 35) | public static void UpsertErrors(this IDictionary<object, object> input...
    method SetError (line 40) | public static void SetError(this IDictionary<object, object> input, Er...
    method SetIInternalConfiguration (line 46) | public static void SetIInternalConfiguration(this IDictionary<object, ...
    method IInternalConfiguration (line 51) | public static IInternalConfiguration IInternalConfiguration(this IDict...
    method Errors (line 56) | public static List<Error> Errors(this IDictionary<object, object> input)
    method DownstreamRouteHolder (line 62) | public static DownstreamRouteFinder.DownstreamRouteHolder
    method TemplatePlaceholderNameAndValues (line 66) | public static List<PlaceholderNameAndValue>
    method DownstreamRequest (line 70) | public static DownstreamRequest DownstreamRequest(this IDictionary<obj...
    method DownstreamResponse (line 73) | public static DownstreamResponse DownstreamResponse(this IDictionary<o...
    method DownstreamRoute (line 76) | public static DownstreamRoute DownstreamRoute(this IDictionary<object,...
    method Get (line 79) | private static T Get<T>(this IDictionary<object, object> input, string...
    method Upsert (line 82) | private static void Upsert<T>(this IDictionary<object, object> input, ...
    method DoesntExist (line 95) | private static bool DoesntExist(this IDictionary<object, object> input...

FILE: src/Ocelot/Middleware/IBaseUrlFinder.cs
  type IBaseUrlFinder (line 3) | public interface IBaseUrlFinder
    method Find (line 5) | string Find();

FILE: src/Ocelot/Middleware/OcelotMiddleware.cs
  class OcelotMiddleware (line 5) | public abstract class OcelotMiddleware
    method OcelotMiddleware (line 7) | protected OcelotMiddleware(IOcelotLogger logger)

FILE: src/Ocelot/Middleware/OcelotMiddlewareExtensions.cs
  class OcelotMiddlewareExtensions (line 18) | public static class OcelotMiddlewareExtensions
    method UseOcelot (line 20) | public static async Task<IApplicationBuilder> UseOcelot(this IApplicat...
    method UseOcelot (line 26) | public static async Task<IApplicationBuilder> UseOcelot(this IApplicat...
    method UseOcelot (line 33) | public static async Task<IApplicationBuilder> UseOcelot(this IApplicat...
    method UseOcelot (line 42) | public static Task<IApplicationBuilder> UseOcelot(this IApplicationBui...
    method UseOcelot (line 45) | public static async Task<IApplicationBuilder> UseOcelot(this IApplicat...
    method CreateOcelotPipeline (line 58) | private static IApplicationBuilder CreateOcelotPipeline(IApplicationBu...
    method CreateConfiguration (line 73) | private static async Task<IInternalConfiguration> CreateConfiguration(...
    method AdministrationApiInUse (line 121) | private static bool AdministrationApiInUse(IAdministrationPath adminPath)
    method SetFileConfig (line 126) | private static async Task SetFileConfig(IFileConfigurationSetter fileC...
    method IsError (line 136) | private static bool IsError(Response response)
    method GetOcelotConfigAndReturn (line 141) | private static IInternalConfiguration GetOcelotConfigAndReturn(IIntern...
    method ThrowToStopOcelotStarting (line 153) | private static void ThrowToStopOcelotStarting(Response config)
    method ConfigureDiagnosticListener (line 158) | private static void ConfigureDiagnosticListener(IApplicationBuilder bu...

FILE: src/Ocelot/Middleware/OcelotPipelineConfiguration.cs
  class OcelotPipelineConfiguration (line 6) | public class OcelotPipelineConfiguration

FILE: src/Ocelot/Middleware/OcelotPipelineExtensions.cs
  class OcelotPipelineExtensions (line 25) | public static class OcelotPipelineExtensions
    method BuildOcelotPipeline (line 27) | public static RequestDelegate BuildOcelotPipeline(this IApplicationBui...
    method UseIfNotNull (line 131) | private static IApplicationBuilder UseIfNotNull(this IApplicationBuild...
    method UseIfNotNull (line 134) | private static IApplicationBuilder UseIfNotNull<TMiddleware>(this IApp...

FILE: src/Ocelot/Middleware/UnauthenticatedError.cs
  class UnauthenticatedError (line 5) | public class UnauthenticatedError : Error
    method UnauthenticatedError (line 7) | public UnauthenticatedError(string message)

FILE: src/Ocelot/Multiplexer/CouldNotFindAggregatorError.cs
  class CouldNotFindAggregatorError (line 5) | public class CouldNotFindAggregatorError : Error
    method CouldNotFindAggregatorError (line 7) | public CouldNotFindAggregatorError(string aggregator)

FILE: src/Ocelot/Multiplexer/IDefinedAggregator.cs
  type IDefinedAggregator (line 6) | public interface IDefinedAggregator
    method Aggregate (line 8) | Task<DownstreamResponse> Aggregate(List<HttpContext> responses);

FILE: src/Ocelot/Multiplexer/IDefinedAggregatorProvider.cs
  type IDefinedAggregatorProvider (line 6) | public interface IDefinedAggregatorProvider
    method Get (line 8) | Response<IDefinedAggregator> Get(Route route);

FILE: src/Ocelot/Multiplexer/IResponseAggregator.cs
  type IResponseAggregator (line 6) | public interface IResponseAggregator
    method Aggregate (line 8) | Task Aggregate(Route route, HttpContext originalContext, List<HttpCont...

FILE: src/Ocelot/Multiplexer/IResponseAggregatorFactory.cs
  type IResponseAggregatorFactory (line 5) | public interface IResponseAggregatorFactory
    method Get (line 7) | IResponseAggregator Get(Route route);

FILE: src/Ocelot/Multiplexer/InMemoryResponseAggregatorFactory.cs
  class InMemoryResponseAggregatorFactory (line 5) | public class InMemoryResponseAggregatorFactory : IResponseAggregatorFactory
    method InMemoryResponseAggregatorFactory (line 10) | public InMemoryResponseAggregatorFactory(IDefinedAggregatorProvider pr...
    method Get (line 16) | public IResponseAggregator Get(Route route)

FILE: src/Ocelot/Multiplexer/MultiplexingMiddleware.cs
  class MultiplexingMiddleware (line 14) | public class MultiplexingMiddleware : OcelotMiddleware
    method MultiplexingMiddleware (line 20) | public MultiplexingMiddleware(RequestDelegate next,
    method Invoke (line 29) | public async Task Invoke(HttpContext httpContext)
    method ShouldProcessSingleRoute (line 79) | private static bool ShouldProcessSingleRoute(HttpContext context, ICol...
    method ProcessSingleRouteAsync (line 89) | protected virtual Task ProcessSingleRouteAsync(HttpContext context, Do...
    method ProcessRoutesAsync (line 100) | private async Task ProcessRoutesAsync(HttpContext context, Route route)
    method ProcessMainRouteAsync (line 116) | private async Task<HttpContext> ProcessMainRouteAsync(HttpContext cont...
    method ProcessRoutesWithRouteKeysAsync (line 131) | protected virtual async Task<HttpContext[]> ProcessRoutesWithRouteKeys...
    method MapResponsesAsync (line 155) | private Task MapResponsesAsync(HttpContext context, Route route, HttpC...
    method ProcessRouteWithComplexAggregation (line 165) | private IEnumerable<Task<HttpContext>> ProcessRouteWithComplexAggregat...
    method ProcessRouteAsync (line 184) | private async Task<HttpContext> ProcessRouteAsync(HttpContext sourceCo...
    method CopyItemsToNewContext (line 197) | private static void CopyItemsToNewContext(HttpContext target, HttpCont...
    method CreateThreadContextAsync (line 211) | protected virtual async Task<HttpContext> CreateThreadContextAsync(Htt...
    method MapAsync (line 251) | protected virtual Task MapAsync(HttpContext httpContext, Route route, ...
    method CloneRequestBodyAsync (line 262) | protected virtual async Task<Stream> CloneRequestBodyAsync(HttpRequest...

FILE: src/Ocelot/Multiplexer/ServiceLocatorDefinedAggregatorProvider.cs
  class ServiceLocatorDefinedAggregatorProvider (line 7) | public class ServiceLocatorDefinedAggregatorProvider : IDefinedAggregato...
    method ServiceLocatorDefinedAggregatorProvider (line 11) | public ServiceLocatorDefinedAggregatorProvider(IServiceProvider services)
    method Get (line 16) | public Response<IDefinedAggregator> Get(Route route)

FILE: src/Ocelot/Multiplexer/SimpleJsonResponseAggregator.cs
  class SimpleJsonResponseAggregator (line 8) | public class SimpleJsonResponseAggregator : IResponseAggregator
    method Aggregate (line 10) | public async Task Aggregate(Route route, HttpContext originalContext, ...
    method MapAggregateContent (line 15) | private static async Task MapAggregateContent(HttpContext originalCont...
    method MapAggregateError (line 83) | private static void MapAggregateError(HttpContext originalContext, Htt...

FILE: src/Ocelot/Multiplexer/UserDefinedResponseAggregator.cs
  class UserDefinedResponseAggregator (line 7) | public class UserDefinedResponseAggregator : IResponseAggregator
    method UserDefinedResponseAggregator (line 11) | public UserDefinedResponseAggregator(IDefinedAggregatorProvider provider)
    method Aggregate (line 16) | public async Task Aggregate(Route route, HttpContext originalContext, ...

FILE: src/Ocelot/QualityOfService/IQosFactory.cs
  type IQoSFactory (line 6) | public interface IQoSFactory
    method Get (line 8) | Response<DelegatingHandler> Get(DownstreamRoute request);

FILE: src/Ocelot/QualityOfService/NoQosDelegatingHandler.cs
  class NoQosDelegatingHandler (line 3) | public class NoQosDelegatingHandler : DelegatingHandler

FILE: src/Ocelot/QualityOfService/QosFactory.cs
  class QoSFactory (line 9) | public class QoSFactory : IQoSFactory
    method QoSFactory (line 15) | public QoSFactory(IServiceProvider serviceProvider, IHttpContextAccess...
    method Get (line 22) | public Response<DelegatingHandler> Get(DownstreamRoute request)

FILE: src/Ocelot/QualityOfService/UnableToFindQoSProviderError.cs
  class UnableToFindQoSProviderError (line 6) | public class UnableToFindQoSProviderError : Error
    method UnableToFindQoSProviderError (line 8) | public UnableToFindQoSProviderError(string message)

FILE: src/Ocelot/QueryStrings/AddQueriesToRequest.cs
  class AddQueriesToRequest (line 10) | public class AddQueriesToRequest : IAddQueriesToRequest
    method AddQueriesToRequest (line 14) | public AddQueriesToRequest(IClaimsParser claimsParser)
    method SetQueriesOnDownstreamRequest (line 19) | public Response SetQueriesOnDownstreamRequest(List<ClaimToThing> claim...
    method ConvertQueryStringToDictionary (line 49) | private static Dictionary<string, StringValues> ConvertQueryStringToDi...
    method ConvertDictionaryToQueryString (line 57) | private static string ConvertDictionaryToQueryString(Dictionary<string...

FILE: src/Ocelot/QueryStrings/ClaimsToQueryStringMiddleware.cs
  class ClaimsToQueryStringMiddleware (line 7) | public class ClaimsToQueryStringMiddleware : OcelotMiddleware
    method ClaimsToQueryStringMiddleware (line 12) | public ClaimsToQueryStringMiddleware(RequestDelegate next,
    method Invoke (line 21) | public async Task Invoke(HttpContext httpContext)

FILE: src/Ocelot/QueryStrings/IAddQueriesToRequest.cs
  type IAddQueriesToRequest (line 8) | public interface IAddQueriesToRequest
    method SetQueriesOnDownstreamRequest (line 10) | Response SetQueriesOnDownstreamRequest(List<ClaimToThing> claimsToThin...

FILE: src/Ocelot/RateLimiting/ClientRequestIdentity.cs
  type ClientRequestIdentity (line 3) | public readonly record struct ClientRequestIdentity(string ClientId, str...

FILE: src/Ocelot/RateLimiting/DistributedCacheRateLimitStorage.cs
  class DistributedCacheRateLimitStorage (line 12) | public class DistributedCacheRateLimitStorage : IRateLimitStorage
    method DistributedCacheRateLimitStorage (line 16) | public DistributedCacheRateLimitStorage(IDistributedCache memoryCache)...
    method Set (line 18) | public void Set(string id, RateLimitCounter counter, TimeSpan expirati...
    method Exists (line 21) | public bool Exists(string id) => !string.IsNullOrEmpty(_memoryCache.Ge...
    method Get (line 23) | public RateLimitCounter? Get(string id)
    method Remove (line 30) | public void Remove(string id) => _memoryCache.Remove(id);

FILE: src/Ocelot/RateLimiting/IRateLimitStorage.cs
  type IRateLimitStorage (line 7) | public interface IRateLimitStorage
    method Exists (line 9) | bool Exists(string id);
    method Get (line 11) | RateLimitCounter? Get(string id);
    method Remove (line 13) | void Remove(string id);
    method Set (line 15) | void Set(string id, RateLimitCounter counter, TimeSpan expirationTime);

FILE: src/Ocelot/RateLimiting/IRateLimiting.cs
  type IRateLimiting (line 9) | public interface IRateLimiting
    method GetStorageKey (line 16) | string GetStorageKey(ClientRequestIdentity identity, RateLimitOptions ...
    method GetHeaders (line 26) | RateLimitHeaders GetHeaders(HttpContext context, RateLimitOptions opti...
    method ProcessRequest (line 36) | RateLimitCounter ProcessRequest(ClientRequestIdentity identity, RateLi...
    method Count (line 45) | RateLimitCounter Count(RateLimitCounter? entry, RateLimitRule rule, Da...
    method RetryAfter (line 55) | double RetryAfter(RateLimitCounter counter, RateLimitRule rule, DateTi...
    method ToTimespan (line 62) | TimeSpan ToTimespan(string timespan);

FILE: src/Ocelot/RateLimiting/MemoryCacheRateLimitStorage.cs
  class MemoryCacheRateLimitStorage (line 11) | public class MemoryCacheRateLimitStorage : IRateLimitStorage
    method MemoryCacheRateLimitStorage (line 15) | public MemoryCacheRateLimitStorage(IMemoryCache memoryCache) => _memor...
    method Set (line 17) | public void Set(string id, RateLimitCounter counter, TimeSpan expirati...
    method Exists (line 20) | public bool Exists(string id) => _memoryCache.TryGetValue(id, out Rate...
    method Get (line 22) | public RateLimitCounter? Get(string id) => _memoryCache.TryGetValue(id...
    method Remove (line 24) | public void Remove(string id) => _memoryCache.Remove(id);

FILE: src/Ocelot/RateLimiting/QuotaExceededError.cs
  class QuotaExceededError (line 5) | public class QuotaExceededError : Error
    method QuotaExceededError (line 7) | public QuotaExceededError(string message, int httpStatusCode)

FILE: src/Ocelot/RateLimiting/RateLimitCounter.cs
  type RateLimitCounter (line 10) | public struct RateLimitCounter
    method RateLimitCounter (line 12) | public RateLimitCounter(DateTime startedAt)
    method RateLimitCounter (line 18) | [JsonConstructor]
    method ToString (line 39) | public override readonly string ToString()

FILE: src/Ocelot/RateLimiting/RateLimitHeaders.cs
  class RateLimitHeaders (line 5) | public class RateLimitHeaders
    method RateLimitHeaders (line 7) | protected RateLimitHeaders() { }
    method RateLimitHeaders (line 9) | public RateLimitHeaders(HttpContext context, long limit, long remainin...
    method ToString (line 41) | public override string ToString() => $"{Remaining}/{Limit} resets at {...

FILE: src/Ocelot/RateLimiting/RateLimiting.cs
  class RateLimiting (line 10) | public class RateLimiting : IRateLimiting
    method RateLimiting (line 18) | public RateLimiting(IRateLimitStorage storage)
    method ProcessRequest (line 31) | public virtual RateLimitCounter ProcessRequest(ClientRequestIdentity i...
    method Count (line 72) | public virtual RateLimitCounter Count(RateLimitCounter? entry, RateLim...
    method GetHeaders (line 92) | public virtual RateLimitHeaders GetHeaders(HttpContext context, RateLi...
    method GetStorageKey (line 111) | public virtual string GetStorageKey(ClientRequestIdentity identity, Ra...
    method RetryAfter (line 127) | public virtual double RetryAfter(RateLimitCounter counter, RateLimitRu...
    method ToTimespan (line 161) | public virtual TimeSpan ToTimespan(string timespan) => RateLimitRule.P...

FILE: src/Ocelot/RateLimiting/RateLimitingHeaders.cs
  class RateLimitingHeaders (line 16) | public static class RateLimitingHeaders

FILE: src/Ocelot/RateLimiting/RateLimitingMiddleware.cs
  class RateLimitingMiddleware (line 12) | public class RateLimitingMiddleware : OcelotMiddleware
    method RateLimitingMiddleware (line 18) | public RateLimitingMiddleware(
    method Invoke (line 30) | public Task Invoke(HttpContext context)
    method Break (line 88) | protected virtual Task Break(HttpContext context, RateLimitOptions opt...
    method Identify (line 98) | protected virtual ClientRequestIdentity Identify(HttpContext context, ...
    method IsWhitelisted (line 110) | public static bool IsWhitelisted(ClientRequestIdentity identity, RateL...
    method LogBlockedRequest (line 113) | public virtual void LogBlockedRequest(HttpContext context, ClientReque...
    method ReturnQuotaExceededResponse (line 121) | public virtual DownstreamResponse ReturnQuotaExceededResponse(HttpCont...
    method GetResponseMessage (line 138) | protected virtual string GetResponseMessage(RateLimitOptions options)
    method SetRateLimitHeaders (line 148) | protected virtual Task SetRateLimitHeaders(object state)

FILE: src/Ocelot/Request/Creator/DownstreamRequestCreator.cs
  class DownstreamRequestCreator (line 6) | public class DownstreamRequestCreator : IDownstreamRequestCreator
    method DownstreamRequestCreator (line 11) | public DownstreamRequestCreator(IFrameworkDescription framework)
    method Create (line 25) | public DownstreamRequest Create(HttpRequestMessage request)

FILE: src/Ocelot/Request/Creator/IDownstreamRequestCreator.cs
  type IDownstreamRequestCreator (line 5) | public interface IDownstreamRequestCreator
    method Create (line 7) | DownstreamRequest Create(HttpRequestMessage request);

FILE: src/Ocelot/Request/Mapper/IRequestMapper.cs
  type IRequestMapper (line 6) | public interface IRequestMapper
    method Map (line 8) | HttpRequestMessage Map(HttpRequest request, DownstreamRoute downstream...

FILE: src/Ocelot/Request/Mapper/PayloadTooLargeError.cs
  class PayloadTooLargeError (line 5) | public class PayloadTooLargeError : Error
    method PayloadTooLargeError (line 7) | public PayloadTooLargeError(Exception exception) : base(exception.Mess...

FILE: src/Ocelot/Request/Mapper/RequestMapper.cs
  class RequestMapper (line 8) | public class RequestMapper : IRequestMapper
    method Map (line 13) | public HttpRequestMessage Map(HttpRequest request, DownstreamRoute dow...
    method MapContent (line 28) | private static HttpContent MapContent(HttpRequest request)
    method AddContentHeaders (line 48) | private static void AddContentHeaders(HttpRequest request, HttpContent...
    method MapMethod (line 71) | private static HttpMethod MapMethod(HttpRequest request, DownstreamRou...
    method MapUri (line 76) | private static Uri MapUri(HttpRequest request) => new(request.GetEncod...
    method MapHeaders (line 78) | private static void MapHeaders(HttpRequest request, HttpRequestMessage...
    method IsSupportedHeader (line 89) | private static bool IsSupportedHeader(KeyValuePair<string, StringValue...

FILE: src/Ocelot/Request/Mapper/StreamHttpContent.cs
  class StreamHttpContent (line 6) | public class StreamHttpContent : HttpContent
    method StreamHttpContent (line 13) | public StreamHttpContent(HttpContext context)
    method SerializeToStreamAsync (line 19) | protected override Task SerializeToStreamAsync(Stream stream, Transpor...
    method SerializeToStreamAsync (line 22) | protected override Task SerializeToStreamAsync(Stream stream, Transpor...
    method TryComputeLength (line 25) | protected override bool TryComputeLength(out long length)
    method CreateContentReadStreamAsync (line 32) | protected override Task<Stream> CreateContentReadStreamAsync()
    method CopyAsync (line 38) | private static async Task CopyAsync(Stream input, Stream output, long ...

FILE: src/Ocelot/Request/Mapper/UnmappableRequestError.cs
  class UnmappableRequestError (line 5) | public class UnmappableRequestError : Error
    method UnmappableRequestError (line 7) | public UnmappableRequestError(Exception exception) : base($"Error when...

FILE: src/Ocelot/Request/Middleware/DownstreamRequest.cs
  class DownstreamRequest (line 5) | public class DownstreamRequest
    method DownstreamRequest (line 9) | public DownstreamRequest() { }
    method DownstreamRequest (line 11) | public DownstreamRequest(HttpRequestMessage request)
    method ToHttpRequestMessage (line 43) | public HttpRequestMessage ToHttpRequestMessage()
    method ToUri (line 59) | public string ToUri()
    method ToString (line 73) | public override string ToString()
    method RemoveLeadingQuestionMark (line 78) | private static string RemoveLeadingQuestionMark(string query)

FILE: src/Ocelot/Request/Middleware/DownstreamRequestInitialiserMiddleware.cs
  class DownstreamRequestInitialiserMiddleware (line 9) | public class DownstreamRequestInitialiserMiddleware : OcelotMiddleware
    method DownstreamRequestInitialiserMiddleware (line 15) | public DownstreamRequestInitialiserMiddleware(RequestDelegate next,
    method Invoke (line 26) | public async Task Invoke(HttpContext httpContext)

FILE: src/Ocelot/RequestId/DefaultRequestIdKey.cs
  class DefaultRequestIdKey (line 3) | public static class DefaultRequestIdKey

FILE: src/Ocelot/RequestId/Middleware/RequestIdMiddleware.cs
  class RequestIdMiddleware (line 11) | public class RequestIdMiddleware : OcelotMiddleware
    method RequestIdMiddleware (line 19) | public RequestIdMiddleware(RequestDelegate next,
    method Invoke (line 28) | public async Task Invoke(HttpContext httpContext)
    method SetOcelotRequestId (line 34) | private void SetOcelotRequestId(HttpContext httpContext)
    method ShouldAddRequestId (line 66) | private static bool ShouldAddRequestId(RequestId requestId, HttpHeader...
    method RequestIdInHeaders (line 73) | private static bool RequestIdInHeaders(RequestId requestId, HttpHeader...
    method AddRequestIdHeader (line 78) | private static void AddRequestIdHeader(RequestId requestId, Downstream...

FILE: src/Ocelot/RequestId/RequestId.cs
  class RequestId (line 3) | public class RequestId
    method RequestId (line 5) | public RequestId(string requestIdKey, string requestIdValue)

FILE: src/Ocelot/Requester/ConnectionToDownstreamServiceError.cs
  class ConnectionToDownstreamServiceError (line 5) | public class ConnectionToDownstreamServiceError : Error
    method ConnectionToDownstreamServiceError (line 7) | public ConnectionToDownstreamServiceError(Exception exception)

FILE: src/Ocelot/Requester/DelegatingHandlerFactory.cs
  class DelegatingHandlerFactory (line 8) | public class DelegatingHandlerFactory : IDelegatingHandlerFactory
    method DelegatingHandlerFactory (line 15) | public DelegatingHandlerFactory(
    method Get (line 27) | public List<DelegatingHandler> Get(DownstreamRoute route)
    method SortByConfigOrder (line 75) | private static DelegatingHandler[] SortByConfigOrder(DownstreamRoute r...
    method GlobalIsInHandlersConfig (line 87) | private static bool GlobalIsInHandlersConfig(DownstreamRoute request, ...

FILE: src/Ocelot/Requester/GlobalDelegatingHandler.cs
  class GlobalDelegatingHandler (line 3) | public class GlobalDelegatingHandler
    method GlobalDelegatingHandler (line 5) | public GlobalDelegatingHandler(DelegatingHandler delegatingHandler)

FILE: src/Ocelot/Requester/HttpExceptionToErrorMapper.cs
  class HttpExceptionToErrorMapper (line 8) | public class HttpExceptionToErrorMapper : IExceptionToErrorMapper
    method HttpExceptionToErrorMapper (line 13) | public HttpExceptionToErrorMapper(IServiceProvider serviceProvider)
    method Map (line 18) | public Error Map(Exception exception)

FILE: src/Ocelot/Requester/IDelegatingHandlerFactory.cs
  type IDelegatingHandlerFactory (line 5) | public interface IDelegatingHandlerFactory
    method Get (line 7) | List<DelegatingHandler> Get(DownstreamRoute route);

FILE: src/Ocelot/Requester/IExceptionToErrorMapper.cs
  type IExceptionToErrorMapper (line 5) | public interface IExceptionToErrorMapper
    method Map (line 7) | Error Map(Exception exception);

FILE: src/Ocelot/Requester/IHttpRequester.cs
  type IHttpRequester (line 6) | public interface IHttpRequester
    method GetResponse (line 8) | Task<Response<HttpResponseMessage>> GetResponse(HttpContext httpContext);

FILE: src/Ocelot/Requester/IMessageInvokerPool.cs
  type IMessageInvokerPool (line 12) | public interface IMessageInvokerPool
    method Get (line 19) | HttpMessageInvoker Get(DownstreamRoute downstreamRoute);
    method Clear (line 24) | void Clear();

FILE: src/Ocelot/Requester/MessageInvokerHttpRequester.cs
  class MessageInvokerHttpRequester (line 8) | public class MessageInvokerHttpRequester : IHttpRequester
    method MessageInvokerHttpRequester (line 14) | public MessageInvokerHttpRequester(IOcelotLoggerFactory loggerFactory,
    method GetResponse (line 28) | public async Task<Response<HttpResponseMessage>> GetResponse(HttpConte...

FILE: src/Ocelot/Requester/MessageInvokerPool.cs
  class MessageInvokerPool (line 8) | public class MessageInvokerPool : IMessageInvokerPool
    method MessageInvokerPool (line 14) | public MessageInvokerPool(
    method Get (line 26) | public virtual HttpMessageInvoker Get(DownstreamRoute downstreamRoute)
    method Clear (line 37) | public virtual void Clear() => _handlersPool.Clear();
    method CreateMessageInvoker (line 39) | protected HttpMessageInvoker CreateMessageInvoker(DownstreamRoute route)
    method EnsureRouteTimeoutIsGreaterThanQosOne (line 68) | protected virtual int EnsureRouteTimeoutIsGreaterThanQosOne(Downstream...
    method EqualitySentence (line 86) | public static string EqualitySentence(int left, int right)
    method CreateHandler (line 89) | protected virtual SocketsHttpHandler CreateHandler(DownstreamRoute route)
    type MessageInvokerCacheKey (line 120) | public readonly struct MessageInvokerCacheKey : IEquatable<MessageInvo...
      method MessageInvokerCacheKey (line 122) | public MessageInvokerCacheKey(DownstreamRoute route) => Route = route;
      method Equals (line 126) | public override bool Equals(object obj) => obj is MessageInvokerCach...
      method Equals (line 128) | public bool Equals(MessageInvokerCacheKey other) =>
      method GetHashCode (line 131) | public override int GetHashCode() => Route.GetHashCode();

FILE: src/Ocelot/Requester/Middleware/HttpRequesterMiddleware.cs
  class HttpRequesterMiddleware (line 8) | public class HttpRequesterMiddleware : OcelotMiddleware
    method HttpRequesterMiddleware (line 13) | public HttpRequesterMiddleware(RequestDelegate next,
    method Invoke (line 22) | public async Task Invoke(HttpContext httpContext)
    method CreateLogBasedOnResponse (line 40) | private void CreateLogBasedOnResponse(Response<HttpResponseMessage> re...

FILE: src/Ocelot/Requester/RequestCanceledError.cs
  class RequestCanceledError (line 5) | public class RequestCanceledError : Error
    method RequestCanceledError (line 15) | public RequestCanceledError(string message)

FILE: src/Ocelot/Requester/ServiceCollectionExtensions.cs
  class ServiceCollectionExtensions (line 5) | public static class ServiceCollectionExtensions
    method AddOcelotMessageInvokerPool (line 7) | public static void AddOcelotMessageInvokerPool(this IServiceCollection...

FILE: src/Ocelot/Requester/TimeoutDelegatingHandler.cs
  class TimeoutDelegatingHandler (line 10) | public class TimeoutDelegatingHandler : DelegatingHandler
    method TimeoutDelegatingHandler (line 18) | public TimeoutDelegatingHandler(TimeSpan timeout)
    method SendAsync (line 23) | protected override async Task<HttpResponseMessage> SendAsync(HttpReque...

FILE: src/Ocelot/Requester/UnableToCompleteRequestError.cs
  class UnableToCompleteRequestError (line 5) | public class UnableToCompleteRequestError : Error
    method UnableToCompleteRequestError (line 7) | public UnableToCompleteRequestError(Exception exception)

FILE: src/Ocelot/Responder/ErrorsToHttpStatusCodeMapper.cs
  class ErrorsToHttpStatusCodeMapper (line 6) | public class ErrorsToHttpStatusCodeMapper : IErrorsToHttpStatusCodeMapper
    method Map (line 8) | public int Map(List<Error> errors)

FILE: src/Ocelot/Responder/HttpContextResponder.cs
  class HttpContextResponder (line 12) | public class HttpContextResponder : IHttpResponder
    method HttpContextResponder (line 16) | public HttpContextResponder(IRemoveOutputHeaders removeOutputHeaders)
    method SetResponseOnHttpContext (line 21) | public async Task SetResponseOnHttpContext(HttpContext context, Downst...
    method SetErrorResponseOnContext (line 59) | public void SetErrorResponseOnContext(HttpContext context, int statusC...
    method SetErrorResponseOnContext (line 64) | public async Task SetErrorResponseOnContext(HttpContext context, Downs...
    method WriteToUpstreamAsync (line 78) | protected virtual async Task WriteToUpstreamAsync(HttpContext context,...
    method SetStatusCode (line 84) | private static void SetStatusCode(HttpContext context, int statusCode)
    method AddHeaderIfDoesntExist (line 92) | private static void AddHeaderIfDoesntExist(HttpContext context, Header...

FILE: src/Ocelot/Responder/IErrorsToHttpStatusCodeMapper.cs
  type IErrorsToHttpStatusCodeMapper (line 8) | public interface IErrorsToHttpStatusCodeMapper
    method Map (line 15) | int Map(List<Error> errors);

FILE: src/Ocelot/Responder/IHttpResponder.cs
  type IHttpResponder (line 6) | public interface IHttpResponder
    method SetResponseOnHttpContext (line 8) | Task SetResponseOnHttpContext(HttpContext context, DownstreamResponse ...
    method SetErrorResponseOnContext (line 10) | void SetErrorResponseOnContext(HttpContext context, int statusCode);
    method SetErrorResponseOnContext (line 12) | Task SetErrorResponseOnContext(HttpContext context, DownstreamResponse...

FILE: src/Ocelot/Responder/Middleware/ResponderMiddleware.cs
  class ResponderMiddleware (line 12) | public class ResponderMiddleware : OcelotMiddleware
    method ResponderMiddleware (line 18) | public ResponderMiddleware(RequestDelegate next,
    method Invoke (line 29) | public async Task Invoke(HttpContext context)
    method SetErrorResponse (line 54) | private async Task SetErrorResponse(HttpContext context, List<Error> e...

FILE: src/Ocelot/Responses/ErrorResponse.cs
  class ErrorResponse (line 5) | public class ErrorResponse : Response
    method ErrorResponse (line 7) | public ErrorResponse(Error error)
    method ErrorResponse (line 11) | public ErrorResponse(List<Error> errors)
    method ErrorResponse (line 18) | public ErrorResponse(Error error)
    method ErrorResponse (line 22) | public ErrorResponse(List<Error> errors)
  class ErrorResponse (line 16) | public class ErrorResponse<T> : Response<T>
    method ErrorResponse (line 7) | public ErrorResponse(Error error)
    method ErrorResponse (line 11) | public ErrorResponse(List<Error> errors)
    method ErrorResponse (line 18) | public ErrorResponse(Error error)
    method ErrorResponse (line 22) | public ErrorResponse(List<Error> errors)

FILE: src/Ocelot/Responses/OkResponse.cs
  class OkResponse (line 3) | public class OkResponse : Response
    method OkResponse (line 5) | public OkResponse() { }
    method OkResponse (line 10) | public OkResponse(T data) : base(data) { }
  class OkResponse (line 8) | public class OkResponse<T> : Response<T>
    method OkResponse (line 5) | public OkResponse() { }
    method OkResponse (line 10) | public OkResponse(T data) : base(data) { }

FILE: src/Ocelot/Responses/Response.cs
  class Response (line 5) | public abstract class Response
    method Response (line 7) | protected Response()
    method Response (line 12) | protected Response(List<Error> errors)
    method Response (line 24) | protected Response(T data)
    method Response (line 29) | protected Response(List<Error> errors) : base(errors)
  class Response (line 22) | public abstract class Response<T> : Response
    method Response (line 7) | protected Response()
    method Response (line 12) | protected Response(List<Error> errors)
    method Response (line 24) | protected Response(T data)
    method Response (line 29) | protected Response(List<Error> errors) : base(errors)

FILE: src/Ocelot/Security/IPSecurity/IPSecurityPolicy.cs
  class IPSecurityPolicy (line 8) | public class IPSecurityPolicy : ISecurityPolicy
    method Security (line 10) | public Response Security(DownstreamRoute downstreamRoute, HttpContext ...
    method SecurityAsync (line 40) | public Task<Response> SecurityAsync(DownstreamRoute downstreamRoute, H...

FILE: src/Ocelot/Security/ISecurityPolicy.cs
  type ISecurityPolicy (line 7) | public interface ISecurityPolicy
    method Security (line 9) | Response Security(DownstreamRoute downstreamRoute, HttpContext context);
    method SecurityAsync (line 10) | Task<Response> SecurityAsync(DownstreamRoute downstreamRoute, HttpCont...

FILE: src/Ocelot/Security/Middleware/SecurityMiddleware.cs
  class SecurityMiddleware (line 7) | public class SecurityMiddleware : OcelotMiddleware
    method SecurityMiddleware (line 12) | public SecurityMiddleware(RequestDelegate next,
    method Invoke (line 21) | public async Task Invoke(HttpContext httpContext)

FILE: src/Ocelot/ServiceDiscovery/Configuration/ServiceFabricConfiguration.cs
  class ServiceFabricConfiguration (line 3) | public class ServiceFabricConfiguration
    method ServiceFabricConfiguration (line 5) | public ServiceFabricConfiguration(string hostName, int port, string se...

FILE: src/Ocelot/ServiceDiscovery/IServiceDiscoveryProviderFactory.cs
  type IServiceDiscoveryProviderFactory (line 7) | public interface IServiceDiscoveryProviderFactory
    method Get (line 9) | Response<IServiceDiscoveryProvider> Get(ServiceProviderConfiguration s...

FILE: src/Ocelot/ServiceDiscovery/Providers/ConfigurationServiceProvider.cs
  class ConfigurationServiceProvider (line 5) | public class ConfigurationServiceProvider : IServiceDiscoveryProvider
    method ConfigurationServiceProvider (line 9) | public ConfigurationServiceProvider(List<Service> services) => _servic...
    method GetAsync (line 11) | public Task<List<Service>> GetAsync() => ValueTask.FromResult(_service...

FILE: src/Ocelot/ServiceDiscovery/Providers/IServiceDiscoveryProvider.cs
  type IServiceDiscoveryProvider (line 5) | public interface IServiceDiscoveryProvider
    method GetAsync (line 7) | Task<List<Service>> GetAsync();

FILE: src/Ocelot/ServiceDiscovery/Providers/ServiceFabricServiceDiscoveryProvider.cs
  class ServiceFabricServiceDiscoveryProvider (line 6) | public class ServiceFabricServiceDiscoveryProvider : IServiceDiscoveryPr...
    method ServiceFabricServiceDiscoveryProvider (line 12) | public ServiceFabricServiceDiscoveryProvider(ServiceFabricConfiguratio...
    method GetAsync (line 17) | public Task<List<Service>> GetAsync()

FILE: src/Ocelot/ServiceDiscovery/ServiceDiscoveryProviderFactory.cs
  class ServiceDiscoveryProviderFactory (line 11) | public class ServiceDiscoveryProviderFactory : IServiceDiscoveryProvider...
    method ServiceDiscoveryProviderFactory (line 17) | public ServiceDiscoveryProviderFactory(IOcelotLoggerFactory factory, I...
    method Get (line 24) | public Response<IServiceDiscoveryProvider> Get(ServiceProviderConfigur...
    method GetServiceDiscoveryProvider (line 44) | private Response<IServiceDiscoveryProvider> GetServiceDiscoveryProvide...

FILE: src/Ocelot/ServiceDiscovery/UnableToFindServiceDiscoveryProviderError.cs
  class UnableToFindServiceDiscoveryProviderError (line 5) | public class UnableToFindServiceDiscoveryProviderError : Error
    method UnableToFindServiceDiscoveryProviderError (line 7) | public UnableToFindServiceDiscoveryProviderError(string message) : bas...

FILE: src/Ocelot/Values/DownstreamPath.cs
  class DownstreamPath (line 3) | public class DownstreamPath
    method DownstreamPath (line 5) | public DownstreamPath(string value)

FILE: src/Ocelot/Values/DownstreamPathTemplate.cs
  class DownstreamPathTemplate (line 3) | public class DownstreamPathTemplate
    method DownstreamPathTemplate (line 5) | public DownstreamPathTemplate(string value)
    method ToString (line 12) | public override string ToString() => Value ?? string.Empty;

FILE: src/Ocelot/Values/Service.cs
  class Service (line 3) | public class Service
    method Service (line 5) | public Service(string name,

FILE: src/Ocelot/Values/ServiceHostAndPort.cs
  class ServiceHostAndPort (line 3) | public class ServiceHostAndPort : IEquatable<ServiceHostAndPort>
    method ServiceHostAndPort (line 5) | public ServiceHostAndPort(ServiceHostAndPort from)
    method ServiceHostAndPort (line 12) | public ServiceHostAndPort(string downstreamHost, int downstreamPort)
    method ServiceHostAndPort (line 18) | public ServiceHostAndPort(string downstreamHost, int downstreamPort, s...
    method ToString (line 25) | public override string ToString()
    method GetHashCode (line 27) | public override int GetHashCode()
    method Equals (line 30) | public bool Equals(ServiceHostAndPort other) => this == other;
    method Equals (line 31) | public override bool Equals(object obj)

FILE: src/Ocelot/Values/UpstreamHeaderTemplate.cs
  class UpstreamHeaderTemplate (line 9) | public class UpstreamHeaderTemplate
    method UpstreamHeaderTemplate (line 15) | public UpstreamHeaderTemplate(string template, string originalValue)

FILE: src/Ocelot/Values/UpstreamPathTemplate.cs
  class UpstreamPathTemplate (line 6) | public partial class UpstreamPathTemplate
    method RegexNoTemplate (line 8) | [GeneratedRegex("$^", RegexOptions.Singleline, RegexGlobal.DefaultMatc...
    method UpstreamPathTemplate (line 11) | public UpstreamPathTemplate(string template, int priority, bool contai...

FILE: src/Ocelot/WebSockets/ClientWebSocketConnector.cs
  class ClientWebSocketConnector (line 5) | public class ClientWebSocketConnector : IClientWebSocketConnector
    method ClientWebSocketConnector (line 10) | public ClientWebSocketConnector(ClientWebSocket webSocket)
    method ToWebSocket (line 16) | public WebSocket ToWebSocket() => _webSocket;
    method ConnectAsync (line 20) | public Task ConnectAsync(Uri uri, CancellationToken cancellationToken)

FILE: src/Ocelot/WebSockets/ClientWebSocketOptionsProxy.cs
  class ClientWebSocketOptionsProxy (line 7) | public class ClientWebSocketOptionsProxy : IClientWebSocketOptions
    method ClientWebSocketOptionsProxy (line 11) | public ClientWebSocketOptionsProxy(ClientWebSocketOptions options)
    method AddSubProtocol (line 29) | public void AddSubProtocol(string subProtocol) => _real.AddSubProtocol...
    method SetBuffer (line 30) | public void SetBuffer(int receiveBufferSize, int sendBufferSize) => _r...
    method SetBuffer (line 31) | public void SetBuffer(int receiveBufferSize, int sendBufferSize, Array...
    method SetRequestHeader (line 32) | public void SetRequestHeader(string headerName, string headerValue) =>...

FILE: src/Ocelot/WebSockets/ClientWebSocketProxy.cs
  class ClientWebSocketProxy (line 5) | public sealed class ClientWebSocketProxy : WebSocket, IClientWebSocket
    method ClientWebSocketProxy (line 11) | public ClientWebSocketProxy(WebSocket socket, IClientWebSocketConnecto...
    method ToWebSocket (line 18) | public WebSocket ToWebSocket() => _realSocket;
    method ConnectAsync (line 20) | public Task ConnectAsync(Uri uri, CancellationToken cancellationToken)
    method Abort (line 32) | public override void Abort() => _realSocket.Abort();
    method CloseAsync (line 34) | public override Task CloseAsync(WebSocketCloseStatus closeStatus, stri...
    method CloseOutputAsync (line 37) | public override Task CloseOutputAsync(WebSocketCloseStatus closeStatus...
    method Dispose (line 40) | public override void Dispose() => _realSocket.Dispose();
    method ReceiveAsync (line 42) | public override Task<WebSocketReceiveResult> ReceiveAsync(ArraySegment...
    method SendAsync (line 45) | public override Task SendAsync(ArraySegment<byte> buffer, WebSocketMes...

FILE: src/Ocelot/WebSockets/IClientWebSocket.cs
  type IClientWebSocket (line 5) | public interface IClientWebSocket : IClientWebSocketConnector
    method Abort (line 12) | void Abort();
    method CloseAsync (line 13) | Task CloseAsync(WebSocketCloseStatus closeStatus, string statusDescrip...
    method CloseOutputAsync (line 14) | Task CloseOutputAsync(WebSocketCloseStatus closeStatus, string statusD...
    method Dispose (line 15) | void Dispose();
    method ReceiveAsync (line 16) | Task<WebSocketReceiveResult> ReceiveAsync(ArraySegment<byte> buffer, C...
    method SendAsync (line 17) | Task SendAsync(ArraySegment<byte> buffer, WebSocketMessageType message...
  type IClientWebSocketConnector (line 20) | public interface IClientWebSocketConnector
    method ToWebSocket (line 22) | WebSocket ToWebSocket();
    method ConnectAsync (line 24) | Task ConnectAsync(Uri uri, CancellationToken cancellationToken);

FILE: src/Ocelot/WebSockets/IClientWebSocketOptions.cs
  type IClientWebSocketOptions (line 7) | public interface IClientWebSocketOptions
    method SetRequestHeader (line 11) | void SetRequestHeader(string headerName, string headerValue);
    method AddSubProtocol (line 18) | void AddSubProtocol(string subProtocol);
    method SetBuffer (line 21) | void SetBuffer(int receiveBufferSize, int sendBufferSize);
    method SetBuffer (line 22) | void SetBuffer(int receiveBufferSize, int sendBufferSize, ArraySegment...

FILE: src/Ocelot/WebSockets/IWebSocketsFactory.cs
  type IWebSocketsFactory (line 3) | public interface IWebSocketsFactory
    method CreateClient (line 5) | IClientWebSocket CreateClient();

FILE: src/Ocelot/WebSockets/WebSocketsFactory.cs
  class WebSocketsFactory (line 5) | public class WebSocketsFactory : IWebSocketsFactory
    method CreateClient (line 7) | public IClientWebSocket CreateClient()

FILE: src/Ocelot/WebSockets/WebSocketsProxyMiddleware.cs
  class WebSocketsProxyMiddleware (line 14) | public class WebSocketsProxyMiddleware : OcelotMiddleware
    method WebSocketsProxyMiddleware (line 29) | public WebSocketsProxyMiddleware(IOcelotLoggerFactory logging,
    method Invoke (line 38) | public async Task Invoke(HttpContext context)
    method PumpAsync (line 45) | protected virtual async Task PumpAsync(WebSocket source, WebSocket des...
    method Proxy (line 87) | private async Task Proxy(HttpContext context, DownstreamRequest reques...
    method TryCloseOutputAsync (line 150) | protected virtual Task TryCloseOutputAsync(WebSocket webSocket, WebSoc...

FILE: test/Ocelot.AcceptanceTests/Administration/AdministrationSteps.cs
  class AdministrationSteps (line 6) | public sealed class AdministrationSteps : AuthenticationSteps
    method GivenThereIsOcelotInternalJwtAuthServiceRunning (line 8) | private Task GivenThereIsOcelotInternalJwtAuthServiceRunning(Cancellat...

FILE: test/Ocelot.AcceptanceTests/Administration/CacheManagerTests.cs
  class CacheManagerTests (line 14) | public sealed class CacheManagerTests : AuthenticationSteps
    method CacheManagerTests (line 16) | public CacheManagerTests() : base()
    method ShouldClearCacheRegionViaAdministrationAPI (line 19) | [Fact(
    method GivenRoute (line 64) | private FileRoute GivenRoute(string upstream = null, FileCacheOptions ...
    method WithCacheManagerAndAdministrationForExternalJwtServer (line 74) | private void WithCacheManagerAndAdministrationForExternalJwtServer(ISe...
    method Dispose (line 91) | public override void Dispose()

FILE: test/Ocelot.AcceptanceTests/Administration/OcelotBuilderExtensions.cs
  class OcelotBuilderExtensions (line 22) | public static class OcelotBuilderExtensions
    method AddAdministration (line 24) | public static IOcelotBuilder AddAdministration(this IOcelotBuilder bui...
    method GetOcelotMiddlewareConfiguration (line 41) | public static Task GetOcelotMiddlewareConfiguration(IApplicationBuilde...
    method AddOcelotAdministrationControllers (line 58) | public static void AddOcelotAdministrationControllers(this IApplicatio...
    method UseOcelotJwtServer (line 68) | public static IApplicationBuilder UseOcelotJwtServer(this IApplication...
    method GetIdentityServerConfiguration (line 77) | public static IdentityServerConfiguration GetIdentityServerConfigurati...
    method AddAdministration (line 92) | public static IOcelotBuilder AddAdministration(this IOcelotBuilder bui...
  class IdentityServerConfiguration (line 156) | public class IdentityServerConfiguration
    method IdentityServerConfiguration (line 158) | public IdentityServerConfiguration(

FILE: test/Ocelot.AcceptanceTests/AggregateTests.cs
  class AggregateTests (line 22) | public sealed class AggregateTests : Steps
    method AggregateTests (line 26) | public AggregateTests()
    method Should_fix_issue_597 (line 31) | [Fact]
    method Should_return_response_200_with_advanced_aggregate_configs (line 134) | [Fact]
    method Should_return_response_200_with_simple_url_user_defined_aggregate (line 228) | [Fact]
    method Should_return_response_200_with_simple_url (line 296) | [Fact]
    method Should_return_response_200_with_simple_url_one_service_404 (line 316) | [Fact]
    method Should_return_response_200_with_simple_url_both_service_404 (line 382) | [Fact]
    method Should_be_thread_safe (line 448) | [Fact]
    method WhenIMakeLotsOfDifferentRequestsToTheApiGateway (line 510) | private void WhenIMakeLotsOfDifferentRequestsToTheApiGateway()
    method Fire (line 543) | private async Task Fire(string url, string expectedBody, Random random)
    method Should_return_response_200_with_copied_body_sent_on_multiple_services (line 634) | [Fact]
    method Should_return_response_200_with_copied_form_sent_on_multiple_services (line 658) | [Fact]
    method FormatFormCollection (line 688) | private static string FormatFormCollection(IFormCollection reqForm)
    method GivenServiceIsRunning (line 703) | private void GivenServiceIsRunning(int port, HttpStatusCode statusCode...
    method GivenServiceIsRunning (line 712) | private void GivenServiceIsRunning(int index, int port, string basePat...
    method GivenServiceIsRunning (line 719) | private void GivenServiceIsRunning(int index, int port, string basePat...
    method GivenServiceIsRunning (line 728) | private void GivenServiceIsRunning(int index, int port, string basePat...
    method GivenServiceIsRunning (line 736) | private void GivenServiceIsRunning(int index, int port, string basePat...
    method GivenOcelotIsRunningWithSpecificAggregatorsRegisteredInDi (line 757) | private void GivenOcelotIsRunningWithSpecificAggregatorsRegisteredInDi...
    method ThenTheDownstreamUrlPathShouldBe (line 768) | private void ThenTheDownstreamUrlPathShouldBe(string expectedDownstrea...
    method GivenRoute (line 774) | private static FileRoute GivenRoute(int port, string upstream, string ...
    method GivenConfiguration (line 784) | public override FileConfiguration GivenConfiguration(params FileRoute[...
  class FakeDep (line 799) | public class FakeDep
  class FakeDefinedAggregator (line 803) | public class FakeDefinedAggregator : IDefinedAggregator
    method FakeDefinedAggregator (line 805) | public FakeDefinedAggregator(FakeDep dep)
    method Aggregate (line 809) | public async Task<DownstreamResponse> Aggregate(List<HttpContext> resp...

FILE: test/Ocelot.AcceptanceTests/Authentication/AuthenticationTests.cs
  class AuthenticationTests (line 9) | public sealed class AuthenticationTests : AuthenticationSteps
    method AuthenticationTests (line 11) | public AuthenticationTests()
    method Should_return_401_using_identity_server_access_token (line 14) | [Fact]
    method Should_return_response_200_using_identity_server (line 29) | [Fact]
    method Should_return_response_401_using_identity_server_with_token_requested_for_other_api (line 47) | [Fact]
    method Should_return_201_using_identity_server_access_token (line 76) | [Fact]
    method Should_use_global_authentication (line 92) | [Theory]
    method Should_allow_anonymous_route_and_return_200_when_global_auth_options_and_no_token (line 119) | [Fact]
    method ShouldApplyGlobalAuthenticationOptions_ForStaticRoutes (line 142) | [Fact]
    method ShouldApplyGlobalGroupAuthenticationOptions_ForStaticRoutes_WhenRouteOptsHasAKey (line 190) | [Fact]

FILE: test/Ocelot.AcceptanceTests/Authentication/MultipleAuthSchemesFeatureTests.cs
  class MultipleAuthSchemesFeatureTests (line 12) | [Trait("PR", "1870")] // https://github.com/ThreeMammals/Ocelot/pull/1870
    method MultipleAuthSchemesFeatureTests (line 20) | public MultipleAuthSchemesFeatureTests() : base()
    method Setup (line 26) | private MultipleAuthSchemesFeatureTests Setup(int totalSchemes)
    method Should_authenticate_using_multiple_schemes (line 33) | [Theory]
    method GivenIHaveTokenWithScope (line 58) | private async Task GivenIHaveTokenWithScope(int index, string scope, [...
    method GivenIHaveAddedAllAuthHeaders (line 64) | private void GivenIHaveAddedAllAuthHeaders(string[] schemes)
    method AuthHeaderName (line 79) | private static string AuthHeaderName(string scheme) => $"Oc-{HeaderNam...
    method WithBearerOptions (line 81) | private void WithBearerOptions(JwtBearerOptions o, string scheme, stri...
    method GivenOcelotIsRunningWithIdentityServerAuthSchemes (line 114) | private void GivenOcelotIsRunningWithIdentityServerAuthSchemes(string ...

FILE: test/Ocelot.AcceptanceTests/Authorization/AuthorizationSteps.cs
  class AuthorizationSteps (line 6) | public class AuthorizationSteps : AuthenticationSteps
    method GivenIUpdateSubClaim (line 8) | public void GivenIUpdateSubClaim() => AuthTokenRequesting += UpdateSub...
    method UpdateSubClaim (line 10) | protected virtual void UpdateSubClaim(object sender, AuthenticationTok...
    method GivenIHaveATokenWithScope (line 17) | public Task<BearerToken> GivenIHaveATokenWithScope(string scope, [Call...
    method GivenIHaveATokenWithClaims (line 19) | public Task<BearerToken> GivenIHaveATokenWithClaims(IEnumerable<KeyVal...

FILE: test/Ocelot.AcceptanceTests/Authorization/AuthorizationTests.cs
  class AuthorizationTests (line 7) | public sealed class AuthorizationTests : AuthorizationSteps
    method GivenRouteClaimsRequirement (line 9) | private static Dictionary<string, string> GivenRouteClaimsRequirement(...
    method Should_return_200_OK_authorizing_route (line 37) | [Fact]
    method Should_return_403_Forbidden_authorizing_route (line 60) | [Fact]
    method Should_return_200_OK_using_identity_server_with_allowed_scope (line 84) | [Fact]
    method Should_return_403_Forbidden_using_identity_server_with_scope_not_allowed (line 107) | [Fact]
    method Should_fix_issue_240 (line 137) | [Fact(DisplayName = "TODO " + nameof(Should_fix_issue_240))]
    method Should_return_200_OK_with_global_allowed_scopes (line 169) | [Fact]
    method Should_return_200_OK_with_space_separated_scope_match (line 194) | [Fact]
    method Should_return_403_Forbidden_with_space_separated_scope_no_match (line 214) | [Fact]

FILE: test/Ocelot.AcceptanceTests/Caching/CachingTests.cs
  class CachingTests (line 8) | public sealed class CachingTests : Steps
    method CachingTests (line 14) | public CachingTests()
    method Should_return_cached_response (line 18) | [Fact]
    method Should_return_cached_response_with_expires_header (line 42) | [Fact]
    method Should_not_return_cached_response_as_ttl_expires (line 67) | [Fact]
    method Should_return_different_cached_response_when_request_body_changes_and_EnableContentHashing_is_true (line 91) | [Theory]
    method Should_return_same_cached_response_when_request_body_changes_and_EnableContentHashing_is_false (line 126) | [Theory]
    method Should_clean_cached_response_by_cache_header_via_new_caching_key (line 160) | [Fact]
    method GivenFileConfiguration (line 199) | private FileConfiguration GivenFileConfiguration(int port, FileCacheOp...
    method GivenTheCacheExpires (line 215) | private static void GivenTheCacheExpires()
    method GivenTheServiceNowReturns (line 220) | private void GivenTheServiceNowReturns(int port, HttpStatusCode status...
    method GivenThereIsAServiceRunningOn (line 226) | private void GivenThereIsAServiceRunningOn(int port, HttpStatusCode st...
    method GivenThereIsAnEchoServiceRunningOn (line 240) | [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "xUnit1013:P...
    method ThenTheCounterValueShouldBe (line 254) | private void ThenTheCounterValueShouldBe(int expected)
    method TestBodiesFactory (line 259) | public static (string TestBody1String, string TestBody2String) TestBod...
  class TestBody (line 285) | public class TestBody

FILE: test/Ocelot.AcceptanceTests/CancelRequestTests.cs
  class CancelRequestTests (line 5) | public sealed class CancelRequestTests : Steps, IDisposable
    method CancelRequestTests (line 7) | public CancelRequestTests()
    method ShouldAbortServiceWork_WhenCancellingTheRequest (line 11) | [Fact]
    method Cancel (line 45) | private Task Cancel(Task t) => Task.Run(ocelotClient.CancelPendingRequ...
    method GivenThereIsAServiceRunningOn (line 47) | private void GivenThereIsAServiceRunningOn(string baseUrl, Notifier st...
    method WhenIWaitForNotification (line 64) | private static async Task WhenIWaitForNotification(Notifier notifier)
    class Notifier (line 78) | class Notifier
      method Notifier (line 80) | public Notifier(string name) => Name = name;

FILE: test/Ocelot.AcceptanceTests/CannotStartOcelotTests.cs
  class CannotStartOcelotTests (line 3) | public class CannotStartOcelotTests : Steps
    method Should_throw_exception_if_cannot_start_because_service_discovery_provider_specified_in_config_but_no_service_discovery_provider_registered_with_dynamic_re_routes (line 7) | [Fact]
    method Should_throw_exception_if_cannot_start_because_service_discovery_provider_specified_in_config_but_no_service_discovery_provider_registered (line 34) | [Fact]
    method Should_throw_exception_if_cannot_start_because_no_qos_delegate_registered_globally (line 63) | [Fact]
    method Should_throw_exception_if_cannot_start_because_no_qos_delegate_registered_for_re_route (line 90) | [Fact]
    met
Condensed preview — 1039 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (4,479K chars).
[
  {
    "path": ".config/dotnet-tools.json",
    "chars": 314,
    "preview": "{\n  \"version\": 1,\n  \"isRoot\": true,\n  \"tools\": {\n    \"cake.tool\": {\n      \"version\": \"6.1.0\",\n      \"commands\": [\n      "
  },
  {
    "path": ".dockerignore",
    "chars": 50,
    "preview": "*/*/bin\r\n*/*/obj\r\nartifacts/\r\nTestResults/\r\ntools/"
  },
  {
    "path": ".editorconfig",
    "chars": 10196,
    "preview": "# Remove the line below if you want to inherit .editorconfig settings from higher directories\r\nroot = true\r\n\r\n# XML file"
  },
  {
    "path": ".gitattributes",
    "chars": 49,
    "preview": "# 2010\r\n*.txt -crlf\r\n\r\n# 2020\r\n*.txt text eol=lf "
  },
  {
    "path": ".github/CODE_OF_CONDUCT.md",
    "chars": 3265,
    "preview": "# Contributor Covenant Code of Conduct\r\n\r\n## Our Pledge\r\n\r\nIn the interest of fostering an open and welcoming environmen"
  },
  {
    "path": ".github/CONTRIBUTING.md",
    "chars": 608,
    "preview": "We love to receive contributions from the community so please keep them coming :) \r\n\r\nPull requests, issues and commenta"
  },
  {
    "path": ".github/ISSUE_TEMPLATE.md",
    "chars": 216,
    "preview": "## Expected Behavior / New Feature\r\n\r\n\r\n## Actual Behavior / Motivation for New Feature\r\n\r\n\r\n## Steps to Reproduce the P"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "chars": 63,
    "preview": "Fixes / New Feature #\r\n\r\n## Proposed Changes\r\n\r\n  -\r\n  -\r\n  -\r\n"
  },
  {
    "path": ".github/steps/check-dotnet.sh",
    "chars": 728,
    "preview": "#!/bin/bash\n\n# First argument: target .NET major version (digit)\n# Default to 8 if no argument is provided\nDOTNET_VERSIO"
  },
  {
    "path": ".github/steps/macos.add-dns-records.sh",
    "chars": 1326,
    "preview": "#!/bin/bash\nhosts=\"/etc/hosts\"\nif [ ! -f \"$hosts\" ]; then\n  echo \"$hosts not found.\"\n  exit 1\nfi\n\n# Find the line number"
  },
  {
    "path": ".github/steps/macos.install-certificate.sh",
    "chars": 1132,
    "preview": "#!/bin/bash\n# Install mycert2.crt certificate\ncrt='./test/Ocelot.AcceptanceTests/mycert2.crt'\nopenssl version\necho Movin"
  },
  {
    "path": ".github/steps/prepare-coveralls.sh",
    "chars": 709,
    "preview": "#!/bin/bash\n# Prepare Coveralls\necho \"::group::Listing environment variables\"\nenv | sort\necho \"::endgroup::\"\n\necho -----"
  },
  {
    "path": ".github/steps/ubuntu.add-dns-records.sh",
    "chars": 281,
    "preview": "#!/bin/bash\nhosts=\"/etc/hosts\"\nif [ ! -f \"$hosts\" ]; then\n  echo \"$hosts not found.\"\n  exit 1\nfi\n\nsudo sed -i '$a 127.0."
  },
  {
    "path": ".github/steps/ubuntu.install-certificate.sh",
    "chars": 788,
    "preview": "#!/bin/bash\n# Install mycert2.crt certificate\ncrt='./test/Ocelot.AcceptanceTests/mycert2.crt'\nif [ -f \"$crt\" ]; then\n  e"
  },
  {
    "path": ".github/steps/windows.add-dns-records.ps1",
    "chars": 407,
    "preview": "# Add DNS-records\nWrite-Host \"Hello from PowerShell\"\nGet-Date\n    \n# Append entry to hosts file\nAdd-Content -Path \"$env:"
  },
  {
    "path": ".github/steps/windows.install-certificate.ps1",
    "chars": 1198,
    "preview": "Write-Host \"Hello from PowerShell\"\nGet-Date\n\n# Install mycert2.crt certificate\n$crt = \".\\test\\Ocelot.AcceptanceTests\\myc"
  },
  {
    "path": ".github/workflows/develop.yml",
    "chars": 6021,
    "preview": "name: Develop\non:\n  push:\n    branches:\n      - develop\n      # - 'release/**' # for testing purposes\njobs:\n  build-wind"
  },
  {
    "path": ".github/workflows/pr-closed.yml",
    "chars": 1284,
    "preview": "name: PR Closed\non:\n  pull_request:\n    types: [closed]\n\njobs:\n  cleanup:\n    runs-on: ubuntu-latest\n    env:\n      GH_T"
  },
  {
    "path": ".github/workflows/pr.yml",
    "chars": 7433,
    "preview": "# This workflow will build a .NET project\n# For more information see: https://docs.github.com/en/actions/automating-buil"
  },
  {
    "path": ".github/workflows/release.yml",
    "chars": 7394,
    "preview": "name: Release\non:\n  push:\n    branches:\n      - main\n      - 'release/24.**'\njobs:\n  build-windows:\n    strategy:\n      "
  },
  {
    "path": ".gitignore",
    "chars": 7937,
    "preview": "## Ignore Visual Studio temporary files, build results, and\r\n## files generated by popular Visual Studio add-ons.\r\n##\r\n#"
  },
  {
    "path": ".readthedocs.yaml",
    "chars": 813,
    "preview": "# .readthedocs.yaml\n# Read the Docs configuration file\n# See https://docs.readthedocs.io/en/stable/config-file/v2.html f"
  },
  {
    "path": "GitVersion.yml",
    "chars": 60,
    "preview": "mode: ContinuousDelivery\r\nbranches: {}\r\nignore:\r\n  sha: []\r\n"
  },
  {
    "path": "LICENSE.md",
    "chars": 1169,
    "preview": "The MIT License (MIT), Open Source Software,\r\nCopyright © 2016-2026 Tom Gardham-Pallister, Raman Maksimchuk and contribu"
  },
  {
    "path": "Ocelot.Samples.sln",
    "chars": 8142,
    "preview": "\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 18\nVisualStudioVersion = 18.3.1152"
  },
  {
    "path": "Ocelot.Samples.slnx",
    "chars": 1317,
    "preview": "<Solution>\n  <Project Path=\"samples/Basic/Ocelot.Samples.Basic.csproj\" />\n  <Project Path=\"samples/Configuration/Ocelot."
  },
  {
    "path": "Ocelot.sln",
    "chars": 12561,
    "preview": "\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 18\nVisualStudioVersion = 18.3.1152"
  },
  {
    "path": "Ocelot.slnx",
    "chars": 722,
    "preview": "<Solution>\n  <Project Path=\"src/Ocelot/Ocelot.csproj\" />\n  <Project Path=\"src/Ocelot.Provider.Consul/Ocelot.Provider.Con"
  },
  {
    "path": "README.md",
    "chars": 17741,
    "preview": "![Ocelot Logo](https://raw.githubusercontent.com/ThreeMammals/Ocelot/refs/heads/assets/images/ocelot_logo.png)\r\n\r\n[![Re"
  },
  {
    "path": "ReleaseNotes.md",
    "chars": 1072,
    "preview": "<!--\nTag to substitute: {0}\nhttps://www.nuget.org/packages/Ocelot/{0}\n-->\n## Pre-release 2 for [.NET 10](https://dotnet."
  },
  {
    "path": "build.cake",
    "chars": 44746,
    "preview": "#tool dotnet:?package=GitVersion.Tool&version=6.6.2\r\n#tool nuget:?package=ReportGenerator&version=5.5.4\r\n\r\n#addin nuget"
  },
  {
    "path": "codeanalysis.ruleset",
    "chars": 3631,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RuleSet Name=\"Rules for StyleCop.Analyzers\" Description=\"Code analysis rules fo"
  },
  {
    "path": "codecov.yml",
    "chars": 301,
    "preview": "coverage:\n  status:\n    project: #add everything under here, more options at https://docs.codecov.com/docs/commit-status"
  },
  {
    "path": "coverlet.runsettings",
    "chars": 823,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RunSettings>\n  <DataCollectionRunSettings>\n    <DataCollectors>\n      <DataColle"
  },
  {
    "path": "docker/Dockerfile.base",
    "chars": 686,
    "preview": "FROM mcr.microsoft.com/dotnet/sdk:9.0-alpine\n\nRUN apk add bash icu-libs krb5-libs libgcc libintl libssl3 libstdc++ zlib "
  },
  {
    "path": "docker/Dockerfile.build",
    "chars": 476,
    "preview": "# call from ocelot repo root with\n# docker build --platform linux/arm64 --build-arg OCELOT_COVERALLS_TOKEN=$OCELOT_COVER"
  },
  {
    "path": "docker/Dockerfile.release",
    "chars": 858,
    "preview": "# call from ocelot repo root with\n# docker build --platform linux/arm64 --build-arg OCELOT_COVERALLS_TOKEN=$OCELOT_COVER"
  },
  {
    "path": "docker/Dockerfile.windows",
    "chars": 1133,
    "preview": "FROM mcr.microsoft.com/dotnet/sdk:9.0-nanoserver-ltsc2022\n\n# Install PowerShell globally  AND  RUN powershell -Command \""
  },
  {
    "path": "docker/README.md",
    "chars": 3789,
    "preview": "# docker build\r\n\r\nThis folder contains the `Dockerfile.*` and `build-*.sh` scripts to create the Ocelot build image & co"
  },
  {
    "path": "docker/build-windows.sh",
    "chars": 360,
    "preview": "version=9.24.win\ntag=sdk9-nano2022-win.net8-9\n\ndocker build --no-cache --platform windows/amd64 -t ocelot2/circleci-buil"
  },
  {
    "path": "docker/build.sh",
    "chars": 513,
    "preview": "# This script builds the Ocelot Docker file\n# echo $DOCKER_PASS | docker login -u $DOCKER_USER --password-stdin\n\n# {DotN"
  },
  {
    "path": "docker/outdated/Dockerfile.8.21.0.base",
    "chars": 543,
    "preview": "FROM mcr.microsoft.com/dotnet/sdk:8.0-alpine\n\nRUN apk add bash icu-libs krb5-libs libgcc libintl libssl1.1 libstdc++ zli"
  },
  {
    "path": "docker/outdated/Dockerfile.8.23.2.base",
    "chars": 882,
    "preview": "FROM mcr.microsoft.com/dotnet/sdk:8.0-alpine\n\nRUN apk add bash icu-libs krb5-libs libgcc libintl libssl3 libstdc++ zlib "
  },
  {
    "path": "docs/Makefile",
    "chars": 634,
    "preview": "# Minimal makefile for Sphinx documentation\n#\n\n# You can set these variables from the command line, and also\n# from the "
  },
  {
    "path": "docs/_static/overrides.css",
    "chars": 245,
    "preview": "blockquote {\n    font-size: 0.9em;\n}\naside.footnote-list {\n    font-size: 0.9em;\n}\n.img-valign-middle\n{\n    vertical-ali"
  },
  {
    "path": "docs/building/building.rst",
    "chars": 14097,
    "preview": ".. role:: htm(raw)\n  :format: html\n.. role:: pdf(raw)\n  :format: latex pdflatex\n.. _Ocelot: https://github.com/ThreeMamm"
  },
  {
    "path": "docs/building/devprocess.rst",
    "chars": 10839,
    "preview": ".. _Gitflow Workflow: https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow\n.. _GitHub Flow: http"
  },
  {
    "path": "docs/building/releaseprocess.rst",
    "chars": 7050,
    "preview": ".. _Gitflow Workflow: https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow\r\n.. _GitHub Flow: htt"
  },
  {
    "path": "docs/conf.py",
    "chars": 1585,
    "preview": "# Configuration file for the Sphinx documentation builder.\r\n#\r\n# For the full list of built-in configuration values, see"
  },
  {
    "path": "docs/features/administration.rst",
    "chars": 9264,
    "preview": ".. _IdentityServer: https://github.com/DuendeArchive/IdentityServer4\r\n.. _IdentityServer4: https://www.nuget.org/package"
  },
  {
    "path": "docs/features/aggregation.rst",
    "chars": 12805,
    "preview": "Aggregation\n===========\n\n*Aggregation*, also known as HTTP response data aggregation, is a well-known Backend for Fronte"
  },
  {
    "path": "docs/features/authentication.rst",
    "chars": 21795,
    "preview": ".. _scheme: https://learn.microsoft.com/en-us/aspnet/core/security/authentication/#authentication-scheme\r\n.. _Program: h"
  },
  {
    "path": "docs/features/authorization.rst",
    "chars": 2539,
    "preview": "Authorization\r\n=============\r\n\r\nOcelot supports claims based authorization which is run post authentication.\r\nThis means"
  },
  {
    "path": "docs/features/caching.rst",
    "chars": 12542,
    "preview": ".. _Program: https://github.com/ThreeMammals/Ocelot/blob/main/samples/Basic/Program.cs\r\n\r\nCaching\r\n=======\r\n\r\n[#f1]_ Oce"
  },
  {
    "path": "docs/features/claimstransformation.rst",
    "chars": 4811,
    "preview": "Claims Transformation\r\n=====================\r\n\r\nOcelot allows the user to access claims and transform them into headers,"
  },
  {
    "path": "docs/features/configuration.rst",
    "chars": 49810,
    "preview": ".. _ocelot.json: https://github.com/ThreeMammals/Ocelot/blob/main/samples/Basic/ocelot.json\r\n.. _Program: https://github"
  },
  {
    "path": "docs/features/delegatinghandlers.rst",
    "chars": 5063,
    "preview": ".. _ocelot.json: https://github.com/ThreeMammals/Ocelot/blob/main/samples/Basic/ocelot.json\r\n.. _Program: https://github"
  },
  {
    "path": "docs/features/dependencyinjection.rst",
    "chars": 16458,
    "preview": ".. _ocelot.json: https://github.com/ThreeMammals/Ocelot/blob/main/samples/Basic/ocelot.json\n.. _Program: https://github."
  },
  {
    "path": "docs/features/errorcodes.rst",
    "chars": 6867,
    "preview": "Error Handling\r\n==============\r\n.. _Handle errors in ASP.NET Core: https://learn.microsoft.com/en-us/aspnet/core/fundame"
  },
  {
    "path": "docs/features/graphql.rst",
    "chars": 1713,
    "preview": ".. _GraphQL: https://graphql.org/\r\n.. _Ocelot.Samples.GraphQL: https://github.com/ThreeMammals/Ocelot/tree/main/samples/"
  },
  {
    "path": "docs/features/headerstransformation.rst",
    "chars": 10082,
    "preview": ".. _ocelot.json: https://github.com/ThreeMammals/Ocelot/blob/main/samples/Basic/ocelot.json\r\n.. _Program: https://github"
  },
  {
    "path": "docs/features/kubernetes.rst",
    "chars": 18141,
    "preview": ".. role:: htm(raw)\r\n  :format: html\r\n.. role:: pdf(raw)\r\n  :format: latex pdflatex\r\n.. |K8sLogo| image:: https://raw.git"
  },
  {
    "path": "docs/features/loadbalancer.rst",
    "chars": 15066,
    "preview": ".. _ocelot.json: https://github.com/ThreeMammals/Ocelot/blob/main/samples/Basic/ocelot.json\r\n.. _Program: https://github"
  },
  {
    "path": "docs/features/logging.rst",
    "chars": 17513,
    "preview": ".. _Logging in .NET Core and ASP.NET Core: https://learn.microsoft.com/en-us/aspnet/core/fundamentals/logging\r\n.. _Seril"
  },
  {
    "path": "docs/features/metadata.rst",
    "chars": 12786,
    "preview": "Metadata\n========\n\n  [#f1]_ Feature of: :doc:`../features/configuration`\n\nOcelot provides various features such as routi"
  },
  {
    "path": "docs/features/methodtransformation.rst",
    "chars": 973,
    "preview": "Method Transformation [#f1]_\r\n============================\r\n\r\nOcelot allows users to modify the HTTP request method used"
  },
  {
    "path": "docs/features/middlewareinjection.rst",
    "chars": 9404,
    "preview": ".. _Program: https://github.com/ThreeMammals/Ocelot/blob/main/samples/Metadata/Program.cs\r\n\r\nMiddleware Injection\r\n====="
  },
  {
    "path": "docs/features/qualityofservice.rst",
    "chars": 21891,
    "preview": ".. role:: htm(raw)\n  :format: html\n.. role:: pdf(raw)\n  :format: latex pdflatex\n.. _Program: https://github.com/ThreeMam"
  },
  {
    "path": "docs/features/ratelimiting.rst",
    "chars": 22674,
    "preview": "Rate Limiting\r\n=============\r\n\r\n  Feature label: `Rate Limiting <https://github.com/ThreeMammals/Ocelot/labels/Rate%20Li"
  },
  {
    "path": "docs/features/routing.rst",
    "chars": 24541,
    "preview": "Routing\r\n=======\r\n\r\nOcelot's primary function is to handle incoming HTTP requests and forward them to a downstream servi"
  },
  {
    "path": "docs/features/servicediscovery.rst",
    "chars": 32417,
    "preview": "Service Discovery\r\n=================\r\n\r\nOcelot allows you to specify a *service discovery* provider, which it uses to de"
  },
  {
    "path": "docs/features/servicefabric.rst",
    "chars": 5752,
    "preview": "Service Fabric\r\n==============\r\n\r\n  [#f1]_ Feature of: :doc:`../features/servicediscovery`\r\n\r\nIf you have services deplo"
  },
  {
    "path": "docs/features/tracing.rst",
    "chars": 5448,
    "preview": "Tracing\r\n=======\r\n\r\n  Feature of: :doc:`../features/logging`\r\n\r\n  * `.NET logging and tracing | .NET | Microsoft Learn <"
  },
  {
    "path": "docs/features/websockets.rst",
    "chars": 9510,
    "preview": "Websockets\r\n==========\r\n\r\n    * `WebSockets Standard <https://websockets.spec.whatwg.org/>`_ by WHATWG organization\r\n   "
  },
  {
    "path": "docs/index.rst",
    "chars": 2515,
    "preview": ".. _25.0: https://github.com/ThreeMammals/Ocelot/releases/tag/25.0.0\r\n.. role::  htm(raw)\r\n    :format: html\r\n.. role:: "
  },
  {
    "path": "docs/introduction/bigpicture.rst",
    "chars": 2247,
    "preview": "Big Picture\r\n===========\r\n\r\nOcelot is aimed at people using .NET running a microservices (service-oriented) architecture"
  },
  {
    "path": "docs/introduction/gettingstarted.rst",
    "chars": 6029,
    "preview": "Getting Started\r\n===============\r\n\r\nOcelot is designed to work with `ASP.NET Core <https://learn.microsoft.com/en-us/asp"
  },
  {
    "path": "docs/introduction/gotchas.rst",
    "chars": 6635,
    "preview": ".. role:: htm(raw)\n  :format: html\n.. role:: pdf(raw)\n  :format: latex pdflatex\n\nHosting Gotchas\n===============\n\n    Mi"
  },
  {
    "path": "docs/introduction/notsupported.rst",
    "chars": 3272,
    "preview": "Not Supported\r\n=============\r\n\r\nOcelot does not support...\r\n\r\n.. _chunked-encoding:\r\n\r\nChunked Encoding\r\n---------------"
  },
  {
    "path": "docs/make.bat",
    "chars": 1119,
    "preview": "@ECHO OFF\r\npushd %~dp0\r\n\r\nREM Command file for Sphinx documentation\r\n\r\nif \"%SPHINXBUILD%\" == \"\" (\r\n\tset SPHINXBUILD=sphi"
  },
  {
    "path": "docs/make.ps1",
    "chars": 632,
    "preview": "# Command file for Sphinx documentation\n# PowerShell version without env var usage\n\nparam (\n    [string]$command\n)\n\n# De"
  },
  {
    "path": "docs/make.sh",
    "chars": 526,
    "preview": "#!/bin/sh\n#\n# Command file for Sphinx documentation\n#\nif [ \"$SPHINXBUILD\" == \"\" ]\nthen\n   SPHINXBUILD=\"sphinx-build\"\nfi\n"
  },
  {
    "path": "docs/readme.md",
    "chars": 999,
    "preview": "# Ocelot Documentation\r\n\r\nThe folder contains the documentation for Ocelot, build tools and configuration.\r\n\r\nWe are usi"
  },
  {
    "path": "docs/releasenotes.rst",
    "chars": 19363,
    "preview": ".. _24.1: https://github.com/ThreeMammals/Ocelot/releases/tag/24.1.0\n.. _24.1.0: https://github.com/ThreeMammals/Ocelot/"
  },
  {
    "path": "docs/requirements.txt",
    "chars": 119,
    "preview": "# Defining the exact version will make sure things don't break\nsphinx==9.0.4\nalabaster==1.0.0\nsphinx_copybutton==0.5.2\n"
  },
  {
    "path": "postman/ocelot.postman_collection.json",
    "chars": 8311,
    "preview": "{\n\t\"id\": \"4dbde9fe-89f5-be35-bb9f-d3b438e16375\",\n\t\"name\": \"Ocelot\",\n\t\"description\": \"\",\n\t\"order\": [\n\t\t\"a1c95935-ed18-d5d"
  },
  {
    "path": "samples/Basic/API.http",
    "chars": 340,
    "preview": "@OcelotHttp = http://localhost:5555\n\nGET {{OcelotHttp}}/ocelot/posts/1\nAccept: application/json\n###\nGET {{OcelotHttp}}/o"
  },
  {
    "path": "samples/Basic/Ocelot.Samples.Basic.csproj",
    "chars": 1094,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n  <PropertyGroup>\n    <TargetFrameworks>net8.0;net9.0;net10.0</TargetFrameworks>\n"
  },
  {
    "path": "samples/Basic/Program.cs",
    "chars": 536,
    "preview": "using Ocelot.DependencyInjection;\nusing Ocelot.Middleware;\n\nvar builder = WebApplication.CreateBuilder(args);\n\n// Ocelot"
  },
  {
    "path": "samples/Basic/Properties/launchSettings.json",
    "chars": 1431,
    "preview": "{\n  \"profiles\": {\n    \"http\": {\n      \"commandName\": \"Project\",\n      \"launchBrowser\": true,\n      \"launchUrl\": \"ocelot/"
  },
  {
    "path": "samples/Basic/appsettings.Development.json",
    "chars": 233,
    "preview": "{\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Debug\",\n      \"Microsoft\": \"Information\",\n      \"Microsoft.AspNetCo"
  },
  {
    "path": "samples/Basic/appsettings.json",
    "chars": 97,
    "preview": "{\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Warning\"\n    }\n  },\n  \"AllowedHosts\": \"*\"\n}\n"
  },
  {
    "path": "samples/Basic/ocelot.json",
    "chars": 1072,
    "preview": "{\n  \"Routes\": [\n    {\n      \"UpstreamHttpMethod\": [ \"Get\" ],\n      \"UpstreamPathTemplate\": \"/ocelot/posts/{id}\",\n      \""
  },
  {
    "path": "samples/Basic/packages.lock.json",
    "chars": 7699,
    "preview": "{\n  \"version\": 1,\n  \"dependencies\": {\n    \"net10.0\": {\n      \"FluentValidation\": {\n        \"type\": \"Transitive\",\n       "
  },
  {
    "path": "samples/Configuration/API.http",
    "chars": 466,
    "preview": "@HttpHost = http://localhost:5556\n\nGET {{HttpHost}}/ocelot/posts/1\nAccept: application/json\n###\nGET {{HttpHost}}/ocelot/"
  },
  {
    "path": "samples/Configuration/Ocelot.Samples.Configuration.csproj",
    "chars": 1088,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n\n  <PropertyGroup>\n    <TargetFrameworks>net8.0;net9.0;net10.0</TargetFrameworks>"
  },
  {
    "path": "samples/Configuration/Program.cs",
    "chars": 791,
    "preview": "using Ocelot.DependencyInjection;\nusing Ocelot.Middleware;\n\nvar builder = WebApplication.CreateBuilder(args);\n\n// Ocelot"
  },
  {
    "path": "samples/Configuration/Properties/launchSettings.json",
    "chars": 619,
    "preview": "{\n  \"$schema\": \"https://json.schemastore.org/launchsettings.json\",\n  \"profiles\": {\n    \"http\": {\n      \"commandName\": \""
  },
  {
    "path": "samples/Configuration/appsettings.Development.json",
    "chars": 239,
    "preview": "{\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Information\",\n      \"Microsoft\": \"Information\",\n      \"Microsoft.As"
  },
  {
    "path": "samples/Configuration/appsettings.json",
    "chars": 142,
    "preview": "{\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Information\",\n      \"Microsoft.AspNetCore\": \"Warning\"\n    }\n  },\n  "
  },
  {
    "path": "samples/Configuration/ocelot-configuration/ocelot.docs.json",
    "chars": 653,
    "preview": "{\n  \"Routes\": [\n    {\n      \"UpstreamHttpMethod\": [ \"Get\" ],\n      \"UpstreamPathTemplate\": \"/ocelot/docs/{everything}\",\n"
  },
  {
    "path": "samples/Configuration/ocelot-configuration/ocelot.global.json",
    "chars": 102,
    "preview": "{\n  \"GlobalConfiguration\": {\n    \"BaseUrl\": \"http://localhost:5556\" // \"https://localhost:7778\"\n  }\n}\n"
  },
  {
    "path": "samples/Configuration/ocelot-configuration/ocelot.posts.json",
    "chars": 341,
    "preview": "{\n  \"Routes\": [\n    {\n      \"UpstreamHttpMethod\": [ \"Get\" ],\n      \"UpstreamPathTemplate\": \"/ocelot/posts/{id}\",\n      \""
  },
  {
    "path": "samples/Configuration/ocelot-configuration/ocelot.weather.json",
    "chars": 386,
    "preview": "{\n  \"Routes\": [\n    {\n      \"UpstreamHttpMethod\": [ \"Get\" ],\n      \"UpstreamPathTemplate\": \"/weather/current/{city}\",\n  "
  },
  {
    "path": "samples/Configuration/packages.lock.json",
    "chars": 7699,
    "preview": "{\n  \"version\": 1,\n  \"dependencies\": {\n    \"net10.0\": {\n      \"FluentValidation\": {\n        \"type\": \"Transitive\",\n       "
  },
  {
    "path": "samples/Eureka/ApiGateway/Ocelot.Samples.Eureka.ApiGateway.csproj",
    "chars": 1421,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n  <PropertyGroup>\n    <TargetFrameworks>net8.0;net9.0;net10.0</TargetFrameworks>\n"
  },
  {
    "path": "samples/Eureka/ApiGateway/Program.cs",
    "chars": 582,
    "preview": "using Ocelot.DependencyInjection;\nusing Ocelot.Middleware;\nusing Ocelot.Provider.Eureka;\nusing Ocelot.Provider.Polly;\nu"
  },
  {
    "path": "samples/Eureka/ApiGateway/Properties/launchSettings.json",
    "chars": 1412,
    "preview": "{\n  \"profiles\": {\n    \"http\": {\n      \"commandName\": \"Project\",\n      \"launchBrowser\": true,\n      \"launchUrl\": \"Categor"
  },
  {
    "path": "samples/Eureka/ApiGateway/appsettings.json",
    "chars": 502,
    "preview": "{\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Trace\",\n      \"System\": \"Information\",\n      \"Microsoft\": \"Informa"
  },
  {
    "path": "samples/Eureka/ApiGateway/ocelot.json",
    "chars": 1080,
    "preview": "{\n  \"Routes\": [\n    {\n      \"ServiceName\": \"ncore-rat\",\n      \"UpstreamHttpMethod\": [ \"Get\" ],\n      \"UpstreamPathTempl"
  },
  {
    "path": "samples/Eureka/ApiGateway/packages.lock.json",
    "chars": 21337,
    "preview": "{\n  \"version\": 1,\n  \"dependencies\": {\n    \"net10.0\": {\n      \"FluentValidation\": {\n        \"type\": \"Transitive\",\n       "
  },
  {
    "path": "samples/Eureka/DownstreamService/Controllers/CategoryController.cs",
    "chars": 313,
    "preview": "using Microsoft.AspNetCore.Mvc;\n\nnamespace Ocelot.Samples.Eureka.DownstreamService.Controllers;\n\n[Route(\"api/[controlle"
  },
  {
    "path": "samples/Eureka/DownstreamService/Ocelot.Samples.Eureka.DownstreamService.csproj",
    "chars": 1332,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n  <PropertyGroup>\n    <TargetFrameworks>net8.0;net9.0;net10.0</TargetFrameworks>\n"
  },
  {
    "path": "samples/Eureka/DownstreamService/Program.cs",
    "chars": 442,
    "preview": "using Steeltoe.Discovery.Client;\n\nvar builder = WebApplication.CreateBuilder(args);\nbuilder.Services\n    .AddDiscoveryC"
  },
  {
    "path": "samples/Eureka/DownstreamService/Properties/launchSettings.json",
    "chars": 1427,
    "preview": "{\n  \"profiles\": {\n    \"http\": {\n      \"commandName\": \"Project\",\n      \"launchBrowser\": true,\n      \"launchUrl\": \"api/Cat"
  },
  {
    "path": "samples/Eureka/DownstreamService/appsettings.Development.json",
    "chars": 234,
    "preview": "{\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Debug\",\n      \"Microsoft\": \"Information\",\n      \"Microsoft.AspNetC"
  },
  {
    "path": "samples/Eureka/DownstreamService/appsettings.json",
    "chars": 454,
    "preview": "{\n  \"Logging\": {\n    \"LogLevel\": { \"Default\": \"Warning\" }\n  },\n  \"spring\": {\n    \"application\": { \"name\": \"ncore-rat\" }"
  },
  {
    "path": "samples/Eureka/DownstreamService/packages.lock.json",
    "chars": 11985,
    "preview": "{\n  \"version\": 1,\n  \"dependencies\": {\n    \"net10.0\": {\n      \"Steeltoe.Discovery.ClientCore\": {\n        \"type\": \"Direct\""
  },
  {
    "path": "samples/Eureka/OcelotEureka.sln",
    "chars": 1605,
    "preview": "\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.27428.2027\nM"
  },
  {
    "path": "samples/Eureka/README.md",
    "chars": 920,
    "preview": "#Example how to use Eureka service discovery\n\nI created this becasue users are having trouble getting Eureka to work wit"
  },
  {
    "path": "samples/GraphQL/GraphQlDelegatingHandler.cs",
    "chars": 1760,
    "preview": "using GraphQL;\nusing GraphQL.NewtonsoftJson;\nusing System.Net;\nusing System.Net.Http.Headers;\n\nnamespace Ocelot.Samples"
  },
  {
    "path": "samples/GraphQL/Models/Hero.cs",
    "chars": 143,
    "preview": "namespace Ocelot.Samples.GraphQL.Models;\n\npublic class Hero\n{\n    public int Id { get; set; }\n    public required strin"
  },
  {
    "path": "samples/GraphQL/Models/Query.cs",
    "chars": 470,
    "preview": "using GraphQL;\n\nnamespace Ocelot.Samples.GraphQL.Models;\n\npublic class Query\n{\n    private readonly List<Hero> _heroes "
  },
  {
    "path": "samples/GraphQL/Ocelot.Samples.GraphQL.csproj",
    "chars": 1373,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n  <PropertyGroup>\n    <TargetFrameworks>net8.0;net9.0;net10.0</TargetFrameworks>\n"
  },
  {
    "path": "samples/GraphQL/OcelotGraphQL.sln",
    "chars": 1104,
    "preview": "\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 16\nVisualStudioVersion = 16.0.2880"
  },
  {
    "path": "samples/GraphQL/Program.cs",
    "chars": 961,
    "preview": "using GraphQL.Types;\nusing Ocelot.DependencyInjection;\nusing Ocelot.Middleware;\nusing Ocelot.Samples.GraphQL;\nusing Oce"
  },
  {
    "path": "samples/GraphQL/Properties/launchSettings.json",
    "chars": 1407,
    "preview": "{\n  \"profiles\": {\n    \"http\": {\n      \"commandName\": \"Project\",\n      \"launchBrowser\": true,\n      \"launchUrl\": \"graphql"
  },
  {
    "path": "samples/GraphQL/README.md",
    "chars": 1956,
    "preview": "# Ocelot using GraphQL example\n\nLoads of people keep asking me if Ocelot will every support GraphQL, in my mind Ocelot a"
  },
  {
    "path": "samples/GraphQL/ocelot.json",
    "chars": 312,
    "preview": "{\n  \"Routes\": [\n    {\n      \"UpstreamPathTemplate\": \"/graphql\",\n      \"DownstreamPathTemplate\": \"/\",\n      \"DownstreamSc"
  },
  {
    "path": "samples/GraphQL/packages.lock.json",
    "chars": 11068,
    "preview": "{\n  \"version\": 1,\n  \"dependencies\": {\n    \"net10.0\": {\n      \"GraphQL\": {\n        \"type\": \"Direct\",\n        \"requested\":"
  },
  {
    "path": "samples/Kubernetes/.dockerignore",
    "chars": 74,
    "preview": ".dockerignore\n.env\n.git\n.gitignore\n.vs\n.vscode\n*/bin\n*/obj\n**/.toolstarget"
  },
  {
    "path": "samples/Kubernetes/ApiGateway/Dockerfile",
    "chars": 691,
    "preview": "FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS base\nWORKDIR /app\nEXPOSE 80\nEXPOSE 443\n\nFROM mcr.microsoft.com/dotnet/sdk:9."
  },
  {
    "path": "samples/Kubernetes/ApiGateway/Ocelot.Samples.Kubernetes.ApiGateway.csproj",
    "chars": 1259,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n  <PropertyGroup>\n    <TargetFrameworks>net8.0;net9.0;net10.0</TargetFrameworks>\n"
  },
  {
    "path": "samples/Kubernetes/ApiGateway/Program.cs",
    "chars": 3404,
    "preview": "using KubeClient;\nusing Ocelot.DependencyInjection;\nusing Ocelot.Middleware;\nusing Ocelot.Provider.Kubernetes;\nusing Oc"
  },
  {
    "path": "samples/Kubernetes/ApiGateway/Properties/launchSettings.json",
    "chars": 1549,
    "preview": "{\n  \"profiles\": {\n    \"http\": {\n      \"commandName\": \"Project\",\n      \"launchBrowser\": true,\n      \"launchUrl\": \"values\""
  },
  {
    "path": "samples/Kubernetes/ApiGateway/appsettings.Development.json",
    "chars": 233,
    "preview": "{\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Debug\",\n      \"Microsoft\": \"Information\",\n      \"Microsoft.AspNetCo"
  },
  {
    "path": "samples/Kubernetes/ApiGateway/appsettings.json",
    "chars": 97,
    "preview": "{\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Warning\"\n    }\n  },\n  \"AllowedHosts\": \"*\"\n}\n"
  },
  {
    "path": "samples/Kubernetes/ApiGateway/ocelot.json",
    "chars": 747,
    "preview": "{\n  \"Routes\": [\n    {\n      \"ServiceName\": \"my-service\",\n      \"UpstreamHttpMethod\": [ \"Get\" ],\n      \"UpstreamPathTempl"
  },
  {
    "path": "samples/Kubernetes/ApiGateway/packages.lock.json",
    "chars": 15984,
    "preview": "{\n  \"version\": 1,\n  \"dependencies\": {\n    \"net10.0\": {\n      \"BouncyCastle.Cryptography\": {\n        \"type\": \"Transitive\""
  },
  {
    "path": "samples/Kubernetes/Dockerfile",
    "chars": 792,
    "preview": "FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base\nWORKDIR /app\nEXPOSE 80\n\nFROM microsoft/dotnet:2.1-sdk AS build\nWORK"
  },
  {
    "path": "samples/Kubernetes/DownstreamService/Controllers/ValuesController.cs",
    "chars": 773,
    "preview": "using Microsoft.AspNetCore.Mvc;\n\nnamespace Ocelot.Samples.Kubernetes.DownstreamService.Controllers;\n\n[ApiController]\n[R"
  },
  {
    "path": "samples/Kubernetes/DownstreamService/Controllers/WeatherForecastController.cs",
    "chars": 1032,
    "preview": "using Microsoft.AspNetCore.Mvc;\n\nnamespace Ocelot.Samples.Kubernetes.DownstreamService.Controllers;\n\nusing Models;\n\n[Ap"
  },
  {
    "path": "samples/Kubernetes/DownstreamService/Dockerfile",
    "chars": 754,
    "preview": "FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS base\nWORKDIR /app\nEXPOSE 80\nEXPOSE 443\n\nFROM mcr.microsoft.com/dotnet/sdk:9."
  },
  {
    "path": "samples/Kubernetes/DownstreamService/Models/WeatherForecast.cs",
    "chars": 285,
    "preview": "namespace Ocelot.Samples.Kubernetes.DownstreamService.Models;\n\npublic class WeatherForecast\n{\n    public DateOnly Date "
  },
  {
    "path": "samples/Kubernetes/DownstreamService/Ocelot.Samples.Kubernetes.DownstreamService.csproj",
    "chars": 1185,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n  <PropertyGroup>\n    <TargetFrameworks>net8.0;net9.0;net10.0</TargetFrameworks>\n"
  },
  {
    "path": "samples/Kubernetes/DownstreamService/Program.cs",
    "chars": 964,
    "preview": "using Ocelot.Samples.Web;\nusing System.Text.Json;\nusing System.Text.Json.Serialization;\n\n_ = DownstreamHostBuilder.Crea"
  },
  {
    "path": "samples/Kubernetes/DownstreamService/Properties/launchSettings.json",
    "chars": 1554,
    "preview": "{\n  \"profiles\": {\n    \"http\": {\n      \"commandName\": \"Project\",\n      \"launchBrowser\": true,\n      \"launchUrl\": \"swagger"
  },
  {
    "path": "samples/Kubernetes/DownstreamService/appsettings.Development.json",
    "chars": 233,
    "preview": "{\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Debug\",\n      \"Microsoft\": \"Information\",\n      \"Microsoft.AspNetCo"
  },
  {
    "path": "samples/Kubernetes/DownstreamService/appsettings.json",
    "chars": 97,
    "preview": "{\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Warning\"\n    }\n  },\n  \"AllowedHosts\": \"*\"\n}\n"
  },
  {
    "path": "samples/Kubernetes/DownstreamService/packages.lock.json",
    "chars": 5733,
    "preview": "{\n  \"version\": 1,\n  \"dependencies\": {\n    \"net10.0\": {\n      \"Swashbuckle.AspNetCore\": {\n        \"type\": \"Direct\",\n     "
  },
  {
    "path": "samples/Kubernetes/OcelotKube.sln",
    "chars": 1608,
    "preview": "\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 16\nVisualStudioVersion = 16.0.2880"
  },
  {
    "path": "samples/Metadata/API.http",
    "chars": 964,
    "preview": "@HostHttp = http://localhost:5139\n\nGET {{HostAddress}}/ocelot/docs/\nAccept: application/json\n### Route #1 aka 'ocelot-do"
  },
  {
    "path": "samples/Metadata/MetadataResponder.cs",
    "chars": 9495,
    "preview": "using Ocelot.Configuration;\nusing Ocelot.Headers;\nusing Ocelot.Metadata;\nusing Ocelot.Middleware;\nusing Ocelot.Responde"
  },
  {
    "path": "samples/Metadata/Models/PostsPlugin2.cs",
    "chars": 269,
    "preview": "namespace Ocelot.Samples.Metadata.Models;\n\npublic class PostsPlugin2\n{\n    public string? name { get; set; }\n    public"
  },
  {
    "path": "samples/Metadata/Models/TestDeflateResponse.cs",
    "chars": 222,
    "preview": "namespace Ocelot.Samples.Metadata.Models;\n\npublic class TestDeflateResponse\n{\n    public bool? deflated { get; set; }\n "
  },
  {
    "path": "samples/Metadata/Models/TestGZipResponse.cs",
    "chars": 218,
    "preview": "namespace Ocelot.Samples.Metadata.Models;\n\npublic class TestGZipResponse\n{\n    public bool? gzipped { get; set; }\n    p"
  },
  {
    "path": "samples/Metadata/Models/WeatherCurrent.cs",
    "chars": 1308,
    "preview": "namespace Ocelot.Samples.Metadata.Models;\n\npublic class WeatherCurrent\n{\n    public long? last_updated_epoch { get; set"
  },
  {
    "path": "samples/Metadata/Models/WeatherCurrentCondition.cs",
    "chars": 196,
    "preview": "namespace Ocelot.Samples.Metadata.Models;\n\npublic class WeatherCurrentCondition\n{\n    public string? text { get; set; }"
  },
  {
    "path": "samples/Metadata/Models/WeatherLocation.cs",
    "chars": 397,
    "preview": "namespace Ocelot.Samples.Metadata.Models;\n\npublic class WeatherLocation\n{\n    public string? name { get; set; }\n    pub"
  },
  {
    "path": "samples/Metadata/Models/WeatherResponse.cs",
    "chars": 178,
    "preview": "namespace Ocelot.Samples.Metadata.Models;\n\npublic class WeatherResponse\n{\n    public WeatherLocation? location { get; s"
  },
  {
    "path": "samples/Metadata/MyMiddlewares.cs",
    "chars": 3851,
    "preview": "using Ocelot.Logging;\nusing Ocelot.Metadata;\nusing Ocelot.Middleware;\nusing Ocelot.Responder;\nusing System.Text.Json;\n\nn"
  },
  {
    "path": "samples/Metadata/Ocelot.Samples.Metadata.csproj",
    "chars": 1174,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n\n  <PropertyGroup>\n    <TargetFrameworks>net8.0;net9.0;net10.0</TargetFrameworks>"
  },
  {
    "path": "samples/Metadata/Program.cs",
    "chars": 862,
    "preview": "using Microsoft.Extensions.DependencyInjection.Extensions;\nusing Ocelot.DependencyInjection;\nusing Ocelot.Middleware;\nus"
  },
  {
    "path": "samples/Metadata/Properties/launchSettings.json",
    "chars": 619,
    "preview": "{\n  \"$schema\": \"https://json.schemastore.org/launchsettings.json\",\n  \"profiles\": {\n    \"http\": {\n      \"commandName\": \""
  },
  {
    "path": "samples/Metadata/appsettings.Development.json",
    "chars": 233,
    "preview": "{\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Debug\",\n      \"Microsoft\": \"Information\",\n      \"Microsoft.AspNetCo"
  },
  {
    "path": "samples/Metadata/appsettings.json",
    "chars": 142,
    "preview": "{\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Information\",\n      \"Microsoft.AspNetCore\": \"Warning\"\n    }\n  },\n  "
  },
  {
    "path": "samples/Metadata/ocelot.json",
    "chars": 7270,
    "preview": "{\n  \"Routes\": [\n    { // route #1 aka 'ocelot-docs'\n      \"UpstreamHttpMethod\": [ \"Get\" ],\n      \"UpstreamPathTemplate\":"
  },
  {
    "path": "samples/Metadata/packages.lock.json",
    "chars": 8392,
    "preview": "{\n  \"version\": 1,\n  \"dependencies\": {\n    \"net10.0\": {\n      \"ZstdNet\": {\n        \"type\": \"Direct\",\n        \"requested\":"
  },
  {
    "path": "samples/OpenTracing/Ocelot.Samples.OpenTracing.csproj",
    "chars": 1298,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n  <PropertyGroup>\n    <TargetFrameworks>net8.0;net9.0;net10.0</TargetFrameworks>\n"
  },
  {
    "path": "samples/OpenTracing/Program.cs",
    "chars": 957,
    "preview": "using Microsoft.AspNetCore.Builder;\nusing Microsoft.AspNetCore.Hosting;\nusing Ocelot.DependencyInjection;\nusing Ocelot."
  },
  {
    "path": "samples/OpenTracing/Properties/launchSettings.json",
    "chars": 1407,
    "preview": "{\n  \"profiles\": {\n    \"http\": {\n      \"commandName\": \"Project\",\n      \"launchBrowser\": true,\n      \"launchUrl\": \"posts/1"
  },
  {
    "path": "samples/OpenTracing/appsettings.Development.json",
    "chars": 233,
    "preview": "{\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Debug\",\n      \"Microsoft\": \"Information\",\n      \"Microsoft.AspNetCo"
  },
  {
    "path": "samples/OpenTracing/appsettings.json",
    "chars": 97,
    "preview": "{\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Warning\"\n    }\n  },\n  \"AllowedHosts\": \"*\"\n}\n"
  },
  {
    "path": "samples/OpenTracing/ocelot.json",
    "chars": 444,
    "preview": "{\n  \"Routes\": [\n    {\n      \"UpstreamHttpMethod\": [ \"Get\" ],\n      \"UpstreamPathTemplate\": \"/posts/{id}\",\n      \"Downstr"
  },
  {
    "path": "samples/OpenTracing/packages.lock.json",
    "chars": 33690,
    "preview": "{\n  \"version\": 1,\n  \"dependencies\": {\n    \"net10.0\": {\n      \"Jaeger\": {\n        \"type\": \"Direct\",\n        \"requested\": "
  },
  {
    "path": "samples/ServiceDiscovery/.dockerignore",
    "chars": 317,
    "preview": "**/.classpath\n**/.dockerignore\n**/.env\n**/.git\n**/.gitignore\n**/.project\n**/.settings\n**/.toolstarget\n**/.vs\n**/.vscode\n"
  },
  {
    "path": "samples/ServiceDiscovery/ApiGateway/Ocelot.Samples.ServiceDiscovery.ApiGateway.csproj",
    "chars": 1231,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n  <PropertyGroup>\n    <TargetFrameworks>net8.0;net9.0;net10.0</TargetFrameworks>\n"
  },
  {
    "path": "samples/ServiceDiscovery/ApiGateway/Program.cs",
    "chars": 1791,
    "preview": "using Microsoft.Extensions.DependencyInjection;\nusing Microsoft.Extensions.DependencyInjection.Extensions;\nusing Ocelot"
  },
  {
    "path": "samples/ServiceDiscovery/ApiGateway/Properties/launchSettings.json",
    "chars": 1419,
    "preview": "{\n  \"profiles\": {\n    \"http\": {\n      \"commandName\": \"Project\",\n      \"launchBrowser\": true,\n      \"launchUrl\": \"categor"
  },
  {
    "path": "samples/ServiceDiscovery/ApiGateway/ServiceDiscovery/MyServiceDiscoveryProvider.cs",
    "chars": 1655,
    "preview": "using Ocelot.Configuration;\nusing Ocelot.Metadata;\nusing Ocelot.ServiceDiscovery.Providers;\nusing Ocelot.Values;\n\nnames"
  },
  {
    "path": "samples/ServiceDiscovery/ApiGateway/ServiceDiscovery/MyServiceDiscoveryProviderFactory.cs",
    "chars": 991,
    "preview": "using Ocelot.Configuration;\nusing Ocelot.Logging;\nusing Ocelot.Responses;\nusing Ocelot.ServiceDiscovery;\nusing Ocelot.S"
  },
  {
    "path": "samples/ServiceDiscovery/ApiGateway/appsettings.Development.json",
    "chars": 233,
    "preview": "{\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Debug\",\n      \"Microsoft\": \"Information\",\n      \"Microsoft.AspNetCo"
  },
  {
    "path": "samples/ServiceDiscovery/ApiGateway/appsettings.json",
    "chars": 97,
    "preview": "{\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Warning\"\n    }\n  },\n  \"AllowedHosts\": \"*\"\n}\n"
  },
  {
    "path": "samples/ServiceDiscovery/ApiGateway/ocelot.json",
    "chars": 831,
    "preview": "{\n  \"Routes\": [\n    {\n      \"ServiceName\": \"downstream-service\",\n      \"UpstreamHttpMethod\": [ \"Get\" ],\n      \"Upstream"
  },
  {
    "path": "samples/ServiceDiscovery/ApiGateway/packages.lock.json",
    "chars": 7699,
    "preview": "{\n  \"version\": 1,\n  \"dependencies\": {\n    \"net10.0\": {\n      \"FluentValidation\": {\n        \"type\": \"Transitive\",\n       "
  },
  {
    "path": "samples/ServiceDiscovery/DownstreamService/Controllers/CategoriesController.cs",
    "chars": 690,
    "preview": "namespace Ocelot.Samples.ServiceDiscovery.DownstreamService.Controllers;\n\n[ApiController]\n[Route(\"[controller]\")]\npubli"
  },
  {
    "path": "samples/ServiceDiscovery/DownstreamService/Controllers/HealthController.cs",
    "chars": 1569,
    "preview": "using System.Reflection;\n\nnamespace Ocelot.Samples.ServiceDiscovery.DownstreamService.Controllers;\n\nusing Models;\n\n[Api"
  },
  {
    "path": "samples/ServiceDiscovery/DownstreamService/Controllers/WeatherForecastController.cs",
    "chars": 964,
    "preview": "namespace Ocelot.Samples.ServiceDiscovery.DownstreamService.Controllers;\n\nusing Models;\n\n[ApiController]\n[Route(\"[contr"
  },
  {
    "path": "samples/ServiceDiscovery/DownstreamService/Models/HealthResult.cs",
    "chars": 159,
    "preview": "namespace Ocelot.Samples.ServiceDiscovery.DownstreamService.Models;\n\npublic class HealthResult : MicroserviceResult\n{\n "
  },
  {
    "path": "samples/ServiceDiscovery/DownstreamService/Models/MicroserviceResult.cs",
    "chars": 140,
    "preview": "namespace Ocelot.Samples.ServiceDiscovery.DownstreamService.Models;\n\npublic class MicroserviceResult\n{\n    public Uri N"
  },
  {
    "path": "samples/ServiceDiscovery/DownstreamService/Models/ReadyResult.cs",
    "chars": 270,
    "preview": "using System;\n\nnamespace Ocelot.Samples.ServiceDiscovery.DownstreamService.Models;\n\npublic class ReadyResult : Microser"
  },
  {
    "path": "samples/ServiceDiscovery/DownstreamService/Models/WeatherForecast.cs",
    "chars": 293,
    "preview": "namespace Ocelot.Samples.ServiceDiscovery.DownstreamService.Models;\n\npublic class WeatherForecast\n{\n    public DateOnly"
  },
  {
    "path": "samples/ServiceDiscovery/DownstreamService/Ocelot.Samples.ServiceDiscovery.DownstreamService.csproj",
    "chars": 1269,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n\n  <PropertyGroup>\n    <TargetFrameworks>net8.0;net9.0;net10.0</TargetFrameworks>"
  },
  {
    "path": "samples/ServiceDiscovery/DownstreamService/Program.cs",
    "chars": 1131,
    "preview": "global using Microsoft.AspNetCore.Mvc;\nusing System.Text.Json;\nusing System.Text.Json.Serialization;\n\n[assembly: ApiCon"
  },
  {
    "path": "samples/ServiceDiscovery/DownstreamService/Properties/launchSettings.json",
    "chars": 1611,
    "preview": "{\n  \"profiles\": {\n    \"http\": {\n      \"commandName\": \"Project\",\n      \"launchBrowser\": true,\n      \"launchUrl\": \"swagger"
  },
  {
    "path": "samples/ServiceDiscovery/DownstreamService/appsettings.Development.json",
    "chars": 233,
    "preview": "{\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Debug\",\n      \"Microsoft\": \"Information\",\n      \"Microsoft.AspNetCo"
  },
  {
    "path": "samples/ServiceDiscovery/DownstreamService/appsettings.json",
    "chars": 97,
    "preview": "{\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Warning\"\n    }\n  },\n  \"AllowedHosts\": \"*\"\n}\n"
  },
  {
    "path": "samples/ServiceDiscovery/DownstreamService/packages.lock.json",
    "chars": 5733,
    "preview": "{\n  \"version\": 1,\n  \"dependencies\": {\n    \"net10.0\": {\n      \"Swashbuckle.AspNetCore\": {\n        \"type\": \"Direct\",\n     "
  },
  {
    "path": "samples/ServiceDiscovery/Ocelot.Samples.ServiceDiscovery.sln",
    "chars": 1736,
    "preview": "\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 17\nVisualStudioVersion = 17.6.3372"
  },
  {
    "path": "samples/ServiceDiscovery/README.md",
    "chars": 749,
    "preview": "# Ocelot Service Discovery Custom Provider\n> An example how to build custom service discovery in Ocelot.<br/>\n> **Docume"
  }
]

// ... and 839 more files (download for full content)

About this extraction

This page contains the full source code of the ThreeMammals/Ocelot GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1039 files (4.0 MB), approximately 1.1M tokens, and a symbol index with 5162 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!