Example #1
0
 public override string Evaluate(RewriteContext context, BackReferenceCollection ruleBackReferences, BackReferenceCollection conditionBackReferences)
 {
     if (context.HttpContext.Connection.RemoteIpAddress == null)
     {
         return("off");
     }
     return(context.HttpContext.Connection.RemoteIpAddress.AddressFamily == AddressFamily.InterNetworkV6 ? "on" : "off");
 }
Example #2
0
        public override string Evaluate(RewriteContext context, BackReferenceCollection ruleBackRefernces, BackReferenceCollection conditionBackReferences)
        {
            var queryString = context.HttpContext.Request.QueryString.ToString();

            if (!string.IsNullOrEmpty(queryString))
            {
                return(queryString.Substring(1));
            }

            return(queryString);
        }
Example #3
0
        public override void ApplyAction(RewriteContext context, BackReferenceCollection ruleBackReferences, BackReferenceCollection conditionBackReferences)
        {
            var pattern  = Url.Evaluate(context, ruleBackReferences, conditionBackReferences);
            var response = context.HttpContext.Response;
            var pathBase = context.HttpContext.Request.PathBase;

            if (EscapeBackReferences)
            {
                // because escapebackreferences will be encapsulated by the pattern, just escape the pattern
                pattern = Uri.EscapeDataString(pattern);
            }

            if (string.IsNullOrEmpty(pattern))
            {
                response.Headers[HeaderNames.Location] = pathBase.HasValue ? pathBase.Value : "/";
                return;
            }


            if (pattern.IndexOf("://", StringComparison.Ordinal) == -1 && pattern[0] != '/')
            {
                pattern = '/' + pattern;
            }
            response.StatusCode = StatusCode;

            // url can either contain the full url or the path and query
            // always add to location header.
            // TODO check for false positives
            var split = pattern.IndexOf('?');

            if (split >= 0 && QueryStringAppend)
            {
                var query = context.HttpContext.Request.QueryString.Add(
                    QueryString.FromUriComponent(
                        pattern.Substring(split)));

                // not using the response.redirect here because status codes may be 301, 302, 307, 308
                response.Headers[HeaderNames.Location] = pathBase + pattern.Substring(0, split) + query;
            }
            else
            {
                // If the request url has a query string and the target does not, append the query string
                // by default.
                if (QueryStringDelete)
                {
                    response.Headers[HeaderNames.Location] = pathBase + pattern;
                }
                else
                {
                    response.Headers[HeaderNames.Location] = pathBase + pattern + context.HttpContext.Request.QueryString;
                }
            }
            context.Result = RuleResult.EndResponse;
        }
Example #4
0
        public override string Evaluate(RewriteContext context, BackReferenceCollection ruleBackReferences, BackReferenceCollection conditionBackReferences)
        {
            // PERF as we share the string builder across the context, we need to make a new one here to evaluate
            // lowercase segments.
            var tempBuilder = context.Builder;

            context.Builder = new StringBuilder(64);
            var pattern = _pattern.Evaluate(context, ruleBackReferences, conditionBackReferences);

            context.Builder = tempBuilder;
            return(pattern.ToLowerInvariant());
        }
Example #5
0
        public override string Evaluate(RewriteContext context, BackReferenceCollection ruleBackReferences, BackReferenceCollection conditionBackReferences)
        {
            var oldBuilder = context.Builder;

            // PERF
            // Because we need to be able to evaluate multiple nested patterns,
            // we provided a new string builder and evaluate the new pattern,
            // and restore it after evaluation.
            context.Builder = new StringBuilder(64);
            var pattern = _pattern.Evaluate(context, ruleBackReferences, conditionBackReferences);

            context.Builder = oldBuilder;
            return(UrlEncoder.Default.Encode(pattern));
        }
Example #6
0
        public static MatchResults Evaluate(ConditionCollection conditions, RewriteContext context, BackReferenceCollection backReferences)
        {
            BackReferenceCollection prevBackReferences = null;
            MatchResults            condResult         = null;
            var orSucceeded = false;

            foreach (var condition in conditions)
            {
                if (orSucceeded && conditions.Grouping == LogicalGrouping.MatchAny)
                {
                    continue;
                }

                if (orSucceeded)
                {
                    orSucceeded = false;
                    continue;
                }

                condResult = condition.Evaluate(context, backReferences, prevBackReferences);
                var currentBackReferences = condResult.BackReferences;
                if (conditions.Grouping == LogicalGrouping.MatchAny)
                {
                    orSucceeded = condResult.Success;
                }
                else if (!condResult.Success)
                {
                    return(condResult);
                }

                if (condResult.Success && conditions.TrackAllCaptures && prevBackReferences != null)
                {
                    prevBackReferences.Add(currentBackReferences);
                    currentBackReferences = prevBackReferences;
                }

                prevBackReferences = currentBackReferences;
            }

            return(new MatchResults {
                BackReferences = prevBackReferences, Success = condResult.Success
            });
        }
        public override void ApplyAction(RewriteContext context, BackReferenceCollection ruleBackReferences, BackReferenceCollection conditionBackReferences)
        {
            var response = context.HttpContext.Response;

            response.StatusCode = StatusCode;

            if (!string.IsNullOrEmpty(StatusReason))
            {
                context.HttpContext.Features.Get <IHttpResponseFeature>().ReasonPhrase = StatusReason;
            }

            if (!string.IsNullOrEmpty(StatusDescription))
            {
                var content = Encoding.UTF8.GetBytes(StatusDescription);
                response.ContentLength = content.Length;
                response.ContentType   = "text/plain; charset=utf-8";
                response.Body.Write(content, 0, content.Length);
            }

            context.Result = RuleResult.EndResponse;

            context.Logger?.CustomResponse(context.HttpContext.Request.GetEncodedUrl());
        }
Example #8
0
 public abstract string Evaluate(RewriteContext context, BackReferenceCollection ruleBackReferences, BackReferenceCollection conditionBackReferences);
Example #9
0
        public MatchResults Evaluate(RewriteContext context, BackReferenceCollection ruleBackReferences, BackReferenceCollection conditionBackReferences)
        {
            var pattern = Input.Evaluate(context, ruleBackReferences, conditionBackReferences);

            return(Match.Evaluate(pattern, context));
        }
Example #10
0
        public override string Evaluate(RewriteContext context, BackReferenceCollection ruleBackReferences, BackReferenceCollection conditionBackReferences)
        {
            var key = _pattern.Evaluate(context, ruleBackReferences, conditionBackReferences).ToLowerInvariant();

            return(_rewriteMap[key]);
        }
 public static MatchResults Evaluate(IEnumerable <Condition> conditions, RewriteContext context, BackReferenceCollection backReferences)
 {
     return(Evaluate(conditions, context, backReferences, trackAllCaptures: false));
 }
Example #12
0
 public override string Evaluate(RewriteContext context, BackReferenceCollection ruleBackReferences, BackReferenceCollection conditionBackReferences)
 {
     return(context.HttpContext.Connection.RemotePort.ToString(CultureInfo.InvariantCulture));
 }
Example #13
0
 public override void ApplyAction(RewriteContext context, BackReferenceCollection ruleBackReferences, BackReferenceCollection conditionBackReferences)
 {
     context.HttpContext.Abort();
     context.Result = RuleResult.EndResponse;
     context.Logger?.AbortedRequest(context.HttpContext.Request.Path + context.HttpContext.Request.QueryString);
 }
Example #14
0
 public override string Evaluate(RewriteContext context, BackReferenceCollection ruleBackReferences, BackReferenceCollection conditionBackReferences)
 {
     return(_uriMatchPart == UriMatchPart.Full ? context.HttpContext.Request.GetEncodedUrl() : (string)context.HttpContext.Request.Path);
 }
Example #15
0
 // Explicitly say that nothing happens
 public override void ApplyAction(RewriteContext context, BackReferenceCollection ruleBackReferences, BackReferenceCollection conditionBackReferences)
 {
     context.Result = Result;
 }
 public override string Evaluate(RewriteContext context, BackReferenceCollection ruleBackReferences, BackReferenceCollection conditionBackReferences)
 {
     return(context.HttpContext.Request.Method);
 }
Example #17
0
 public override void ApplyAction(RewriteContext context, BackReferenceCollection ruleBackReferences, BackReferenceCollection conditionBackReferences)
 {
     context.HttpContext.Response.StatusCode = StatusCodes.Status410Gone;
     context.Result = RuleResult.EndResponse;
 }
Example #18
0
        public override void ApplyAction(RewriteContext context, BackReferenceCollection ruleBackReferences, BackReferenceCollection conditionBackReferences)
        {
            var pattern = Url.Evaluate(context, ruleBackReferences, conditionBackReferences);
            var request = context.HttpContext.Request;

            if (string.IsNullOrEmpty(pattern))
            {
                pattern = "/";
            }

            if (EscapeBackReferences)
            {
                // because escapebackreferences will be encapsulated by the pattern, just escape the pattern
                pattern = Uri.EscapeDataString(pattern);
            }


            // TODO PERF, substrings, object creation, etc.
            if (pattern.IndexOf(Uri.SchemeDelimiter, StringComparison.Ordinal) >= 0)
            {
                string         scheme;
                HostString     host;
                PathString     path;
                QueryString    query;
                FragmentString fragment;
                UriHelper.FromAbsolute(pattern, out scheme, out host, out path, out query, out fragment);

                if (query.HasValue)
                {
                    if (QueryStringAppend)
                    {
                        request.QueryString = request.QueryString.Add(query);
                    }
                    else
                    {
                        request.QueryString = query;
                    }
                }
                else if (QueryStringDelete)
                {
                    request.QueryString = QueryString.Empty;
                }

                request.Scheme = scheme;
                request.Host   = host;
                request.Path   = path;
            }
            else
            {
                var split = pattern.IndexOf('?');
                if (split >= 0)
                {
                    var path = pattern.Substring(0, split);
                    if (path[0] == '/')
                    {
                        request.Path = PathString.FromUriComponent(path);
                    }
                    else
                    {
                        request.Path = PathString.FromUriComponent('/' + path);
                    }

                    if (QueryStringAppend)
                    {
                        request.QueryString = request.QueryString.Add(
                            QueryString.FromUriComponent(
                                pattern.Substring(split)));
                    }
                    else
                    {
                        request.QueryString = QueryString.FromUriComponent(
                            pattern.Substring(split));
                    }
                }
                else
                {
                    if (pattern[0] == '/')
                    {
                        request.Path = PathString.FromUriComponent(pattern);
                    }
                    else
                    {
                        request.Path = PathString.FromUriComponent('/' + pattern);
                    }

                    if (QueryStringDelete)
                    {
                        request.QueryString = QueryString.Empty;
                    }
                }
            }
            context.Result = Result;
        }
Example #19
0
        public override string Evaluate(RewriteContext context, BackReferenceCollection ruleBackReferences, BackReferenceCollection conditionBackReference)
        {
            switch (_portion)
            {
            case DateTimePortion.Year:
                return(DateTimeOffset.UtcNow.Year.ToString(CultureInfo.InvariantCulture));

            case DateTimePortion.Month:
                return(DateTimeOffset.UtcNow.Month.ToString(CultureInfo.InvariantCulture));

            case DateTimePortion.Day:
                return(DateTimeOffset.UtcNow.Day.ToString(CultureInfo.InvariantCulture));

            case DateTimePortion.Hour:
                return(DateTimeOffset.UtcNow.Hour.ToString(CultureInfo.InvariantCulture));

            case DateTimePortion.Minute:
                return(DateTimeOffset.UtcNow.Minute.ToString(CultureInfo.InvariantCulture));

            case DateTimePortion.Second:
                return(DateTimeOffset.UtcNow.Second.ToString(CultureInfo.InvariantCulture));

            case DateTimePortion.DayOfWeek:
                return(((int)DateTimeOffset.UtcNow.DayOfWeek).ToString(CultureInfo.InvariantCulture));

            case DateTimePortion.Time:
                return(DateTimeOffset.UtcNow.ToString(CultureInfo.InvariantCulture));

            default:
                return(string.Empty);
            }
        }
 public override string Evaluate(RewriteContext context, BackReferenceCollection ruleBackReferences, BackReferenceCollection conditionBackReferences)
 {
     return(context.HttpContext.Connection.LocalIpAddress?.ToString());
 }
Example #21
0
 public override string Evaluate(RewriteContext context, BackReferenceCollection ruleBackReferences, BackReferenceCollection conditionBackReferences)
 {
     return(ruleBackReferences[_index]);
 }
 public override string Evaluate(RewriteContext context, BackReferenceCollection ruleBackReferences, BackReferenceCollection conditionBackReferences)
 {
     return(context.HttpContext.Features.Get <IHttpRequestFeature>()?.Protocol);
 }
        public override void ApplyAction(RewriteContext context, BackReferenceCollection ruleBackReferences, BackReferenceCollection conditionBackReferences)
        {
            var options = GetOrCreateOptions();

            context.HttpContext.Response.Cookies.Append(Name, Value ?? string.Empty, options);
        }
Example #24
0
 public abstract void ApplyAction(RewriteContext context, BackReferenceCollection ruleBackReferences, BackReferenceCollection conditionBackReferences);
 public override string Evaluate(RewriteContext context, BackReferenceCollection ruleBackReferences, BackReferenceCollection conditionBackReferences)
 {
     return(context.HttpContext.GetServerVariable(_variableName) ?? _fallbackThunk().Evaluate(context, ruleBackReferences, conditionBackReferences));
 }