Skip to content

Commit eb9773e

Browse files
committed
Merge branch '700-get-refresh-token'
2 parents 897eff8 + 52948c8 commit eb9773e

File tree

2 files changed

+25
-1
lines changed

2 files changed

+25
-1
lines changed

cloudfoundry-client-reactor/src/main/java/org/cloudfoundry/reactor/TokenProvider.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public interface TokenProvider {
3535
* Called when a {@code 401 UNAUTHORIZED} is received as part of a request. Since not all {@link TokenProvider}s care about this possibility, the default implementation does nothing.
3636
* Implementations are free to manage internal state with this call if they choose to.
3737
*
38-
* @param connectionContext A {@link ConnectionContext} to be used if a token needs to be retrieved via a network request
38+
* @param connectionContext A {@link ConnectionContext} to be used to identity which connection the tokens should be invalidated for
3939
*/
4040
default void invalidate(ConnectionContext connectionContext) {
4141
}

cloudfoundry-client-reactor/src/main/java/org/cloudfoundry/reactor/tokenprovider/AbstractUaaTokenProvider.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,13 @@
3030
import org.slf4j.Logger;
3131
import org.slf4j.LoggerFactory;
3232
import org.springframework.web.util.UriComponentsBuilder;
33+
import reactor.core.publisher.DirectProcessor;
34+
import reactor.core.publisher.Flux;
3335
import reactor.core.publisher.Mono;
3436
import reactor.ipc.netty.http.client.HttpClientRequest;
3537
import reactor.ipc.netty.http.client.HttpClientResponse;
38+
import reactor.util.function.Tuple2;
39+
import reactor.util.function.Tuples;
3640

3741
import java.time.LocalDateTime;
3842
import java.time.ZoneId;
@@ -71,6 +75,8 @@ public abstract class AbstractUaaTokenProvider implements TokenProvider {
7175

7276
private final ConcurrentMap<ConnectionContext, Mono<String>> accessTokens = new ConcurrentHashMap<>(1);
7377

78+
private final ConcurrentMap<ConnectionContext, Tuple2<DirectProcessor<String>, Flux<String>>> refreshTokenStreams = new ConcurrentHashMap<>(1);
79+
7480
private final ConcurrentMap<ConnectionContext, Mono<String>> refreshTokens = new ConcurrentHashMap<>(1);
7581

7682
/**
@@ -89,6 +95,16 @@ public String getClientSecret() {
8995
return "";
9096
}
9197

98+
/**
99+
* Returns a {@link Flux} of refresh tokens for a connection
100+
*
101+
* @param connectionContext A {@link ConnectionContext} to be used to identity which connection the refresh tokens be retrieved for
102+
* @return a {@link Flux} that emits the last token on subscribe and new refresh tokens as they are negotiated
103+
*/
104+
public Flux<String> getRefreshTokens(ConnectionContext connectionContext) {
105+
return getRefreshTokenStream(connectionContext).getT2();
106+
}
107+
92108
@Override
93109
public final Mono<String> getToken(ConnectionContext connectionContext) {
94110
return this.accessTokens.computeIfAbsent(connectionContext, this::token);
@@ -172,6 +188,7 @@ private Consumer<Map<String, String>> extractRefreshToken(ConnectionContext conn
172188
}
173189

174190
this.refreshTokens.put(connectionContext, Mono.just(refreshToken));
191+
getRefreshTokenStream(connectionContext).getT1().onNext(refreshToken);
175192
});
176193
}
177194

@@ -184,6 +201,13 @@ private Function<Mono<HttpClientResponse>, Mono<String>> extractTokens(Connectio
184201
.map(AbstractUaaTokenProvider::extractAccessToken);
185202
}
186203

204+
private Tuple2<DirectProcessor<String>, Flux<String>> getRefreshTokenStream(ConnectionContext connectionContext) {
205+
return this.refreshTokenStreams.computeIfAbsent(connectionContext, c -> {
206+
DirectProcessor<String> processor = DirectProcessor.create();
207+
return Tuples.of(processor, processor.cache(1));
208+
});
209+
}
210+
187211
private Mono<HttpClientResponse> primaryToken(ConnectionContext connectionContext) {
188212
return requestToken(connectionContext, this::tokenRequestTransformer);
189213
}

0 commit comments

Comments
 (0)