Skip to content

Commit

Permalink
Dont block the event loop
Browse files Browse the repository at this point in the history
  • Loading branch information
graemerocher committed Jul 9, 2020
1 parent 68f4915 commit 5d2f072
Show file tree
Hide file tree
Showing 9 changed files with 35 additions and 21 deletions.
10 changes: 4 additions & 6 deletions build.gradle
Expand Up @@ -13,14 +13,13 @@ version "0.1"
group "micronaut.http"

repositories {
mavenLocal()
mavenCentral()
maven { url "https://jcenter.bintray.com" }
}

dependencyManagement {
imports {
mavenBom 'io.micronaut:micronaut-bom:1.3.4'
mavenBom 'io.micronaut:micronaut-bom:2.0.0'
}
}

Expand All @@ -33,16 +32,15 @@ dependencies {
compile "io.micronaut:micronaut-http-client"
compile "javax.annotation:javax.annotation-api"
compile "io.micronaut:micronaut-http-server-netty"
compile 'io.micronaut:micronaut-security'
compile 'io.micronaut:micronaut-security-jwt'
compile 'io.micronaut.security:micronaut-security'
compile 'io.micronaut.security:micronaut-security-jwt'
compileOnly "io.micronaut:micronaut-inject-java"


runtime "ch.qos.logback:logback-classic:1.2.3"
testCompile "io.micronaut:micronaut-inject-java"
testCompile "org.hamcrest:hamcrest-all:1.3"
testCompile 'org.codehaus.groovy:groovy-all:2.5.5'
testCompile 'org.spockframework:spock-core:1.3-groovy-2.5'
testCompile 'org.spockframework:spock-core'
testCompile 'io.rest-assured:rest-assured:3.1.1'
testCompile 'com.stehno.ersatz:ersatz:1.9.0:safe@jar'
testCompile 'com.stehno.ersatz:ersatz:1.9.0'
Expand Down
3 changes: 2 additions & 1 deletion src/main/java/micronaut/http/AuthClient.java
Expand Up @@ -5,6 +5,7 @@
import io.micronaut.http.annotation.QueryValue;
import io.micronaut.http.client.annotation.Client;
import io.reactivex.Flowable;
import io.reactivex.Single;

@Client("${auth.url}")
public interface AuthClient {
Expand All @@ -16,5 +17,5 @@ Flowable<ValidateTokenResponse> validateToken(
);

@Post(value = "/issue/token", consumes = "application/json")
Token retrieveToken(@Body AuthRequest issueTokenRequest);
Single<Token> retrieveToken(@Body AuthRequest issueTokenRequest);
}
8 changes: 5 additions & 3 deletions src/main/java/micronaut/http/AuthValidator.java
Expand Up @@ -9,18 +9,19 @@
import org.reactivestreams.Publisher;

import javax.inject.Inject;
import javax.inject.Provider;
import javax.inject.Singleton;

@Singleton
public class AuthValidator implements TokenValidator {

private AuthClient authClient;
private Provider<AuthClient> authClient;

private String clientId;

@Inject
public AuthValidator(AuthClient authClient,
@Value("${client.id}") String clientId) {
public AuthValidator(Provider<AuthClient> authClient,
@Value("${client.id:default}") String clientId) {
this.authClient = authClient;
this.clientId = clientId;
}
Expand All @@ -29,6 +30,7 @@ public AuthValidator(AuthClient authClient,
@SingleResult
public Publisher<Authentication> validateToken(String token) {
return authClient
.get()
.validateToken(new ValidateTokenRequest(token), clientId)
.filter(ValidateTokenResponse::isTokenValid)
.map(ValidateTokenResponse::asAuthentication)
Expand Down
7 changes: 6 additions & 1 deletion src/main/java/micronaut/http/AuthenticateFilter.java
Expand Up @@ -5,6 +5,8 @@
import io.micronaut.http.annotation.Filter;
import io.micronaut.http.filter.ClientFilterChain;
import io.micronaut.http.filter.HttpClientFilter;
import io.reactivex.annotations.NonNull;
import io.reactivex.functions.Function;
import org.reactivestreams.Publisher;

import javax.inject.Inject;
Expand All @@ -21,6 +23,9 @@ public AuthenticateFilter(TokenIssuer tokenIssuer) {

@Override
public Publisher<? extends HttpResponse<?>> doFilter(MutableHttpRequest<?> request, ClientFilterChain chain) {
return chain.proceed(request.bearerAuth(tokenIssuer.retrieveToken().getAccessToken()));
return tokenIssuer.retrieveToken().flatMapPublisher(token ->
chain.proceed(request.bearerAuth(token.getAccessToken()))
);

}
}
8 changes: 6 additions & 2 deletions src/main/java/micronaut/http/RequestValidator.java
@@ -1,7 +1,11 @@
package micronaut.http;

import io.micronaut.context.annotation.Requires;
import io.micronaut.http.HttpResponse;
import io.micronaut.http.HttpStatus;
import io.reactivex.Single;
import io.reactivex.annotations.NonNull;
import io.reactivex.functions.Function;

import javax.inject.Inject;
import javax.inject.Singleton;
Expand All @@ -17,8 +21,8 @@ public RequestValidator(ServiceClient serviceClient) {
this.serviceClient = serviceClient;
}

public boolean isValid(final String id) {
return serviceClient.getDetails(id).getStatus().equals(HttpStatus.OK);
public Single<Boolean> isValid(final String id) {
return serviceClient.getDetails(id).map(httpResponse -> httpResponse.getStatus().equals(HttpStatus.OK));
}

}
3 changes: 2 additions & 1 deletion src/main/java/micronaut/http/ServiceClient.java
Expand Up @@ -4,11 +4,12 @@
import io.micronaut.http.annotation.Consumes;
import io.micronaut.http.annotation.Get;
import io.micronaut.http.client.annotation.Client;
import io.reactivex.Single;

@Client("${service.url}")
public interface ServiceClient {

@Get("/details/{id}")
@Consumes
HttpResponse<?> getDetails(String id);
Single<HttpResponse<?>> getDetails(String id);
}
5 changes: 3 additions & 2 deletions src/main/java/micronaut/http/StatusController.java
Expand Up @@ -4,6 +4,7 @@
import io.micronaut.http.annotation.Get;
import io.micronaut.security.annotation.Secured;
import io.micronaut.security.rules.SecurityRule;
import io.reactivex.Single;

import javax.inject.Inject;

Expand All @@ -18,7 +19,7 @@ public StatusController(RequestValidator requestValidator) {
}

@Get("/status")
String status() {
return requestValidator.isValid("requestId") ? "valid" : "invalid";
Single<String> status() {
return requestValidator.isValid("requestId").map(b -> b ? "valid" : "invalid") ;
}
}
10 changes: 6 additions & 4 deletions src/main/java/micronaut/http/TokenIssuer.java
@@ -1,24 +1,26 @@
package micronaut.http;

import io.micronaut.context.annotation.Property;
import io.reactivex.Single;

import javax.inject.Provider;
import javax.inject.Singleton;

@Singleton
public class TokenIssuer {

private final AuthClient authClient;
private final Provider<AuthClient> authClient;
private final String clientId;

public TokenIssuer(
AuthClient authClient,
Provider<AuthClient> authClient,
@Property(name = "client.id") String clientId
) {
this.authClient = authClient;
this.clientId = clientId;
}

public Token retrieveToken() {
return authClient.retrieveToken(new AuthRequest(clientId));
public Single<Token> retrieveToken() {
return authClient.get().retrieveToken(new AuthRequest(clientId));
}
}
Expand Up @@ -19,7 +19,7 @@ import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.options

class StatusIntegrationSpec extends Specification {

def CONCURRENT_REQUESTS_COUNT = 20
def CONCURRENT_REQUESTS_COUNT = 50

private static final String CLIENT_TOKEN = "client-token"
private static final String CLIENT_ID = "someClientID"
Expand Down

0 comments on commit 5d2f072

Please sign in to comment.