Skip to content

Commit

Permalink
FIX - LangTag extraction logic broken by URL with query string immedi…
Browse files Browse the repository at this point in the history
…ately after lantag #383
  • Loading branch information
turquoiseowl committed Jan 28, 2019
1 parent 062f9f2 commit 7e5d578
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 4 deletions.
8 changes: 4 additions & 4 deletions src/i18n.Domain/Concrete/LanguageTag.cs
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ public enum MatchGrade
// Matches private use subtag
// eg en-ABCD-GB-x-AAAA
public static Regex s_regex_parseUrl = new System.Text.RegularExpressions.Regex(
@"^/([a-zA-Z]{2,3}(?:-[a-zA-Z]{4,5})?(?:-(?:[a-zA-Z]{2}|[0-9]{3}))?(?:\-x-([a-zA-Z0-9]{4,}))?)(?:$|/)",
@"^/([a-zA-Z]{2,3}(?:-[a-zA-Z]{4,5})?(?:-(?:[a-zA-Z]{2}|[0-9]{3}))?(?:\-x-([a-zA-Z0-9]{4,}))?)(?:$|/|\?|#)",
System.Text.RegularExpressions.RegexOptions.CultureInvariant);
// ^/
// ( # begin 1st and only capture group
Expand All @@ -101,7 +101,7 @@ public enum MatchGrade
// (?:-(?:[a-zA-Z]{2}|[0-9]{3}))? # optional region code (2-letter or 3-digit) - not a capture group itself
// (?:\-x-([a-zA-Z0-9]{4,}))? # optional private use tag (-x- followed by 4+ alphanumericcharacters) - not a capture group itself
// ) # end 1st and only capture group
// (?:$|/) # match end of string or fwd-slash char - not a capture group itself
// (?:$|/|\?|#) # match end of string or fwd-slash char or question-mark char or hash char - not a capture group itself
private static ConcurrentDictionary<string, LanguageTag> s_cache = new ConcurrentDictionary<string, LanguageTag>();
// Facilitates fast and efficient re-use of languag tag instances.
// Key = langtag string.
Expand Down Expand Up @@ -533,8 +533,8 @@ public static string ExtractLangTagFromUrl(string url, UriKind uriKind, out stri
string langtag = match.Groups[1].Value;
// Patch the url.
urlPatched = url.Substring(langtag.Length +1);
if (urlPatched.Length == 0) {
urlPatched = "/"; }
if (!urlPatched.StartsWith("/")) {
urlPatched = "/" + urlPatched; }
// Success.
return langtag;
}
Expand Down
48 changes: 48 additions & 0 deletions src/i18n.Tests/Tests/LanguageTagTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,36 @@ public void ExtractLangTagFromUrl()
ExtractLangTagFromUrlHelper("/zh-Hans-123-x-ABCD" , "zh-Hans-123-x-ABCD" , "/");
ExtractLangTagFromUrlHelper("/zh-Hans-123-x-ABCDEFG123", "zh-Hans-123-x-ABCDEFG123", "/");

// #383
ExtractLangTagFromUrlHelper("/zh?" , "zh" , "/?");
ExtractLangTagFromUrlHelper("/zh?qs" , "zh" , "/?qs");
ExtractLangTagFromUrlHelper("/zh-HK?qs" , "zh-HK" , "/?qs");
ExtractLangTagFromUrlHelper("/zh-123?qs" , "zh-123" , "/?qs");
ExtractLangTagFromUrlHelper("/zh-Hans?qs" , "zh-Hans" , "/?qs");
ExtractLangTagFromUrlHelper("/zh-Hans-HK?qs" , "zh-Hans-HK" , "/?qs");
ExtractLangTagFromUrlHelper("/zh-Hans-123?qs" , "zh-Hans-123" , "/?qs");
ExtractLangTagFromUrlHelper("/zh-Hans-123-x-ABCD?qs" , "zh-Hans-123-x-ABCD" , "/?qs");
ExtractLangTagFromUrlHelper("/zh-Hans-123-x-ABCDEFG123?qs", "zh-Hans-123-x-ABCDEFG123", "/?qs");

ExtractLangTagFromUrlHelper("/zh#" , "zh" , "/#");
ExtractLangTagFromUrlHelper("/zh#bm" , "zh" , "/#bm");
ExtractLangTagFromUrlHelper("/zh-HK#bm" , "zh-HK" , "/#bm");
ExtractLangTagFromUrlHelper("/zh-123#bm" , "zh-123" , "/#bm");
ExtractLangTagFromUrlHelper("/zh-Hans#bm" , "zh-Hans" , "/#bm");
ExtractLangTagFromUrlHelper("/zh-Hans-HK#bm" , "zh-Hans-HK" , "/#bm");
ExtractLangTagFromUrlHelper("/zh-Hans-123#bm" , "zh-Hans-123" , "/#bm");
ExtractLangTagFromUrlHelper("/zh-Hans-123-x-ABCD#bm" , "zh-Hans-123-x-ABCD" , "/#bm");
ExtractLangTagFromUrlHelper("/zh-Hans-123-x-ABCDEFG123#bm", "zh-Hans-123-x-ABCDEFG123", "/#bm");

ExtractLangTagFromUrlHelper("/zh/?qs" , "zh" , "/?qs");
ExtractLangTagFromUrlHelper("/zh-HK/?qs" , "zh-HK" , "/?qs");
ExtractLangTagFromUrlHelper("/zh-123/?qs" , "zh-123" , "/?qs");
ExtractLangTagFromUrlHelper("/zh-Hans/?qs" , "zh-Hans" , "/?qs");
ExtractLangTagFromUrlHelper("/zh-Hans-HK/?qs" , "zh-Hans-HK" , "/?qs");
ExtractLangTagFromUrlHelper("/zh-Hans-123/?qs" , "zh-Hans-123" , "/?qs");
ExtractLangTagFromUrlHelper("/zh-Hans-123-x-ABCD/?qs" , "zh-Hans-123-x-ABCD" , "/?qs");
ExtractLangTagFromUrlHelper("/zh-Hans-123-x-ABCDEFG123/?qs", "zh-Hans-123-x-ABCDEFG123", "/?qs");

ExtractLangTagFromUrlHelper("/zh/account" , "zh" , "/account");
ExtractLangTagFromUrlHelper("/zh-HK/account" , "zh-HK" , "/account");
ExtractLangTagFromUrlHelper("/zh-123/account" , "zh-123" , "/account");
Expand All @@ -48,6 +78,15 @@ public void ExtractLangTagFromUrl()
ExtractLangTagFromUrlHelper("/zh-Hans-123-x-ABCD/account" , "zh-Hans-123-x-ABCD" , "/account");
ExtractLangTagFromUrlHelper("/zh-Hans-123-x-ABCDEFG123/account", "zh-Hans-123-x-ABCDEFG123", "/account");

ExtractLangTagFromUrlHelper("/zh/account?qs" , "zh" , "/account?qs");
ExtractLangTagFromUrlHelper("/zh-HK/account?qs" , "zh-HK" , "/account?qs");
ExtractLangTagFromUrlHelper("/zh-123/account?qs" , "zh-123" , "/account?qs");
ExtractLangTagFromUrlHelper("/zh-Hans/account?qs" , "zh-Hans" , "/account?qs");
ExtractLangTagFromUrlHelper("/zh-Hans-HK/account?qs" , "zh-Hans-HK" , "/account?qs");
ExtractLangTagFromUrlHelper("/zh-Hans-123/account?qs" , "zh-Hans-123" , "/account?qs");
ExtractLangTagFromUrlHelper("/zh-Hans-123-x-ABCD/account?qs" , "zh-Hans-123-x-ABCD" , "/account?qs");
ExtractLangTagFromUrlHelper("/zh-Hans-123-x-ABCDEFG123/account?qs", "zh-Hans-123-x-ABCDEFG123", "/account?qs");

ExtractLangTagFromUrlHelper("/zh/account/" , "zh" , "/account/");
ExtractLangTagFromUrlHelper("/zh-HK/account/" , "zh-HK" , "/account/");
ExtractLangTagFromUrlHelper("/zh-123/account/" , "zh-123" , "/account/");
Expand All @@ -57,6 +96,15 @@ public void ExtractLangTagFromUrl()
ExtractLangTagFromUrlHelper("/zh-Hans-123-x-ABCD/account/" , "zh-Hans-123-x-ABCD" , "/account/");
ExtractLangTagFromUrlHelper("/zh-Hans-123-x-ABCDEFG123/account/", "zh-Hans-123-x-ABCDEFG123", "/account/");

ExtractLangTagFromUrlHelper("/zh/account/?qs" , "zh" , "/account/?qs");
ExtractLangTagFromUrlHelper("/zh-HK/account/?qs" , "zh-HK" , "/account/?qs");
ExtractLangTagFromUrlHelper("/zh-123/account/?qs" , "zh-123" , "/account/?qs");
ExtractLangTagFromUrlHelper("/zh-Hans/account/?qs" , "zh-Hans" , "/account/?qs");
ExtractLangTagFromUrlHelper("/zh-Hans-HK/account/?qs" , "zh-Hans-HK" , "/account/?qs");
ExtractLangTagFromUrlHelper("/zh-Hans-123/account/?qs" , "zh-Hans-123" , "/account/?qs");
ExtractLangTagFromUrlHelper("/zh-Hans-123-x-ABCD/account/?qs" , "zh-Hans-123-x-ABCD" , "/account/?qs");
ExtractLangTagFromUrlHelper("/zh-Hans-123-x-ABCDEFG123/account/?qs", "zh-Hans-123-x-ABCDEFG123", "/account/?qs");

ExtractLangTagFromUrlHelper("/zh/account/x" , "zh" , "/account/x");
ExtractLangTagFromUrlHelper("/zh-HK/account/x" , "zh-HK" , "/account/x");
ExtractLangTagFromUrlHelper("/zh-123/account/x" , "zh-123" , "/account/x");
Expand Down

0 comments on commit 7e5d578

Please sign in to comment.