@@ -26,13 +26,18 @@ const RFC_1123_LABEL_FMT: &str = "[a-zA-Z0-9]([-a-zA-Z0-9]*[a-zA-Z0-9])?";
2626
2727/// This is a subdomain's max length in DNS (RFC 1123)
2828const RFC_1123_SUBDOMAIN_MAX_LENGTH : usize = 253 ;
29- const RFC_1123_SUBDOMAIN_FMT : & str =
30- concatcp ! ( RFC_1123_LABEL_FMT , "(\\ ." , RFC_1123_LABEL_FMT , ")*" ) ;
29+ const RFC_1123_SUBDOMAIN_FMT : & str = concatcp ! (
30+ LOWERCASE_RFC_1123_LABEL_FMT ,
31+ "(\\ ." ,
32+ LOWERCASE_RFC_1123_LABEL_FMT ,
33+ ")*"
34+ ) ;
3135const RFC_1123_SUBDOMAIN_ERROR_MSG : & str = "a RFC 1123 subdomain must consist of alphanumeric characters, '-' or '.', and must start and end with an alphanumeric character" ;
3236
3337const DOMAIN_MAX_LENGTH : usize = RFC_1123_SUBDOMAIN_MAX_LENGTH ;
34- /// Same as [`RFC_1123_SUBDOMAIN_FMT`], but allows a trailing dot
35- const DOMAIN_FMT : & str = concatcp ! ( RFC_1123_SUBDOMAIN_FMT , "\\ .?" ) ;
38+
39+ /// Same as [`RFC_1123_LABEL_FMT`], but allows a trailing dot
40+ const DOMAIN_FMT : & str = concatcp ! ( RFC_1123_LABEL_FMT , "(\\ ." , RFC_1123_LABEL_FMT , ")*\\ .?" ) ;
3641const DOMAIN_ERROR_MSG : & str = "a domain must consist of alphanumeric characters, '-' or '.', and must start with an alphanumeric character and end with an alphanumeric character or '.'" ;
3742
3843// FIXME: According to https://www.rfc-editor.org/rfc/rfc1035#section-2.3.1 domain names must start with a letter
@@ -303,6 +308,12 @@ mod tests {
303308
304309 #[ rstest]
305310 #[ case( "" ) ]
311+ #[ case( "A" ) ]
312+ #[ case( "aBc" ) ]
313+ #[ case( "ABC" ) ]
314+ #[ case( "A1" ) ]
315+ #[ case( "A-1" ) ]
316+ #[ case( "1-A" ) ]
306317 #[ case( "-" ) ]
307318 #[ case( "a-" ) ]
308319 #[ case( "-a" ) ]
@@ -329,6 +340,24 @@ mod tests {
329340 #[ case( "1 " ) ]
330341 #[ case( " 1" ) ]
331342 #[ case( "1 2" ) ]
343+ #[ case( "A.a" ) ]
344+ #[ case( "aB.a" ) ]
345+ #[ case( "ab.A" ) ]
346+ #[ case( "A1.a" ) ]
347+ #[ case( "a1.A" ) ]
348+ #[ case( "A.1" ) ]
349+ #[ case( "aB.1" ) ]
350+ #[ case( "A1.1" ) ]
351+ #[ case( "0.A" ) ]
352+ #[ case( "01.A" ) ]
353+ #[ case( "012.A" ) ]
354+ #[ case( "1A.a" ) ]
355+ #[ case( "1a.A" ) ]
356+ #[ case( "1A.1" ) ]
357+ #[ case( "a.B.c.d.e" ) ]
358+ #[ case( "A.B.C.D.E" ) ]
359+ #[ case( "aa.bB.cc.dd.ee" ) ]
360+ #[ case( "AA.BB.CC.DD.EE" ) ]
332361 #[ case( "a@b" ) ]
333362 #[ case( "a,b" ) ]
334363 #[ case( "a_b" ) ]
@@ -344,67 +373,43 @@ mod tests {
344373
345374 #[ rstest]
346375 #[ case( "a" ) ]
347- #[ case( "A" ) ]
348376 #[ case( "ab" ) ]
349377 #[ case( "abc" ) ]
350- #[ case( "aBc" ) ]
351- #[ case( "ABC" ) ]
352378 #[ case( "a1" ) ]
353- #[ case( "A1" ) ]
354379 #[ case( "a-1" ) ]
355- #[ case( "A-1" ) ]
356380 #[ case( "a--1--2--b" ) ]
357381 #[ case( "0" ) ]
358382 #[ case( "01" ) ]
359383 #[ case( "012" ) ]
360384 #[ case( "1a" ) ]
361385 #[ case( "1-a" ) ]
362- #[ case( "1-A" ) ]
363386 #[ case( "1--a--b--2" ) ]
364387 #[ case( "a.a" ) ]
365- #[ case( "A.a" ) ]
366388 #[ case( "ab.a" ) ]
367- #[ case( "aB.a" ) ]
368- #[ case( "ab.A" ) ]
369389 #[ case( "abc.a" ) ]
370390 #[ case( "a1.a" ) ]
371- #[ case( "A1.a" ) ]
372- #[ case( "a1.A" ) ]
373391 #[ case( "a-1.a" ) ]
374392 #[ case( "a--1--2--b.a" ) ]
375393 #[ case( "a.1" ) ]
376- #[ case( "A.1" ) ]
377394 #[ case( "ab.1" ) ]
378- #[ case( "aB.1" ) ]
379395 #[ case( "abc.1" ) ]
380396 #[ case( "a1.1" ) ]
381- #[ case( "A1.1" ) ]
382397 #[ case( "a-1.1" ) ]
383398 #[ case( "a--1--2--b.1" ) ]
384399 #[ case( "0.a" ) ]
385- #[ case( "0.A" ) ]
386400 #[ case( "01.a" ) ]
387- #[ case( "01.A" ) ]
388401 #[ case( "012.a" ) ]
389- #[ case( "012.A" ) ]
390402 #[ case( "1a.a" ) ]
391- #[ case( "1A.a" ) ]
392- #[ case( "1a.A" ) ]
393403 #[ case( "1-a.a" ) ]
394404 #[ case( "1--a--b--2" ) ]
395405 #[ case( "0.1" ) ]
396406 #[ case( "01.1" ) ]
397407 #[ case( "012.1" ) ]
398408 #[ case( "1a.1" ) ]
399- #[ case( "1A.1" ) ]
400409 #[ case( "1-a.1" ) ]
401410 #[ case( "1--a--b--2.1" ) ]
402411 #[ case( "a.b.c.d.e" ) ]
403- #[ case( "a.B.c.d.e" ) ]
404- #[ case( "A.B.C.D.E" ) ]
405412 #[ case( "aa.bb.cc.dd.ee" ) ]
406- #[ case( "aa.bB.cc.dd.ee" ) ]
407- #[ case( "AA.BB.CC.DD.EE" ) ]
408413 #[ case( "1.2.3.4.5" ) ]
409414 #[ case( "11.22.33.44.55" ) ]
410415 #[ case( & "a" . repeat( 253 ) ) ]
0 commit comments