Esempio n. 1
0
        public bool Build(TransformBuilderContext context, IReadOnlyDictionary <string, string> transformValues)
        {
            if (transformValues.TryGetValue(PathSetKey, out var pathSet))
            {
                TransformHelpers.CheckTooManyParameters(transformValues, expected: 1);
                var path = MakePathString(pathSet);
                context.AddPathSet(path);
            }
            else if (transformValues.TryGetValue(PathPrefixKey, out var pathPrefix))
            {
                TransformHelpers.CheckTooManyParameters(transformValues, expected: 1);
                var path = MakePathString(pathPrefix);
                context.AddPathPrefix(path);
            }
            else if (transformValues.TryGetValue(PathRemovePrefixKey, out var pathRemovePrefix))
            {
                TransformHelpers.CheckTooManyParameters(transformValues, expected: 1);
                var path = MakePathString(pathRemovePrefix);
                context.AddPathRemovePrefix(path);
            }
            else if (transformValues.TryGetValue(PathPatternKey, out var pathPattern))
            {
                TransformHelpers.CheckTooManyParameters(transformValues, expected: 1);
                var path = MakePathString(pathPattern);
                // We don't use the extension here because we want to avoid doing a DI lookup for the binder every time.
                context.RequestTransforms.Add(new PathRouteValuesTransform(path.Value !, _binderFactory));
            }
            else
            {
                return(false);
            }

            return(true);
        }
Esempio n. 2
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);
        }
Esempio n. 3
0
        public bool Build(TransformBuilderContext context, IReadOnlyDictionary <string, string> transformValues)
        {
            if (transformValues.TryGetValue(QueryValueParameterKey, out var queryValueParameter))
            {
                TransformHelpers.CheckTooManyParameters(transformValues, expected: 2);
                if (transformValues.TryGetValue(AppendKey, out var appendValue))
                {
                    context.AddQueryValue(queryValueParameter, appendValue, append: true);
                }
                else if (transformValues.TryGetValue(SetKey, out var setValue))
                {
                    context.AddQueryValue(queryValueParameter, setValue, append: false);
                }
                else
                {
                    throw new NotSupportedException(string.Join(";", transformValues.Keys));
                }
            }
            else if (transformValues.TryGetValue(QueryRouteParameterKey, out var queryRouteParameter))
            {
                TransformHelpers.CheckTooManyParameters(transformValues, expected: 2);
                if (transformValues.TryGetValue(AppendKey, out var routeValueKeyAppend))
                {
                    context.AddQueryRouteValue(queryRouteParameter, routeValueKeyAppend, append: true);
                }
                else if (transformValues.TryGetValue(SetKey, out var routeValueKeySet))
                {
                    context.AddQueryRouteValue(queryRouteParameter, routeValueKeySet, append: false);
                }
                else
                {
                    throw new NotSupportedException(string.Join(";", transformValues.Keys));
                }
            }
            else if (transformValues.TryGetValue(QueryRemoveParameterKey, out var removeQueryParameter))
            {
                TransformHelpers.CheckTooManyParameters(transformValues, expected: 1);
                context.AddQueryRemoveKey(removeQueryParameter);
            }
            else
            {
                return(false);
            }

            return(true);
        }
    public bool Build(TransformBuilderContext context, IReadOnlyDictionary <string, string> transformValues)
    {
        if (transformValues.TryGetValue(HttpMethodChangeKey, out var fromHttpMethod))
        {
            TransformHelpers.CheckTooManyParameters(transformValues, expected: 2);
            if (transformValues.TryGetValue(SetKey, out var toHttpMethod))
            {
                context.AddHttpMethodChange(fromHttpMethod, toHttpMethod);
            }
        }
        else
        {
            return(false);
        }

        return(true);
    }
    public bool Validate(TransformRouteValidationContext context, IReadOnlyDictionary <string, string> transformValues)
    {
        if (transformValues.TryGetValue(HttpMethodChangeKey, out var _))
        {
            TransformHelpers.CheckTooManyParameters(transformValues, expected: 2);
            if (!transformValues.TryGetValue(SetKey, out var _))
            {
                context.Errors.Add(new ArgumentException($"Unexpected parameters for HttpMethod: {string.Join(';', transformValues.Keys)}. Expected 'Set'"));
            }
        }
        else
        {
            return(false);
        }

        return(true);
    }
Esempio n. 6
0
        public bool Build(TransformBuilderContext context, IReadOnlyDictionary <string, string> transformValues)
        {
            if (transformValues.TryGetValue(XForwardedKey, out var xforwardedHeaders))
            {
                var expected = 1;

                var append = true;
                if (transformValues.TryGetValue(AppendKey, out var appendValue))
                {
                    expected++;
                    append = bool.Parse(appendValue);
                }

                var prefix = "X-Forwarded-";
                if (transformValues.TryGetValue(PrefixForwardedKey, out var prefixValue))
                {
                    expected++;
                    prefix = prefixValue;
                }

                TransformHelpers.CheckTooManyParameters(transformValues, expected);

                // for, host, proto, Prefix
                var  tokens = xforwardedHeaders.Split(new[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries);
                bool useFor, useHost, useProto, usePrefix;
                useFor = useHost = useProto = usePrefix = false;

                foreach (var token in tokens)
                {
                    if (string.Equals(token, ForKey, StringComparison.OrdinalIgnoreCase))
                    {
                        useFor = true;
                    }
                    else if (string.Equals(token, HostKey, StringComparison.OrdinalIgnoreCase))
                    {
                        useHost = true;
                    }
                    else if (string.Equals(token, ProtoKey, StringComparison.OrdinalIgnoreCase))
                    {
                        useProto = true;
                    }
                    else if (string.Equals(token, PrefixKey, StringComparison.OrdinalIgnoreCase))
                    {
                        usePrefix = true;
                    }
                    else
                    {
                        throw new ArgumentException($"Unexpected value for X-Forwarded: {token}. Expected 'for', 'host', 'proto', or 'Prefix'");
                    }
                }

                context.AddXForwarded(prefix, useFor, useHost, useProto, usePrefix, append);
            }
            else if (transformValues.TryGetValue(ForwardedKey, out var forwardedHeader))
            {
                var useHost   = false;
                var useProto  = false;
                var useFor    = false;
                var useBy     = false;
                var forFormat = NodeFormat.None;
                var byFormat  = NodeFormat.None;

                // for, host, proto, Prefix
                var tokens = forwardedHeader.Split(new[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries);

                foreach (var token in tokens)
                {
                    if (string.Equals(token, ForKey, StringComparison.OrdinalIgnoreCase))
                    {
                        useFor    = true;
                        forFormat = NodeFormat.Random; // RFC Default
                    }
                    else if (string.Equals(token, ByKey, StringComparison.OrdinalIgnoreCase))
                    {
                        useBy    = true;
                        byFormat = NodeFormat.Random; // RFC Default
                    }
                    else if (string.Equals(token, HostKey, StringComparison.OrdinalIgnoreCase))
                    {
                        useHost = true;
                    }
                    else if (string.Equals(token, ProtoKey, StringComparison.OrdinalIgnoreCase))
                    {
                        useProto = true;
                    }
                    else
                    {
                        throw new ArgumentException($"Unexpected value for X-Forwarded: {token}. Expected 'for', 'host', 'proto', or 'by'");
                    }
                }

                var expected = 1;

                var append = true;
                if (transformValues.TryGetValue(AppendKey, out var appendValue))
                {
                    expected++;
                    append = bool.Parse(appendValue);
                }

                if (useFor && transformValues.TryGetValue(ForFormatKey, out var forFormatString))
                {
                    expected++;
                    forFormat = Enum.Parse <NodeFormat>(forFormatString, ignoreCase: true);
                }

                if (useBy && transformValues.TryGetValue(ByFormatKey, out var byFormatString))
                {
                    expected++;
                    byFormat = Enum.Parse <NodeFormat>(byFormatString, ignoreCase: true);
                }

                TransformHelpers.CheckTooManyParameters(transformValues, expected);

                context.UseDefaultForwarders = false;
                if (useBy || useFor || useHost || useProto)
                {
                    // Not using the extension to avoid resolving the random factory each time.
                    context.RequestTransforms.Add(new RequestHeaderForwardedTransform(_randomFactory, forFormat, byFormat, useHost, useProto, append));
                }
            }
            else if (transformValues.TryGetValue(ClientCertKey, out var clientCertHeader))
            {
                TransformHelpers.CheckTooManyParameters(transformValues, expected: 1);
                context.AddClientCertHeader(clientCertHeader);
            }
            else
            {
                return(false);
            }

            return(true);
        }
Esempio n. 7
0
        public bool Build(TransformBuilderContext context, IReadOnlyDictionary <string, string> transformValues)
        {
            if (transformValues.TryGetValue(ResponseHeadersCopyKey, out var copyHeaders))
            {
                TransformHelpers.CheckTooManyParameters(transformValues, expected: 1);
                context.CopyResponseHeaders = bool.Parse(copyHeaders);
            }
            else if (transformValues.TryGetValue(ResponseTrailersCopyKey, out copyHeaders))
            {
                TransformHelpers.CheckTooManyParameters(transformValues, expected: 1);
                context.CopyResponseTrailers = bool.Parse(copyHeaders);
            }
            else if (transformValues.TryGetValue(ResponseHeaderKey, out var responseHeaderName))
            {
                var always = false;
                if (transformValues.TryGetValue(WhenKey, out var whenValue))
                {
                    TransformHelpers.CheckTooManyParameters(transformValues, expected: 3);
                    always = string.Equals(AlwaysValue, whenValue, StringComparison.OrdinalIgnoreCase);
                }
                else
                {
                    TransformHelpers.CheckTooManyParameters(transformValues, expected: 2);
                }

                if (transformValues.TryGetValue(SetKey, out var setValue))
                {
                    context.AddResponseHeader(responseHeaderName, setValue, append: false, always);
                }
                else if (transformValues.TryGetValue(AppendKey, out var appendValue))
                {
                    context.AddResponseHeader(responseHeaderName, appendValue, append: true, always);
                }
                else
                {
                    throw new ArgumentException($"Unexpected parameters for ResponseHeader: {string.Join(';', transformValues.Keys)}. Expected 'Set' or 'Append'");
                }
            }
            else if (transformValues.TryGetValue(ResponseTrailerKey, out var responseTrailerName))
            {
                var always = false;
                if (transformValues.TryGetValue(WhenKey, out var whenValue))
                {
                    TransformHelpers.CheckTooManyParameters(transformValues, expected: 3);
                    always = string.Equals(AlwaysValue, whenValue, StringComparison.OrdinalIgnoreCase);
                }
                else
                {
                    TransformHelpers.CheckTooManyParameters(transformValues, expected: 2);
                }

                if (transformValues.TryGetValue(SetKey, out var setValue))
                {
                    context.AddResponseTrailer(responseTrailerName, setValue, append: false, always);
                }
                else if (transformValues.TryGetValue(AppendKey, out var appendValue))
                {
                    context.AddResponseTrailer(responseTrailerName, appendValue, append: true, always);
                }
                else
                {
                    throw new ArgumentException($"Unexpected parameters for ResponseTrailer: {string.Join(';', transformValues.Keys)}. Expected 'Set' or 'Append'");
                }
            }
            else if (transformValues.TryGetValue(ResponseHeaderRemoveKey, out var removeResponseHeaderName))
            {
                var always = false;
                if (transformValues.TryGetValue(WhenKey, out var whenValue))
                {
                    TransformHelpers.CheckTooManyParameters(transformValues, expected: 2);
                    always = string.Equals(AlwaysValue, whenValue, StringComparison.OrdinalIgnoreCase);
                }
                else
                {
                    TransformHelpers.CheckTooManyParameters(transformValues, expected: 1);
                }

                context.AddResponseHeaderRemove(removeResponseHeaderName, always);
            }
            else if (transformValues.TryGetValue(ResponseTrailerRemoveKey, out var removeResponseTrailerName))
            {
                var always = false;
                if (transformValues.TryGetValue(WhenKey, out var whenValue))
                {
                    TransformHelpers.CheckTooManyParameters(transformValues, expected: 2);
                    always = string.Equals(AlwaysValue, whenValue, StringComparison.OrdinalIgnoreCase);
                }
                else
                {
                    TransformHelpers.CheckTooManyParameters(transformValues, expected: 1);
                }

                context.AddResponseTrailerRemove(removeResponseTrailerName, always);
            }
            else if (transformValues.TryGetValue(ResponseHeadersAllowedKey, out var allowedHeaders))
            {
                TransformHelpers.CheckTooManyParameters(transformValues, expected: 1);
                var headersList = allowedHeaders.Split(';', options: StringSplitOptions.RemoveEmptyEntries
#if NET
                                                       | StringSplitOptions.TrimEntries
#endif
                                                       );
                context.AddResponseHeadersAllowed(headersList);
            }
            else if (transformValues.TryGetValue(ResponseTrailersAllowedKey, out var allowedTrailers))
            {
                TransformHelpers.CheckTooManyParameters(transformValues, expected: 1);
                var headersList = allowedTrailers.Split(';', options: StringSplitOptions.RemoveEmptyEntries
#if NET
                                                        | StringSplitOptions.TrimEntries
#endif
                                                        );
                context.AddResponseTrailersAllowed(headersList);
            }
            else
            {
                return(false);
            }

            return(true);
        }
        public bool Build(TransformBuilderContext context, IReadOnlyDictionary <string, string> transformValues)
        {
            if (transformValues.TryGetValue(XForwardedKey, out var headerValue))
            {
                var xExpected = 1;

                var defaultXAction = Enum.Parse <ForwardedTransformActions>(headerValue);

                var prefix = DefaultXForwardedPrefix;
                if (transformValues.TryGetValue(HeaderPrefixKey, out var prefixValue))
                {
                    xExpected++;
                    prefix = prefixValue;
                }

                var xForAction = defaultXAction;
                if (transformValues.TryGetValue(ForKey, out headerValue))
                {
                    xExpected++;
                    xForAction = Enum.Parse <ForwardedTransformActions>(headerValue);
                }

                var xPrefixAction = defaultXAction;
                if (transformValues.TryGetValue(PrefixKey, out headerValue))
                {
                    xExpected++;
                    xPrefixAction = Enum.Parse <ForwardedTransformActions>(headerValue);
                }

                var xHostAction = defaultXAction;
                if (transformValues.TryGetValue(HostKey, out headerValue))
                {
                    xExpected++;
                    xHostAction = Enum.Parse <ForwardedTransformActions>(headerValue);
                }

                var xProtoAction = defaultXAction;
                if (transformValues.TryGetValue(ProtoKey, out headerValue))
                {
                    xExpected++;
                    xProtoAction = Enum.Parse <ForwardedTransformActions>(headerValue);;
                }

                TransformHelpers.CheckTooManyParameters(transformValues, xExpected);

                context.AddXForwardedFor(prefix + ForKey, xForAction);
                context.AddXForwardedPrefix(prefix + PrefixKey, xPrefixAction);
                context.AddXForwardedHost(prefix + HostKey, xHostAction);
                context.AddXForwardedProto(prefix + ProtoKey, xProtoAction);

                if (xForAction != ForwardedTransformActions.Off || xPrefixAction != ForwardedTransformActions.Off ||
                    xHostAction != ForwardedTransformActions.Off || xProtoAction != ForwardedTransformActions.Off)
                {
                    // Remove the Forwarded header when an X-Forwarded transform is enabled
                    TransformHelpers.RemoveForwardedHeader(context);
                }
            }
            else if (transformValues.TryGetValue(ForwardedKey, out var forwardedHeader))
            {
                var useHost   = false;
                var useProto  = false;
                var useFor    = false;
                var useBy     = false;
                var forFormat = NodeFormat.None;
                var byFormat  = NodeFormat.None;

                // for, host, proto, Prefix
                var tokens = forwardedHeader.Split(new[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries);

                foreach (var token in tokens)
                {
                    if (string.Equals(token, ForKey, StringComparison.OrdinalIgnoreCase))
                    {
                        useFor    = true;
                        forFormat = NodeFormat.Random; // RFC Default
                    }
                    else if (string.Equals(token, ByKey, StringComparison.OrdinalIgnoreCase))
                    {
                        useBy    = true;
                        byFormat = NodeFormat.Random; // RFC Default
                    }
                    else if (string.Equals(token, HostKey, StringComparison.OrdinalIgnoreCase))
                    {
                        useHost = true;
                    }
                    else if (string.Equals(token, ProtoKey, StringComparison.OrdinalIgnoreCase))
                    {
                        useProto = true;
                    }
                    else
                    {
                        throw new ArgumentException($"Unexpected value for Forwarded: {token}. Expected 'for', 'host', 'proto', or 'by'");
                    }
                }

                var expected = 1;

                var headerAction = ForwardedTransformActions.Set;
                if (transformValues.TryGetValue(ActionKey, out headerValue))
                {
                    expected++;
                    headerAction = Enum.Parse <ForwardedTransformActions>(headerValue);
                }

                if (useFor && transformValues.TryGetValue(ForFormatKey, out var forFormatString))
                {
                    expected++;
                    forFormat = Enum.Parse <NodeFormat>(forFormatString, ignoreCase: true);
                }

                if (useBy && transformValues.TryGetValue(ByFormatKey, out var byFormatString))
                {
                    expected++;
                    byFormat = Enum.Parse <NodeFormat>(byFormatString, ignoreCase: true);
                }

                TransformHelpers.CheckTooManyParameters(transformValues, expected);

                context.UseDefaultForwarders = false;
                if (headerAction != ForwardedTransformActions.Off && (useBy || useFor || useHost || useProto))
                {
                    // Not using the extension to avoid resolving the random factory each time.
                    context.RequestTransforms.Add(new RequestHeaderForwardedTransform(_randomFactory, forFormat, byFormat, useHost, useProto, headerAction));

                    // Remove the X-Forwarded headers when an Forwarded transform is enabled
                    TransformHelpers.RemoveAllXForwardedHeaders(context, DefaultXForwardedPrefix);
                }
            }
            else if (transformValues.TryGetValue(ClientCertKey, out var clientCertHeader))
            {
                TransformHelpers.CheckTooManyParameters(transformValues, expected: 1);
                context.AddClientCertHeader(clientCertHeader);
            }
            else
            {
                return(false);
            }

            return(true);
        }