public override void WriteJson(
            JsonWriter writer,
            object value,
            JsonSerializer serializer)
        {
            IParsedUrl parsedUrl = (IParsedUrl)value;

            writer.WriteValue(_urlFormatter.Format(parsedUrl));
        }
        public string Format(IParsedUrl parsedUrl)
        {
            if (parsedUrl == null)
            {
                throw new ArgumentNullException(nameof(parsedUrl));
            }

            if (!parsedUrl.IsValid)
            {
                return(null);
            }

            return(string.Format(
                       "{0}://{1}{2}{3}",
                       parsedUrl.Scheme,
                       parsedUrl.Host,
                       (parsedUrl.Scheme.ToLower().Equals("https") && parsedUrl.Port != 443) ||
                       (parsedUrl.Scheme.ToLower().Equals("http") && parsedUrl.Port != 80)
                                ? string.Format(":{0}", parsedUrl.Port) : string.Empty,
                       parsedUrl.PathAndQuery));
        }
        public string BuildRedirect(IParsedUrl newUrlParsed)
        {
            var redirectLines = new List <string>(
                new []
            {
                $"<ReplaceKeyPrefixWith>{XmlEncode(FormatPathAndQuery(newUrlParsed.PathAndQuery))}</ReplaceKeyPrefixWith>",
                "<HttpRedirectCode>301</HttpRedirectCode>"
            }
                );

            if (newUrlParsed.OriginalUrlHasHost)
            {
                redirectLines.AddRange(
                    new []
                {
                    $"<Protocol>{newUrlParsed.Scheme}</Protocol>",
                    $"<HostName>{newUrlParsed.Host}</HostName>",
                }
                    );
            }

            return(string.Join(
                       Environment.NewLine, redirectLines));
        }
 public string BuildCondition(IParsedUrl oldUrlParsed)
 {
     return($"<KeyPrefixEquals>{FormatPathAndQuery(oldUrlParsed.Path)}</KeyPrefixEquals>{Environment.NewLine}");
 }
        public IParsedUrl Parse(
            string url,
            IParsedUrl defaultUrl,
            bool stripFragment = false)
        {
            if (url == null)
            {
                throw new ArgumentNullException(nameof(url));
            }

            // remove whitespaces fro murl
            var urlFormatted = _formatUrlRegex.Replace(
                url,
                string.Empty);

            // match url scheme
            var urlSchemeMatch = _urlRegex.Match(
                urlFormatted);

            // return parsed url, if url matches http or https scheme
            if (urlSchemeMatch.Success)
            {
                var scheme = urlSchemeMatch.Groups[1].Value.ToLower();

                if (!string.IsNullOrWhiteSpace(urlSchemeMatch.Groups[3].Value) &&
                    !_portRegex.IsMatch(urlSchemeMatch.Groups[3].Value))
                {
                    return(new ParsedUrl
                    {
                        OriginalUrl = url
                    });
                }

                var port = ParsePort(
                    urlSchemeMatch.Groups[3].Value);

                if (port == 0)
                {
                    port = scheme.ToLower().StartsWith("https")
                        ? 443
                        : 80;
                }

                var pathAndQuery = FormatPathAndQuery(
                    urlSchemeMatch.Groups[4].Value,
                    stripFragment);

                var pathAndQueryParts = pathAndQuery.Split(new[] { '?' });

                return(new ParsedUrl
                {
                    Scheme = scheme,
                    Host = urlSchemeMatch.Groups[2].Value,
                    Port = port,
                    Path = FormatPath(
                        pathAndQueryParts.Length > 0
                        ? pathAndQueryParts[0]
                        : pathAndQuery),
                    Query = pathAndQueryParts.Length > 1
                        ? pathAndQueryParts[1]
                        : string.Empty,
                    OriginalUrl = urlFormatted,
                    OriginalUrlHasHost = true
                });
            }

            // return parsed url with default url, if it starts with '/'
            if (urlFormatted.StartsWith("/"))
            {
                if (defaultUrl == null ||
                    !defaultUrl.IsValid)
                {
                    return(new ParsedUrl
                    {
                        OriginalUrl = url
                    });
                }

                var pathAndQuery = FormatPathAndQuery(
                    urlFormatted,
                    stripFragment);

                var pathAndQueryParts = pathAndQuery.Split(new[] { '?' });

                return(new ParsedUrl
                {
                    Scheme = defaultUrl.Scheme,
                    Port = defaultUrl.Port,
                    Host = defaultUrl.Host,
                    Path = FormatPath(
                        pathAndQueryParts.Length > 0
                        ? pathAndQueryParts[0]
                        : pathAndQuery),
                    Query = pathAndQueryParts.Length > 1
                        ? pathAndQueryParts[1]
                        : string.Empty,
                    OriginalUrl = urlFormatted
                });
            }

            return(new ParsedUrl
            {
                OriginalUrl = url
            });
        }