@@ -34,27 +34,9 @@ public ImmutableCertificateCache(IEnumerable<TCert> certificates, Func<TCert, IE
3434 _wildCardDomains . Sort ( DomainNameComparer . Instance ) ;
3535 }
3636
37- public bool TryGetCertificateExact ( string domain , [ NotNullWhen ( true ) ] out TCert ? certificate ) =>
38- _certificates . TryGetValue ( domain , out certificate ) ;
39-
40- public bool TryGetWildcardCertificate ( string domain , [ NotNullWhen ( true ) ] out TCert ? certificate )
41- {
42- if ( _wildCardDomains . BinarySearch ( new WildCardDomain ( domain , null ! ) , DomainNameComparer . Instance ) is { } index and < - 1 )
43- {
44- var candidate = _wildCardDomains [ ~ index ] ;
45- if ( domain . EndsWith ( candidate . Domain , true , CultureInfo . InvariantCulture ) )
46- {
47- certificate = candidate . Certificate ;
48- return true ;
49- }
50- }
5137
52- certificate = null ;
53- return false ;
54- }
5538
56- public TCert ? GetDefaultCertificate ( ) => _wildCardDomains . FirstOrDefault ( ) ? . Certificate
57- ?? _certificates . Values . FirstOrDefault ( ) ;
39+ protected abstract TCert ? GetDefaultCertificate ( ) ;
5840
5941 public TCert ? GetCertificate ( string domain )
6042 {
@@ -70,7 +52,35 @@ public bool TryGetWildcardCertificate(string domain, [NotNullWhen(true)] out TCe
7052 return GetDefaultCertificate ( ) ;
7153 }
7254
73- private record WildCardDomain ( string Domain , TCert Certificate ) ;
55+ protected IReadOnlyList < WildCardDomain > WildcardCertificates => _wildCardDomains ;
56+
57+ protected IReadOnlyDictionary < string , TCert > Certificates => _certificates ;
58+
59+ protected record WildCardDomain ( string Domain , TCert ? Certificate ) ;
60+
61+ private bool TryGetCertificateExact ( string domain , [ NotNullWhen ( true ) ] out TCert ? certificate ) =>
62+ _certificates . TryGetValue ( domain , out certificate ) ;
63+
64+ private bool TryGetWildcardCertificate ( string domain , [ NotNullWhen ( true ) ] out TCert ? certificate )
65+ {
66+ if ( _wildCardDomains . BinarySearch ( new WildCardDomain ( domain , null ! ) , DomainNameComparer . Instance ) is { } index )
67+ {
68+ if ( index > - 1 )
69+ {
70+ certificate = _wildCardDomains [ index ] . Certificate ! ;
71+ return true ;
72+ }
73+ // var candidate = _wildCardDomains[~index];
74+ // if (domain.EndsWith(candidate.Domain, true, CultureInfo.InvariantCulture))
75+ // {
76+ // certificate = candidate.Certificate!;
77+ // return true;
78+ // }
79+ }
80+
81+ certificate = null ;
82+ return false ;
83+ }
7484
7585 /// <summary>
7686 /// Sorts domain names right to left.
@@ -83,7 +93,21 @@ private class DomainNameComparer : IComparer<WildCardDomain>
8393
8494 public int Compare ( WildCardDomain ? x , WildCardDomain ? y )
8595 {
86- return Compare ( x ! . Domain . AsSpan ( ) , y ! . Domain . AsSpan ( ) ) ;
96+ var ret = Compare ( x ! . Domain . AsSpan ( ) , y ! . Domain . AsSpan ( ) ) ;
97+ if ( ret != 0 )
98+ {
99+ return ret ;
100+ }
101+
102+ switch ( x ! . Certificate , y ! . Certificate )
103+ {
104+ case ( null , { } ) when x . Domain . Length > y . Domain . Length :
105+ return 0 ;
106+ case ( { } , null ) when x . Domain . Length < y . Domain . Length :
107+ return 0 ;
108+ default :
109+ return x . Domain . Length - y . Domain . Length ;
110+ }
87111 }
88112
89113 private static int Compare ( ReadOnlySpan < char > x , ReadOnlySpan < char > y )
@@ -93,8 +117,8 @@ private static int Compare(ReadOnlySpan<char> x, ReadOnlySpan<char> y)
93117
94118 for ( var i = 1 ; i <= length ; i ++ )
95119 {
96- var charA = x [ ^ i ] & 0x3F ;
97- var charB = y [ ^ i ] & 0x3F ;
120+ var charA = x [ ^ i ] & 0x5F ;
121+ var charB = y [ ^ i ] & 0x5F ;
98122
99123 if ( charA == charB )
100124 {
@@ -104,7 +128,8 @@ private static int Compare(ReadOnlySpan<char> x, ReadOnlySpan<char> y)
104128 return charB - charA ;
105129 }
106130
107- return x . Length - y . Length ;
131+ //return x.Length - y.Length;
132+ return 0 ;
108133 }
109134 }
110135}
0 commit comments