public IEnumerable <string> BuildConditions(
            Rewrite rewrite)
        {
            if (rewrite.OldUrlHasHost &&
                !string.IsNullOrEmpty(rewrite.OldUrl.Host))
            {
                yield return(string.Format(
                                 "<add input=\"{{HTTP_HOST}}\" pattern=\"^{0}$\" />",
                                 rewrite.OldUrl.Host));
            }

            if (rewrite.RelatedRewrites.Count > 1)
            {
                yield return(!string.IsNullOrWhiteSpace(rewrite.OldUrl.Query)
                    ? string.Format(
                                 "<add input=\"{{{0}:{{QUERY_STRING}}}}\" pattern=\"(.+)\" />",
                                 rewrite.Id)
                    : string.Format(
                                 "<add input=\"{{{0}:{{R:1}}}}\" pattern=\"(.+)\" />",
                                 rewrite.Id));
            }
            else if (!string.IsNullOrEmpty(rewrite.OldUrl.Query))
            {
                yield return(string.Format(
                                 "<add input=\"{{QUERY_STRING}}\" pattern=\"{0}\" />",
                                 rewrite.OldUrl.Query));
            }
        }
        private string BuildRedirectUrl(
            Rewrite rewrite)
        {
            var useRewriteMap =
                rewrite.RelatedRewrites.Count > 1;

            var host = rewrite.NewUrlHasHost
                ? string.Format("{0}://{1}", rewrite.NewUrl.Scheme, rewrite.NewUrl.Host)
                : "";

            var replaceRemainingPath =
                rewrite.RedirectType == RedirectType.Replace
                ? useRewriteMap ? "{R:2}" : "{R:1}"
                : string.Empty;

            var pathAndQuery = FormatNewPathAndQuery(
                string.Concat(
                    useRewriteMap ? "{C:1}" : rewrite.NewUrl.Path,
                    replaceRemainingPath),
                rewrite.NewUrl.Query);

            return(string.Concat(
                       host,
                       pathAndQuery));
        }
        private string BuildExactMatchUrl(
            Rewrite rewrite)
        {
            var useRewriteMap =
                rewrite.RelatedRewrites.Count > 1;

            return(rewrite.OldUrlHasRootPath
                ? "^/?$"
                : rewrite.RelatedRewrites.Count <= 1 || !string.IsNullOrWhiteSpace(rewrite.OldUrl.Query)
                    ? string.Format("^{0}/?$", FormatOldPath(rewrite.OldUrl.Path))
                    : "^(.+?)/?$");
        }
        private string BuildMatchUrl(Rewrite rewrite)
        {
            switch (rewrite.RedirectType)
            {
            case RedirectType.Exact:
                return(BuildExactMatchUrl(rewrite));

            case RedirectType.Replace:
                return(BuildReplaceMatchUrl(rewrite));
            }

            return(".+");
        }
        private string BuildReplaceMatchUrl(
            Rewrite rewrite)
        {
            var useRewriteMap =
                rewrite.RelatedRewrites.Count > 1;
            var segments = rewrite.OldUrl.Path.Split('/').Length - 1;
            var path     = rewrite.OldUrlHasRootPath
                ? string.Empty
                : FormatOldPath(rewrite.OldUrl.Path);

            return(string.Format(
                       "^{0}(.+)?/?$",
                       useRewriteMap
                ? string.Format(
                           "({0})",
                           string.Join(
                               "/",
                               Enumerable.Repeat("[^/]+", segments)))
                : path));
        }