private void parseCredentials( final int idx, final T context, final Throwable lastException, final Handler<AsyncResult<JsonObject>> resultHandler) { if (idx >= handlerChain.size()) { // no providers left to try to extract credentials resultHandler.handle(Future.failedFuture(lastException)); } else { final AuthHandler<T> handler = handlerChain.get(idx); handler.parseCredentials(context).setHandler(r -> { if (r.failed()) { parseCredentials(idx + 1, context, r.cause(), resultHandler); } else { context.put(AUTH_PROVIDER_CONTEXT_KEY, handler.getAuthProvider()); resultHandler.handle(Future.succeededFuture(r.result())); } }); } } }