@@ -66,36 +66,41 @@ public HttpPublicKeySource(string certUrl, IClock clock, HttpClientFactory clien
66
66
public async Task < IReadOnlyList < PublicKey > > GetPublicKeysAsync (
67
67
CancellationToken cancellationToken = default ( CancellationToken ) )
68
68
{
69
- await _lock . WaitAsync ( ) . ConfigureAwait ( false ) ;
70
- var now = _clock . UtcNow ;
71
- try
69
+ if ( _cachedKeys == null || _clock . UtcNow >= _expirationTime )
72
70
{
73
- if ( _cachedKeys == null || now >= _expirationTime )
71
+ await _lock . WaitAsync ( cancellationToken ) . ConfigureAwait ( false ) ;
72
+
73
+ try
74
74
{
75
- using ( var httpClient = _clientFactory . CreateDefaultHttpClient ( ) )
75
+ var now = _clock . UtcNow ;
76
+ if ( _cachedKeys == null || now >= _expirationTime )
76
77
{
77
- var response = await httpClient . GetAsync ( _certUrl , cancellationToken )
78
- . ConfigureAwait ( false ) ;
79
- response . EnsureSuccessStatusCode ( ) ;
80
- _cachedKeys = ParseKeys ( await response . Content . ReadAsStringAsync ( )
81
- . ConfigureAwait ( false ) ) ;
82
- var cacheControl = response . Headers . CacheControl ;
83
- if ( cacheControl != null && cacheControl . MaxAge . HasValue )
78
+ using ( var httpClient = _clientFactory . CreateDefaultHttpClient ( ) )
84
79
{
85
- _expirationTime = now . Add ( cacheControl . MaxAge . Value )
86
- . Subtract ( ClockSkew ) ;
80
+ var response = await httpClient . GetAsync ( _certUrl , cancellationToken )
81
+ . ConfigureAwait ( false ) ;
82
+ response . EnsureSuccessStatusCode ( ) ;
83
+ _cachedKeys = ParseKeys ( await response . Content . ReadAsStringAsync ( )
84
+ . ConfigureAwait ( false ) ) ;
85
+ var cacheControl = response . Headers . CacheControl ;
86
+ if ( cacheControl ? . MaxAge != null )
87
+ {
88
+ _expirationTime = now . Add ( cacheControl . MaxAge . Value )
89
+ . Subtract ( ClockSkew ) ;
90
+ }
87
91
}
88
92
}
89
93
}
94
+ catch ( HttpRequestException e )
95
+ {
96
+ throw new FirebaseException ( "Failed to retrieve latest public keys." , e ) ;
97
+ }
98
+ finally
99
+ {
100
+ _lock . Release ( ) ;
101
+ }
90
102
}
91
- catch ( HttpRequestException e )
92
- {
93
- throw new FirebaseException ( "Failed to retrieve latest public keys." , e ) ;
94
- }
95
- finally
96
- {
97
- _lock . Release ( ) ;
98
- }
103
+
99
104
return _cachedKeys ;
100
105
}
101
106
0 commit comments