@Override public <I> Flowable<io.micronaut.http.HttpResponse<ByteBuffer<?>>> exchangeStream(io.micronaut.http.HttpRequest<I> request) { return Flowable.fromPublisher(resolveRequestURI(request)) .flatMap(buildExchangeStreamPublisher(request)); }
@Override public <I, O, E> Flowable<io.micronaut.http.HttpResponse<O>> exchange(io.micronaut.http.HttpRequest<I> request, Argument<O> bodyType, Argument<E> errorType) { final io.micronaut.http.HttpRequest<Object> parentRequest = ServerRequestContext.currentRequest().orElse(null); Publisher<URI> uriPublisher = resolveRequestURI(request); return Flowable.fromPublisher(uriPublisher) .switchMap(buildExchangePublisher(parentRequest, request, bodyType, errorType)); }
@Override public <T extends AutoCloseable> Flowable<T> connect(Class<T> clientEndpointType, io.micronaut.http.MutableHttpRequest<?> request) { Publisher<URI> uriPublisher = resolveRequestURI(request); return Flowable.fromPublisher(uriPublisher) .switchMap((resolvedURI) -> connectWebSocket(resolvedURI, request, clientEndpointType, null)); }
@SuppressWarnings("unchecked") @Override public <I> Flowable<ByteBuffer<?>> dataStream(io.micronaut.http.HttpRequest<I> request) { return Flowable.fromPublisher(resolveRequestURI(request)) .flatMap(buildDataStreamPublisher(request)); }
@Override public <I, O> Flowable<O> jsonStream(io.micronaut.http.HttpRequest<I> request, io.micronaut.core.type.Argument<O> type) { final io.micronaut.http.HttpRequest<Object> parentRequest = ServerRequestContext.currentRequest().orElse(null); return Flowable.fromPublisher(resolveRequestURI(request)) .flatMap(buildJsonStreamPublisher(parentRequest, request, type)); }
@Override public <T extends AutoCloseable> Flowable<T> connect(Class<T> clientEndpointType, Map<String, Object> parameters) { WebSocketBean<T> webSocketBean = webSocketRegistry.getWebSocket(clientEndpointType); String uri = webSocketBean.getBeanDefinition().getValue(ClientWebSocket.class, String.class).orElse("/ws"); uri = UriTemplate.of(uri).expand(parameters); MutableHttpRequest<Object> request = io.micronaut.http.HttpRequest.GET(uri); Publisher<URI> uriPublisher = resolveRequestURI(request); return Flowable.fromPublisher(uriPublisher) .switchMap((resolvedURI) -> connectWebSocket(resolvedURI, request, clientEndpointType, webSocketBean)); }
/** * @param request The request * @param <I> The input type * @return A {@link Publisher} with the resolved URI */ protected <I> Publisher<URI> resolveRequestURI(io.micronaut.http.HttpRequest<I> request) { URI requestURI = request.getUri(); if (requestURI.getScheme() != null) { // if the request URI includes a scheme then it is fully qualified so use the direct server return Publishers.just(requestURI); } else { return Publishers.map(loadBalancer.select(getLoadBalancerDiscriminator()), server -> { Optional<String> authInfo = server.getMetadata().get(io.micronaut.http.HttpHeaders.AUTHORIZATION_INFO, String.class); if (request instanceof MutableHttpRequest) { if (authInfo.isPresent()) { ((MutableHttpRequest) request).getHeaders().auth(authInfo.get()); } } return server.resolve(resolveRequestURI(requestURI)); } ); } }
@Override public <T extends AutoCloseable> Flowable<T> connect(Class<T> clientEndpointType, io.micronaut.http.MutableHttpRequest<?> request) { Publisher<URI> uriPublisher = resolveRequestURI(request); return Flowable.fromPublisher(uriPublisher) .switchMap((resolvedURI) -> connectWebSocket(resolvedURI, request, clientEndpointType, null)); }
@Override public <I> Flowable<io.micronaut.http.HttpResponse<ByteBuffer<?>>> exchangeStream(io.micronaut.http.HttpRequest<I> request) { return Flowable.fromPublisher(resolveRequestURI(request)) .flatMap(buildExchangeStreamPublisher(request)); }
@Override public <T extends AutoCloseable> Flowable<T> connect(Class<T> clientEndpointType, io.micronaut.http.MutableHttpRequest<?> request) { Publisher<URI> uriPublisher = resolveRequestURI(request); return Flowable.fromPublisher(uriPublisher) .switchMap((resolvedURI) -> connectWebSocket(resolvedURI, request, clientEndpointType, null)); }
@Override public <I, O, E> Flowable<io.micronaut.http.HttpResponse<O>> exchange(io.micronaut.http.HttpRequest<I> request, Argument<O> bodyType, Argument<E> errorType) { final io.micronaut.http.HttpRequest<Object> parentRequest = ServerRequestContext.currentRequest().orElse(null); Publisher<URI> uriPublisher = resolveRequestURI(request); return Flowable.fromPublisher(uriPublisher) .switchMap(buildExchangePublisher(parentRequest, request, bodyType, errorType)); }
@Override public <I, O> Flowable<O> jsonStream(io.micronaut.http.HttpRequest<I> request, io.micronaut.core.type.Argument<O> type) { final io.micronaut.http.HttpRequest<Object> parentRequest = ServerRequestContext.currentRequest().orElse(null); return Flowable.fromPublisher(resolveRequestURI(request)) .flatMap(buildJsonStreamPublisher(parentRequest, request, type)); }
@SuppressWarnings("unchecked") @Override public <I> Flowable<ByteBuffer<?>> dataStream(io.micronaut.http.HttpRequest<I> request) { return Flowable.fromPublisher(resolveRequestURI(request)) .flatMap(buildDataStreamPublisher(request)); }
@Override public <I, O, E> Flowable<io.micronaut.http.HttpResponse<O>> exchange(io.micronaut.http.HttpRequest<I> request, Argument<O> bodyType, Argument<E> errorType) { final io.micronaut.http.HttpRequest<Object> parentRequest = ServerRequestContext.currentRequest().orElse(null); Publisher<URI> uriPublisher = resolveRequestURI(request); return Flowable.fromPublisher(uriPublisher) .switchMap(buildExchangePublisher(parentRequest, request, bodyType, errorType)); }
@SuppressWarnings("unchecked") @Override public <I> Flowable<ByteBuffer<?>> dataStream(io.micronaut.http.HttpRequest<I> request) { return Flowable.fromPublisher(resolveRequestURI(request)) .flatMap(buildDataStreamPublisher(request)); }
@Override public <I> Flowable<io.micronaut.http.HttpResponse<ByteBuffer<?>>> exchangeStream(io.micronaut.http.HttpRequest<I> request) { return Flowable.fromPublisher(resolveRequestURI(request)) .flatMap(buildExchangeStreamPublisher(request)); }
@Override public <I, O> Flowable<O> jsonStream(io.micronaut.http.HttpRequest<I> request, io.micronaut.core.type.Argument<O> type) { final io.micronaut.http.HttpRequest<Object> parentRequest = ServerRequestContext.currentRequest().orElse(null); return Flowable.fromPublisher(resolveRequestURI(request)) .flatMap(buildJsonStreamPublisher(parentRequest, request, type)); }
@Override public <T extends AutoCloseable> Flowable<T> connect(Class<T> clientEndpointType, Map<String, Object> parameters) { WebSocketBean<T> webSocketBean = webSocketRegistry.getWebSocket(clientEndpointType); String uri = webSocketBean.getBeanDefinition().getValue(ClientWebSocket.class, String.class).orElse("/ws"); uri = UriTemplate.of(uri).expand(parameters); MutableHttpRequest<Object> request = io.micronaut.http.HttpRequest.GET(uri); Publisher<URI> uriPublisher = resolveRequestURI(request); return Flowable.fromPublisher(uriPublisher) .switchMap((resolvedURI) -> connectWebSocket(resolvedURI, request, clientEndpointType, webSocketBean)); }
@Override public <T extends AutoCloseable> Flowable<T> connect(Class<T> clientEndpointType, Map<String, Object> parameters) { WebSocketBean<T> webSocketBean = webSocketRegistry.getWebSocket(clientEndpointType); String uri = webSocketBean.getBeanDefinition().getValue(ClientWebSocket.class, String.class).orElse("/ws"); uri = UriTemplate.of(uri).expand(parameters); MutableHttpRequest<Object> request = io.micronaut.http.HttpRequest.GET(uri); Publisher<URI> uriPublisher = resolveRequestURI(request); return Flowable.fromPublisher(uriPublisher) .switchMap((resolvedURI) -> connectWebSocket(resolvedURI, request, clientEndpointType, webSocketBean)); }
/** * @param request The request * @param <I> The input type * @return A {@link Publisher} with the resolved URI */ protected <I> Publisher<URI> resolveRequestURI(io.micronaut.http.HttpRequest<I> request) { URI requestURI = request.getUri(); if (requestURI.getScheme() != null) { // if the request URI includes a scheme then it is fully qualified so use the direct server return Publishers.just(requestURI); } else { return Publishers.map(loadBalancer.select(getLoadBalancerDiscriminator()), server -> { Optional<String> authInfo = server.getMetadata().get(io.micronaut.http.HttpHeaders.AUTHORIZATION_INFO, String.class); if (request instanceof MutableHttpRequest) { if (authInfo.isPresent()) { ((MutableHttpRequest) request).getHeaders().auth(authInfo.get()); } } return server.resolve(resolveRequestURI(requestURI)); } ); } }