public bool Build(TransformBuilderContext context, IReadOnlyDictionary<string, string> transformValues)
        {
            if (transformValues.TryGetValue(RequestHeadersCopyKey, out var copyHeaders))
            {
                TransformHelpers.CheckTooManyParameters(transformValues, expected: 1);
                context.CopyRequestHeaders = bool.Parse(copyHeaders);
            }
            else if (transformValues.TryGetValue(RequestHeaderOriginalHostKey, out var originalHost))
            {
                TransformHelpers.CheckTooManyParameters(transformValues, expected: 1);
                context.AddOriginalHost(bool.Parse(originalHost));
            }
            else if (transformValues.TryGetValue(RequestHeaderKey, out var headerName))
            {
                TransformHelpers.CheckTooManyParameters(transformValues, expected: 2);
                if (transformValues.TryGetValue(SetKey, out var setValue))
                {
                    context.AddRequestHeader(headerName, setValue, append: false);
                }
                else if (transformValues.TryGetValue(AppendKey, out var appendValue))
                {
                    context.AddRequestHeader(headerName, appendValue, append: true);
                }
                else
                {
                    throw new ArgumentException($"Unexpected parameters for RequestHeader: {string.Join(';', transformValues.Keys)}. Expected 'Set' or 'Append'");
                }
            }
            else
            {
                return false;
            }

            return true;
        }
        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));
        }
Esempio n. 3
0
        public bool Build(TransformBuilderContext context, IReadOnlyDictionary <string, string> transformValues)
        {
            if (transformValues.TryGetValue(RequestHeadersCopyKey, out var copyHeaders))
            {
                TransformHelpers.CheckTooManyParameters(transformValues, expected: 1);
                context.CopyRequestHeaders = bool.Parse(copyHeaders);
            }
            else if (transformValues.TryGetValue(RequestHeaderOriginalHostKey, out var originalHost))
            {
                TransformHelpers.CheckTooManyParameters(transformValues, expected: 1);
                context.AddOriginalHost(bool.Parse(originalHost));
            }
            else if (transformValues.TryGetValue(RequestHeaderKey, out var headerName))
            {
                TransformHelpers.CheckTooManyParameters(transformValues, expected: 2);
                if (transformValues.TryGetValue(SetKey, out var setValue))
                {
                    context.AddRequestHeader(headerName, setValue, append: false);
                }
                else if (transformValues.TryGetValue(AppendKey, out var appendValue))
                {
                    context.AddRequestHeader(headerName, appendValue, append: true);
                }
                else
                {
                    throw new ArgumentException($"Unexpected parameters for RequestHeader: {string.Join(';', transformValues.Keys)}. Expected 'Set' or 'Append'");
                }
            }
            else if (transformValues.TryGetValue(RequestHeaderRemoveKey, out var removeHeaderName))
            {
                TransformHelpers.CheckTooManyParameters(transformValues, expected: 1);
                context.AddRequestHeaderRemove(removeHeaderName);
            }
            else if (transformValues.TryGetValue(RequestHeadersAllowedKey, out var allowedHeaders))
            {
                TransformHelpers.CheckTooManyParameters(transformValues, expected: 1);
                var headersList = allowedHeaders.Split(';', options: StringSplitOptions.RemoveEmptyEntries
#if NET
                                                       | StringSplitOptions.TrimEntries
#endif
                                                       );
                context.AddRequestHeadersAllowed(headersList);
            }
            else
            {
                return(false);
            }

            return(true);
        }
        // This is separate from Build for testing purposes.
        internal StructuredTransformer BuildInternal(ProxyRoute route, Cluster 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);
            }

            // 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));
        }