private static StructuredTransformer CreateTransformer(TransformBuilderContext context)
        {
            // RequestHeaderOriginalHostKey defaults to false, and CopyRequestHeaders defaults to true.
            // If RequestHeaderOriginalHostKey was not specified then we need to make sure the transform gets
            // added anyways to remove the original host. If CopyRequestHeaders is false then we can omit the
            // transform.
            if (context.CopyRequestHeaders.GetValueOrDefault(true) &&
                !context.RequestTransforms.Any(item => item is RequestHeaderOriginalHostTransform))
            {
                context.AddOriginalHost(false);
            }

            // Add default forwarders only if they haven't already been added or disabled.
            if (context.UseDefaultForwarders.GetValueOrDefault(true))
            {
                context.AddXForwarded();
            }

            return(new StructuredTransformer(
                       context.CopyRequestHeaders,
                       context.CopyResponseHeaders,
                       context.CopyResponseTrailers,
                       context.RequestTransforms,
                       context.ResponseTransforms,
                       context.ResponseTrailersTransforms));
        }
 internal static void RemoveAllXForwardedHeaders(TransformBuilderContext context, string prefix)
 {
     context.AddXForwardedFor(prefix + ForwardedTransformFactory.ForKey, ForwardedTransformActions.Remove);
     context.AddXForwardedPrefix(prefix + ForwardedTransformFactory.PrefixKey, ForwardedTransformActions.Remove);
     context.AddXForwardedHost(prefix + ForwardedTransformFactory.HostKey, ForwardedTransformActions.Remove);
     context.AddXForwardedProto(prefix + ForwardedTransformFactory.ProtoKey, ForwardedTransformActions.Remove);
 }
        internal StructuredTransformer CreateInternal(Action <TransformBuilderContext> action)
        {
            var context = new TransformBuilderContext
            {
                Services = _services,
            };

            action(context);

            return(CreateTransformer(context));
        }
        // This is separate from Build for testing purposes.
        internal StructuredTransformer BuildInternal(RouteConfig route, ClusterConfig?cluster)
        {
            var rawTransforms = route.Transforms;

            var context = new TransformBuilderContext
            {
                Services = _services,
                Route    = route,
                Cluster  = cluster,
            };

            if (rawTransforms?.Count > 0)
            {
                foreach (var rawTransform in rawTransforms)
                {
                    var handled = false;
                    foreach (var factory in _factories)
                    {
                        if (factory.Build(context, rawTransform))
                        {
                            handled = true;
                            break;
                        }
                    }

                    if (!handled)
                    {
                        throw new ArgumentException($"Unknown transform: {string.Join(';', rawTransform.Keys)}");
                    }
                }
            }

            // Let the app add any more transforms it wants.
            foreach (var transformProvider in _providers)
            {
                transformProvider.Apply(context);
            }

            return(CreateTransformer(context));
        }
 public void Apply(TransformBuilderContext transformBuildContext)
 {
     _action(transformBuildContext);
 }
 internal static void RemoveForwardedHeader(TransformBuilderContext context)
 {
     context.RequestTransforms.Add(RequestHeaderForwardedTransform.RemoveTransform);
 }