diff --git a/pom.xml b/pom.xml index e373fe58bc4e49a221adf1f87747306731589e8c..936b09e1df9175f5393b78446501b528c4fb395b 100644 --- a/pom.xml +++ b/pom.xml @@ -91,6 +91,11 @@ <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> </dependency> + <dependency> + <groupId>org.apache.httpcomponents.client5</groupId> + <artifactId>httpclient5</artifactId> + </dependency> + <!-- used by generated code --> <!-- @Nullable annotation --> @@ -148,7 +153,7 @@ <configOptions> <sourceFolder>src/gen/java/main</sourceFolder> <serializationLibrary>jackson</serializationLibrary> - <library>webclient</library> + <library>restclient</library> <annotationLibrary>swagger2</annotationLibrary> <apiPackage>de.ozgcloud.nachrichten.postfach.osiv2.gen.api</apiPackage> <modelPackage>de.ozgcloud.nachrichten.postfach.osiv2.gen.model</modelPackage> diff --git a/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/config/ApiClientConfiguration.java b/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/config/ApiClientConfiguration.java index 16d7d79b1155b63b0dffbbc6a87351ecf1aecbc0..4fad50c977fdf20a3bddfe5f72fe7dfa5063ae25 100644 --- a/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/config/ApiClientConfiguration.java +++ b/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/config/ApiClientConfiguration.java @@ -1,11 +1,21 @@ package de.ozgcloud.nachrichten.postfach.osiv2.config; +import org.apache.hc.client5.http.auth.AuthScope; +import org.apache.hc.client5.http.auth.UsernamePasswordCredentials; +import org.apache.hc.client5.http.classic.HttpClient; +import org.apache.hc.client5.http.impl.auth.BasicCredentialsProvider; +import org.apache.hc.client5.http.impl.classic.HttpClientBuilder; +import org.apache.hc.core5.http.HttpHost; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.http.client.ClientHttpRequestFactory; +import org.springframework.http.client.ClientHttpRequestInterceptor; +import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.http.client.reactive.ReactorClientHttpConnector; import org.springframework.security.oauth2.client.AuthorizedClientServiceReactiveOAuth2AuthorizedClientManager; import org.springframework.security.oauth2.client.InMemoryReactiveOAuth2AuthorizedClientService; +import org.springframework.security.oauth2.client.OAuth2AuthorizedClientManager; import org.springframework.security.oauth2.client.ReactiveOAuth2AuthorizedClientProvider; import org.springframework.security.oauth2.client.ReactiveOAuth2AuthorizedClientProviderBuilder; import org.springframework.security.oauth2.client.endpoint.WebClientReactiveClientCredentialsTokenResponseClient; @@ -13,13 +23,12 @@ import org.springframework.security.oauth2.client.registration.ReactiveClientReg import org.springframework.security.oauth2.client.web.reactive.function.client.ServerOAuth2AuthorizedClientExchangeFilterFunction; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; +import org.springframework.web.client.RestClient; import org.springframework.web.reactive.function.client.WebClient; import de.ozgcloud.nachrichten.postfach.osiv2.gen.ApiClient; import de.ozgcloud.nachrichten.postfach.osiv2.gen.api.MessageExchangeApi; import lombok.RequiredArgsConstructor; -import reactor.netty.http.client.HttpClient; -import reactor.netty.transport.ProxyProvider; @Configuration @RequiredArgsConstructor @@ -34,6 +43,41 @@ public class ApiClientConfiguration { return new MessageExchangeApi(apiClient); } + @Bean + ApiClient apiClient(OAuth2AuthorizedClientManager authorizedClientManager) { + RestClient restClient = RestClient.builder() + .requestFactory(createProxyRequestFactory()) + .requestInterceptor(createOAuth2Interceptor(authorizedClientManager)) + .baseUrl(apiConfiguration.getUrl()).build(); + + return new ApiClient(restClient); + } + + + + private ClientHttpRequestFactory createProxyRequestFactory(){ + var requestFactory = new HttpComponentsClientHttpRequestFactory(); + if(proxyConfiguration.isEnabled()){ + var credsProvider = new BasicCredentialsProvider(); + credsProvider.setCredentials( + new AuthScope(proxyConfiguration.getHost(), proxyConfiguration.getPort()), + new UsernamePasswordCredentials(proxyConfiguration.getUsername(), proxyConfiguration.getPassword().toCharArray()) + ); + var httpClient = HttpClientBuilder.create() + .setProxy(new HttpHost(proxyConfiguration.getHost(), proxyConfiguration.getPort())) + .setDefaultCredentialsProvider(credsProvider) + .build(); + requestFactory.setHttpClient(httpClient); + } + return requestFactory; + } + + private ClientHttpRequestInterceptor createOAuth2Interceptor(OAuth2AuthorizedClientManager authorizedClientManager) { + OAuth2ClientHttpRequestInterceptor interceptor = new OAuth2ClientHttpRequestInterceptor(authorizedClientManager); + + } + + @Bean ApiClient apiClient(ReactiveClientRegistrationRepository clientRegistrations) { return new ApiClient(osi2PostfachWebClient(clientRegistrations)) diff --git a/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/PostfachApiFacadeService.java b/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/PostfachApiFacadeService.java index 246a12108b9fdc919df2bd87b11aa93219f71d8a..858f50cdc1c140138cf63e258dbaa318fbdcdf90 100644 --- a/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/PostfachApiFacadeService.java +++ b/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/PostfachApiFacadeService.java @@ -21,21 +21,21 @@ public record PostfachApiFacadeService(MessageExchangeApi messageExchangeApi, Re messageExchangeApi.sendMessage( requestMapper.mapMailboxId(nachricht), requestMapper.mapOutSendMessageRequestV2(nachricht) - ).block(); + ); } public Stream<PostfachNachricht> receiveMessages() { - var response = messageExchangeApi.receiveMessages(MAX_NUMBER_RECEIVED_MESSAGES, 0).block(); + var response = messageExchangeApi.receiveMessages(MAX_NUMBER_RECEIVED_MESSAGES, 0); return response.getMessages().stream().map(this::fetchMessageByGuid); } PostfachNachricht fetchMessageByGuid(final MessageExchangeReceiveMessage message) { - var messageReply = messageExchangeApi.getMessage(message.getGuid()).block(); + var messageReply = messageExchangeApi.getMessage(message.getGuid()); return responseMapper.toPostfachNachricht(messageReply); } public void deleteMessage(final String messageId) { - messageExchangeApi.deleteMessage(UUID.fromString(messageId)).block(); + messageExchangeApi.deleteMessage(UUID.fromString(messageId)); } }