@@ -34,27 +34,9 @@ public ImmutableCertificateCache(IEnumerable<TCert> certificates, Func<TCert, IE
34
34
_wildCardDomains . Sort ( DomainNameComparer . Instance ) ;
35
35
}
36
36
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
- }
51
37
52
- certificate = null ;
53
- return false ;
54
- }
55
38
56
- public TCert ? GetDefaultCertificate ( ) => _wildCardDomains . FirstOrDefault ( ) ? . Certificate
57
- ?? _certificates . Values . FirstOrDefault ( ) ;
39
+ protected abstract TCert ? GetDefaultCertificate ( ) ;
58
40
59
41
public TCert ? GetCertificate ( string domain )
60
42
{
@@ -70,7 +52,35 @@ public bool TryGetWildcardCertificate(string domain, [NotNullWhen(true)] out TCe
70
52
return GetDefaultCertificate ( ) ;
71
53
}
72
54
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
+ }
74
84
75
85
/// <summary>
76
86
/// Sorts domain names right to left.
@@ -83,7 +93,21 @@ private class DomainNameComparer : IComparer<WildCardDomain>
83
93
84
94
public int Compare ( WildCardDomain ? x , WildCardDomain ? y )
85
95
{
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
+ }
87
111
}
88
112
89
113
private static int Compare ( ReadOnlySpan < char > x , ReadOnlySpan < char > y )
@@ -93,8 +117,8 @@ private static int Compare(ReadOnlySpan<char> x, ReadOnlySpan<char> y)
93
117
94
118
for ( var i = 1 ; i <= length ; i ++ )
95
119
{
96
- var charA = x [ ^ i ] & 0x3F ;
97
- var charB = y [ ^ i ] & 0x3F ;
120
+ var charA = x [ ^ i ] & 0x5F ;
121
+ var charB = y [ ^ i ] & 0x5F ;
98
122
99
123
if ( charA == charB )
100
124
{
@@ -104,7 +128,8 @@ private static int Compare(ReadOnlySpan<char> x, ReadOnlySpan<char> y)
104
128
return charB - charA ;
105
129
}
106
130
107
- return x . Length - y . Length ;
131
+ //return x.Length - y.Length;
132
+ return 0 ;
108
133
}
109
134
}
110
135
}
0 commit comments