Ejemplo n.º 1
0
    private static Predicate AddOrleansHttpGateway(this IOcelotPipelineBuilder builder, OcelotPipelineConfiguration pipelineConfiguration)
    {
        // Now we have the ds route we can transform headers and stuff?
        builder.UseHttpHeadersTransformationMiddleware();

        // Initialises downstream request
        builder.UseDownstreamRequestInitialiser();

        // We check whether the request is ratelimit, and if there is no continue processing
        builder.UseRateLimiting();

        // This adds or updates the request id (initally we try and set this based on global config in the error handling middleware)
        // If anything was set at global level and we have a different setting at re route level the global stuff will be overwritten
        // This means you can get a scenario where you have a different request id from the first piece of middleware to the request id middleware.
        builder.UseRequestIdMiddleware();

        // Allow pre authentication logic. The idea being people might want to run something custom before what is built in.
        builder.UseIfNotNull(pipelineConfiguration.PreAuthenticationMiddleware);

        // Now we know where the client is going to go we can authenticate them.
        // We allow the ocelot middleware to be overriden by whatever the
        // user wants
        if (pipelineConfiguration.AuthenticationMiddleware == null)
        {
            builder.UseAuthenticationMiddleware();
        }
        else
        {
            builder.Use(pipelineConfiguration.AuthenticationMiddleware);
        }

        // The next thing we do is look at any claims transforms in case this is important for authorisation
        builder.UseClaimsToClaimsMiddleware();

        // Allow pre authorisation logic. The idea being people might want to run something custom before what is built in.
        builder.UseIfNotNull(pipelineConfiguration.PreAuthorisationMiddleware);

        // Now we have authenticated and done any claims transformation we
        // can authorise the request
        // We allow the ocelot middleware to be overriden by whatever the
        // user wants
        if (pipelineConfiguration.AuthorisationMiddleware == null)
        {
            builder.UseAuthorisationMiddleware();
        }
        else
        {
            builder.Use(pipelineConfiguration.AuthorisationMiddleware);
        }

        // Now we can run any header transformation logic
        builder.UseClaimsToHeadersMiddleware();

        // Allow the user to implement their own query string manipulation logic
        builder.UseIfNotNull(pipelineConfiguration.PreQueryStringBuilderMiddleware);

        // Now we can run any query string transformation logic
        builder.UseClaimsToQueryStringMiddleware();

        // This takes the downstream route we retrieved earlier and replaces any placeholders with the variables that should be used
        builder.UseDownstreamUrlCreatorMiddleware();

        // Not sure if this is the best place for this but we use the downstream url
        // as the basis for our cache key.
        builder.UseOutputCacheMiddleware();

        //We fire off the request and set the response on the scoped data repo
        builder.UseOrleansRequesterMiddleware();


        return((context) =>
        {
            return context.DownstreamReRoute.DownstreamScheme.Equals("orleans", StringComparison.OrdinalIgnoreCase);
        });
    }