internal bool CheckPrecondition(HttpContextBase httpContext, OutboundRule outboundRule) { Match lastConditionMatch = null; bool isPreconditionMatch = true; if (outboundRule == null) { return(isPreconditionMatch); } var precondition = outboundRule.Precondition; if (precondition == null) { return(isPreconditionMatch); } var conditions = precondition.Conditions; // test conditions matches if (conditions != null && conditions.Any()) { var replacements = new RewriteHelper.Replacements { RequestServerVariables = httpContext.Request.ServerVariables, RequestHeaders = httpContext.Request.Headers, ResponseHeaders = httpContext.Response.Headers }; var conditionMatchResult = RewriteHelper.TestConditionMatches(precondition, replacements, out lastConditionMatch); isPreconditionMatch = conditionMatchResult.Matched; } return(isPreconditionMatch); }
private void ProcessRewriteAction(InboundRule inboundRule, Uri uri, Match inboundRuleMatch, Match lastConditionMatch, InboundRuleResult ruleResult) { var redirectAction = inboundRule.Action as Rewrite; var rewriteUrl = redirectAction.RewriteUrl; var rewriteItemAnchor = redirectAction.RewriteItemAnchor; if (string.IsNullOrEmpty(rewriteUrl)) { ruleResult.RuleMatched = false; return; } // process token replacements var replacements = new RewriteHelper.Replacements { RequestHeaders = RequestHeaders, RequestServerVariables = RequestServerVariables }; rewriteUrl = RewriteHelper.ReplaceTokens(replacements, rewriteUrl); if (redirectAction.AppendQueryString) { rewriteUrl += uri.Query; } rewriteUrl = RewriteHelper.ReplaceRuleBackReferences(inboundRuleMatch, rewriteUrl); rewriteUrl = RewriteHelper.ReplaceConditionBackReferences(lastConditionMatch, rewriteUrl); ruleResult.RewrittenUri = new Uri(rewriteUrl); ruleResult.StopProcessing = redirectAction.StopProcessingOfSubsequentRules; }
internal PreconditionResult CheckPreconditions(HttpContextBase httpContext, List <OutboundRule> outboundRules) { Match lastConditionMatch = null; bool isPreconditionMatch = false; var preconditions = outboundRules.Select(p => p.Precondition) .Where(p => p != null); foreach (var precondition in preconditions) { var conditions = precondition.Conditions; // test conditions matches if (conditions != null && conditions.Any()) { var replacements = new RewriteHelper.Replacements { RequestServerVariables = httpContext.Request.ServerVariables, RequestHeaders = httpContext.Request.Headers, ResponseHeaders = httpContext.Response.Headers }; var conditionMatchResult = RewriteHelper.TestConditionMatches(precondition, replacements, out lastConditionMatch); isPreconditionMatch = conditionMatchResult.Matched; } } var result = new PreconditionResult { Passed = isPreconditionMatch }; return(result); }
private OutboundRuleResult ProcessRegularExpressionOutboundRule(OutboundRuleResult ruleResult, OutboundRule outboundRule) { Match outboundRuleMatch, lastConditionMatch = null; // test rule match var isRuleMatch = true; ConditionMatchResult conditionMatchResult = null; // test conditions matches if (outboundRule.Conditions != null && outboundRule.Conditions.Any()) { var replacements = new RewriteHelper.Replacements { RequestHeaders = RequestHeaders, RequestServerVariables = RequestServerVariables, ResponseHeaders = ResponseHeaders }; conditionMatchResult = RewriteHelper.TestConditionMatches(outboundRule, replacements, out lastConditionMatch); isRuleMatch = conditionMatchResult.Matched; } if (isRuleMatch) { ruleResult.RewrittenResponseString = ProcessRuleReplacements(ruleResult.OriginalResponseString, outboundRule); ruleResult.RuleMatched = true; } return(ruleResult); }
public void ReplaceTokens() { // arrange var replacements = new RewriteHelper.Replacements() { RequestServerVariables = new NameValueCollection() { { "HTTPS", "off" }, { "HTTP_HOST", "www.iamandycohen.com"}, { "QUERY_STRING", "var1=1&var2=2"}, }, RequestHeaders = new NameValueCollection() { { "X-Custom-Header", "This is a test"} }, ResponseHeaders = new NameValueCollection() { { "Content-Type", @"text/html"} } }; var inputString = "test {QUERY_STRING} test {REQUEST_X_Custom_Header} test {RESPONSE_Content_Type} test {HTTPS} test"; // act var replacementOutput = RewriteHelper.ReplaceTokens(replacements, inputString); // assert Assert.AreEqual(replacementOutput, @"test var1=1&var2=2 test This is a test test text/html test off test"); }
private void ProcessItemQueryRedirectAction(InboundRule inboundRule, Uri uri, Match inboundRuleMatch, Match lastConditionMatch, InboundRuleResult ruleResult) { var redirectAction = inboundRule.Action as ItemQueryRedirect; var itemQuery = redirectAction.ItemQuery; if (string.IsNullOrEmpty(itemQuery)) { ruleResult.RuleMatched = false; return; } // process token replacements in the item query itemQuery = RewriteHelper.ReplaceRuleBackReferences(inboundRuleMatch, itemQuery); itemQuery = RewriteHelper.ReplaceConditionBackReferences(lastConditionMatch, itemQuery); var rewriteItemId = ExecuteItemQuery(itemQuery); if (!rewriteItemId.HasValue) { ruleResult.RuleMatched = false; return; } string rewriteUrl = GetRewriteUrlFromItemId(rewriteItemId.Value, null, null); // process token replacements var replacements = new RewriteHelper.Replacements { RequestHeaders = RequestHeaders, RequestServerVariables = RequestServerVariables }; rewriteUrl = RewriteHelper.ReplaceTokens(replacements, rewriteUrl); rewriteUrl = RewriteHelper.ReplaceRuleBackReferences(inboundRuleMatch, rewriteUrl); rewriteUrl = RewriteHelper.ReplaceConditionBackReferences(lastConditionMatch, rewriteUrl); ruleResult.RewrittenUri = new Uri(rewriteUrl); ruleResult.StopProcessing = redirectAction.StopProcessingOfSubsequentRules; }
private InboundRuleResult ProcessRegularExpressionInboundRule(Uri originalUri, InboundRule inboundRule) { var ruleResult = new InboundRuleResult { OriginalUri = originalUri, RewrittenUri = originalUri }; Match inboundRuleMatch, lastConditionMatch = null; // test rule match var isInboundRuleMatch = TestRuleMatches(inboundRule, originalUri, out inboundRuleMatch); ConditionMatchResult conditionMatchResult = null; // test conditions matches if (isInboundRuleMatch && inboundRule.Conditions != null && inboundRule.Conditions.Any()) { var replacements = new RewriteHelper.Replacements { RequestHeaders = RequestHeaders, RequestServerVariables = RequestServerVariables }; conditionMatchResult = RewriteHelper.TestConditionMatches(inboundRule, replacements, out lastConditionMatch); isInboundRuleMatch = conditionMatchResult.Matched; } // test site name restrictions if (isInboundRuleMatch && !string.IsNullOrEmpty(inboundRule.SiteNameRestriction)) { isInboundRuleMatch = TestSiteNameRestriction(inboundRule); } if (isInboundRuleMatch && inboundRule.Action != null) { ruleResult.RuleMatched = true; if (inboundRule.ResponseHeaders.Any()) { ruleResult.ResponseHeaders = inboundRule.ResponseHeaders; } Log.Debug(this, "INBOUND RULE MATCH - requestUri: {0} inboundRule: {1}", originalUri, inboundRule.Name); // TODO: Need to implement Rewrite, None if (inboundRule.Action is Redirect) { ProcessRedirectAction(inboundRule, originalUri, inboundRuleMatch, lastConditionMatch, ruleResult); } else if (inboundRule.Action is Rewrite) { ProcessRewriteAction(inboundRule, originalUri, inboundRuleMatch, lastConditionMatch, ruleResult); } else if (inboundRule.Action is ItemQueryRedirect) { ProcessItemQueryRedirectAction(inboundRule, originalUri, inboundRuleMatch, lastConditionMatch, ruleResult); } else if (inboundRule.Action is AbortRequest || inboundRule.Action is CustomResponse) { ProcessActionProcessing(ruleResult); } else { throw new NotImplementedException("Redirect Action, Custome Response and Abort Reqeust Action are the only supported type of redirects"); } ruleResult.ResultAction = inboundRule.Action; ruleResult.ConditionMatchResult = conditionMatchResult; } else if (inboundRule.Action == null) { Log.Warn(this, "Inbound Rule has no Action set - inboundRule: {0} inboundRule ItemId: {1}", inboundRule.Name, inboundRule.ItemId); // we are going to skip this because we don't know what to do with it during processing ruleResult.RuleMatched = false; } return(ruleResult); }
public void ExecuteResult(HttpContextBase httpContext, ProcessInboundRulesResult ruleResult) { var httpRequest = httpContext.Request; var httpResponse = httpContext.Response; var responseHeaders = ruleResult.ProcessedResults.SelectMany(e => e.ResponseHeaders); var replacements = new RewriteHelper.Replacements { RequestHeaders = RequestHeaders, RequestServerVariables = RequestServerVariables }; httpResponse.Clear(); foreach (var responseHeader in responseHeaders) { var responseHeaderValue = RewriteHelper.ReplaceTokens(replacements, responseHeader.Value); httpResponse.Headers.Set(responseHeader.VariableName, responseHeaderValue); } if (ruleResult.FinalAction is IBaseRedirect) { if (Configuration.AnalyticsTrackingEnabled) { Tracking.TrackRedirect(ruleResult); } var redirectAction = ruleResult.FinalAction as IBaseRedirect; int statusCode; if (redirectAction.StatusCode.HasValue) { statusCode = (int)(redirectAction.StatusCode.Value); } else { statusCode = (int)HttpStatusCode.MovedPermanently; } httpResponse.RedirectLocation = ruleResult.RewrittenUri.ToString(); httpResponse.StatusCode = statusCode; if (redirectAction.HttpCacheability.HasValue) { httpResponse.Cache.SetCacheability(redirectAction.HttpCacheability.Value); } } else if (ruleResult.FinalAction is IBaseRewrite) { var rewrittenUrl = ruleResult.RewrittenUri; var isLocal = String.Equals(httpRequest.Url.Host, rewrittenUrl.Host, StringComparison.OrdinalIgnoreCase); if (!isLocal) { throw new ApplicationException("Rewrite Url must be a local URL"); } httpContext.Server.TransferRequest(rewrittenUrl.PathAndQuery, true, httpRequest.HttpMethod, RequestHeaders, true); } else if (ruleResult.FinalAction is AbortRequest) { // do nothing } else if (ruleResult.FinalAction is CustomResponse) { var customResponse = ruleResult.FinalAction as CustomResponse; httpResponse.TrySkipIisCustomErrors = true; httpResponse.StatusCode = customResponse.StatusCode; httpResponse.StatusDescription = customResponse.ErrorDescription; // TODO: Implement Status Reason? //httpResponse.??? = customResponse.Reason; if (customResponse.SubStatusCode.HasValue) { httpResponse.SubStatusCode = customResponse.SubStatusCode.Value; } } httpResponse.End(); }
internal bool CheckPrecondition(HttpContextBase httpContext, OutboundRule outboundRule) { Match lastConditionMatch = null; bool isPreconditionMatch = true; if (outboundRule == null) return isPreconditionMatch; var precondition = outboundRule.Precondition; if (precondition == null) return isPreconditionMatch; var conditions = precondition.Conditions; // test conditions matches if (conditions != null && conditions.Any()) { var replacements = new RewriteHelper.Replacements { RequestServerVariables = httpContext.Request.ServerVariables, RequestHeaders = httpContext.Request.Headers, ResponseHeaders = httpContext.Response.Headers }; var conditionMatchResult = RewriteHelper.TestConditionMatches(precondition, replacements, out lastConditionMatch); isPreconditionMatch = conditionMatchResult.Matched; } return isPreconditionMatch; }
internal PreconditionResult CheckPreconditions(HttpContextBase httpContext, List<OutboundRule> outboundRules) { Match lastConditionMatch = null; bool isPreconditionMatch = false; var preconditions = outboundRules.Select(p => p.Precondition) .Where(p => p != null); foreach (var precondition in preconditions) { var conditions = precondition.Conditions; // test conditions matches if (conditions != null && conditions.Any()) { var replacements = new RewriteHelper.Replacements { RequestServerVariables = httpContext.Request.ServerVariables, RequestHeaders = httpContext.Request.Headers, ResponseHeaders = httpContext.Response.Headers }; var conditionMatchResult = RewriteHelper.TestConditionMatches(precondition, replacements, out lastConditionMatch); isPreconditionMatch = conditionMatchResult.Matched; } } var result = new PreconditionResult { Passed = isPreconditionMatch }; return result; }
private OutboundRuleResult ProcessRegularExpressionOutboundRule(OutboundRuleResult ruleResult, OutboundRule outboundRule) { Match outboundRuleMatch, lastConditionMatch = null; // test rule match var isRuleMatch = true; ConditionMatchResult conditionMatchResult = null; // test conditions matches if (outboundRule.Conditions != null && outboundRule.Conditions.Any()) { var replacements = new RewriteHelper.Replacements { RequestHeaders = RequestHeaders, RequestServerVariables = RequestServerVariables, ResponseHeaders = ResponseHeaders }; conditionMatchResult = RewriteHelper.TestConditionMatches(outboundRule, replacements, out lastConditionMatch); isRuleMatch = conditionMatchResult.Matched; } if (isRuleMatch) { ruleResult.RewrittenResponseString = ProcessRuleReplacements(ruleResult.OriginalResponseString, outboundRule); ruleResult.RuleMatched = true; } return ruleResult; }
public void ExecuteResult(HttpContextBase httpContext, ProcessInboundRulesResult ruleResult) { var httpRequest = httpContext.Request; var httpResponse = httpContext.Response; var responseHeaders = ruleResult.ProcessedResults.SelectMany(e => e.ResponseHeaders); var replacements = new RewriteHelper.Replacements { RequestHeaders = RequestHeaders, RequestServerVariables = RequestServerVariables }; httpResponse.Clear(); foreach (var responseHeader in responseHeaders) { var responseHeaderValue = RewriteHelper.ReplaceTokens(replacements, responseHeader.Value); httpResponse.Headers.Set(responseHeader.VariableName, responseHeaderValue); } if (ruleResult.FinalAction is IBaseRedirect) { var redirectAction = ruleResult.FinalAction as IBaseRedirect; int statusCode; if (redirectAction.StatusCode.HasValue) { statusCode = (int)(redirectAction.StatusCode.Value); } else { statusCode = (int)HttpStatusCode.MovedPermanently; } httpResponse.RedirectLocation = ruleResult.RewrittenUri.ToString(); httpResponse.StatusCode = statusCode; if (redirectAction.HttpCacheability.HasValue) { httpResponse.Cache.SetCacheability(redirectAction.HttpCacheability.Value); } //ReportingService.QueueReport(ruleResult.ProcessedResults.Where(e => e.RuleMatched), Sitecore.Context.Database); } else if (ruleResult.FinalAction is IBaseRewrite) { var rewrittenUrl = ruleResult.RewrittenUri; var isLocal = String.Equals(httpRequest.Url.Host, rewrittenUrl.Host, StringComparison.OrdinalIgnoreCase); if (!isLocal) { throw new ApplicationException("Rewrite Url must be a local URL"); } httpContext.Server.TransferRequest(rewrittenUrl.PathAndQuery, true, httpRequest.HttpMethod, RequestHeaders, true); } else if (ruleResult.FinalAction is AbortRequest) { // do nothing } else if (ruleResult.FinalAction is CustomResponse) { var customResponse = ruleResult.FinalAction as CustomResponse; httpResponse.TrySkipIisCustomErrors = true; httpResponse.StatusCode = customResponse.StatusCode; httpResponse.StatusDescription = customResponse.ErrorDescription; // TODO: Implement Status Reason? //httpResponse.??? = customResponse.Reason; if (customResponse.SubStatusCode.HasValue) { httpResponse.SubStatusCode = customResponse.SubStatusCode.Value; } } httpResponse.End(); }
private void ProcessRewriteAction(InboundRule inboundRule, Uri uri, Match inboundRuleMatch, Match lastConditionMatch, InboundRuleResult ruleResult) { var redirectAction = inboundRule.Action as Rewrite; var rewriteUrl = redirectAction.RewriteUrl; var rewriteItemId = redirectAction.RewriteItemId; var rewriteItemAnchor = redirectAction.RewriteItemAnchor; if (string.IsNullOrEmpty(rewriteUrl) && rewriteItemId == null) { ruleResult.RuleMatched = false; return; } if (rewriteItemId.HasValue) { rewriteUrl = GetRewriteUrlFromItemId(rewriteItemId.Value, rewriteItemAnchor); } // process token replacements var replacements = new RewriteHelper.Replacements { RequestHeaders = RequestHeaders, RequestServerVariables = RequestServerVariables }; rewriteUrl = RewriteHelper.ReplaceTokens(replacements, rewriteUrl); if (redirectAction.AppendQueryString) { rewriteUrl += uri.Query; } rewriteUrl = RewriteHelper.ReplaceRuleBackReferences(inboundRuleMatch, rewriteUrl); rewriteUrl = RewriteHelper.ReplaceConditionBackReferences(lastConditionMatch, rewriteUrl); ruleResult.RewrittenUri = new Uri(rewriteUrl); ruleResult.StopProcessing = redirectAction.StopProcessingOfSubsequentRules; }
private InboundRuleResult ProcessRegularExpressionInboundRule(Uri originalUri, InboundRule inboundRule) { var ruleResult = new InboundRuleResult { OriginalUri = originalUri, RewrittenUri = originalUri }; Match inboundRuleMatch, lastConditionMatch = null; // test rule match var isInboundRuleMatch = TestRuleMatches(inboundRule, originalUri, out inboundRuleMatch); ConditionMatchResult conditionMatchResult = null; // test conditions matches if (isInboundRuleMatch && inboundRule.Conditions != null && inboundRule.Conditions.Any()) { var replacements = new RewriteHelper.Replacements { RequestHeaders = RequestHeaders, RequestServerVariables = RequestServerVariables }; conditionMatchResult = RewriteHelper.TestConditionMatches(inboundRule, replacements, out lastConditionMatch); isInboundRuleMatch = conditionMatchResult.Matched; } // test site name restrictions if (isInboundRuleMatch && !string.IsNullOrEmpty(inboundRule.SiteNameRestriction)) { isInboundRuleMatch = TestSiteNameRestriction(inboundRule); } if (isInboundRuleMatch && inboundRule.Action != null) { ruleResult.RuleMatched = true; if (inboundRule.ResponseHeaders.Any()) { ruleResult.ResponseHeaders = inboundRule.ResponseHeaders; } Log.Debug(this, "INBOUND RULE MATCH - requestUri: {0} inboundRule: {1}", originalUri, inboundRule.Name); // TODO: Need to implement Rewrite, None if (inboundRule.Action is Redirect) { ProcessRedirectAction(inboundRule, originalUri, inboundRuleMatch, lastConditionMatch, ruleResult); } else if (inboundRule.Action is Rewrite) { ProcessRewriteAction(inboundRule, originalUri, inboundRuleMatch, lastConditionMatch, ruleResult); } else if (inboundRule.Action is ItemQueryRedirect) { ProcessItemQueryRedirectAction(inboundRule, originalUri, inboundRuleMatch, lastConditionMatch, ruleResult); } else if (inboundRule.Action is AbortRequest || inboundRule.Action is CustomResponse) { ProcessActionProcessing(ruleResult); } else { throw new NotImplementedException("Redirect Action, Custome Response and Abort Reqeust Action are the only supported type of redirects"); } ruleResult.ResultAction = inboundRule.Action; ruleResult.ConditionMatchResult = conditionMatchResult; } else if (inboundRule.Action == null) { Log.Warn(this, "Inbound Rule has no Action set - inboundRule: {0} inboundRule ItemId: {1}", inboundRule.Name, inboundRule.ItemId); // we are going to skip this because we don't know what to do with it during processing ruleResult.RuleMatched = false; } return ruleResult; }
private void ProcessItemQueryRedirectAction(InboundRule inboundRule, Uri uri, Match inboundRuleMatch, Match lastConditionMatch, InboundRuleResult ruleResult) { var redirectAction = inboundRule.Action as ItemQueryRedirect; var itemQuery = redirectAction.ItemQuery; if (string.IsNullOrEmpty(itemQuery)) { ruleResult.RuleMatched = false; return; } // process token replacements in the item query itemQuery = RewriteHelper.ReplaceRuleBackReferences(inboundRuleMatch, itemQuery); itemQuery = RewriteHelper.ReplaceConditionBackReferences(lastConditionMatch, itemQuery); var rewriteItemId = ExecuteItemQuery(itemQuery); if (!rewriteItemId.HasValue) { ruleResult.RuleMatched = false; return; } string rewriteUrl = GetRewriteUrlFromItemId(rewriteItemId.Value, null); // process token replacements var replacements = new RewriteHelper.Replacements { RequestHeaders = RequestHeaders, RequestServerVariables = RequestServerVariables }; rewriteUrl = RewriteHelper.ReplaceTokens(replacements, rewriteUrl); rewriteUrl = RewriteHelper.ReplaceRuleBackReferences(inboundRuleMatch, rewriteUrl); rewriteUrl = RewriteHelper.ReplaceConditionBackReferences(lastConditionMatch, rewriteUrl); ruleResult.RewrittenUri = new Uri(rewriteUrl); ruleResult.StopProcessing = redirectAction.StopProcessingOfSubsequentRules; }