Конфигурация прокси с использованием Reactor Webclient в Java возвращает 405. Метод запрещен. - PullRequest
0 голосов
/ 09 июля 2020
• 1000 также он возвращает статус 200.

Я использую GET-запрос всеми способами.

        HttpClient httpClient = HttpClient.create().tcpConfiguration(tcpClient -> {
            tcpClient = tcpClient.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, this.httpConnectionTimeout * 1000);
            tcpClient = tcpClient.proxy(proxy -> proxy.type(ProxyProvider.Proxy.HTTP)
                        .host("localhost")                  
                        .port(20003)
                        .build());
            return tcpClient;
        });
        ReactorClientHttpConnector connector = new ReactorClientHttpConnector(httpClient);
        WebClient.builder()
                .clientConnector(connector)
                .build()
                .get()
                .uri("http://YYY:PORT/XXX/XXX/")
                .accept(MediaType.APPLICATION_JSON)
                .headers(headerConsumer -> {
                    headerConsumer.set(HttpHeaders.AUTHORIZATION, authToken);
                    headerConsumer.setCacheControl(CacheControl.noCache());
                    headerConsumer.set("X-CSRF-token", "Fetch");
                    headerConsumer.set(HttpHeaders.PROXY_AUTHORIZATION, "Bearer " + bearerToken);
                })
                .exchange();

Ошибка, которую я получил

io.netty.handler.proxy.HttpProxyHandler$HttpProxyConnectException: http, none, localhost/127.0.0.1:20003 => YYY:PORT, status: 405 Method Not Allowed
    at io.netty.handler.proxy.HttpProxyHandler.handleResponse(HttpProxyHandler.java:200) ~[netty-handler-proxy-4.1.49.Final.jar:4.1.49.Final]
    at io.netty.handler.proxy.ProxyHandler.channelRead(ProxyHandler.java:258) ~[netty-handler-proxy-4.1.49.Final.jar:4.1.49.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) [netty-transport-4.1.49.Final.jar:4.1.49.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) [netty-transport-4.1.49.Final.jar:4.1.49.Final]
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) [netty-transport-4.1.49.Final.jar:4.1.49.Final]
    at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436) [netty-transport-4.1.49.Final.jar:4.1.49.Final]
    at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:324) [netty-codec-4.1.49.Final.jar:4.1.49.Final]
    at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:296) [netty-codec-4.1.49.Final.jar:4.1.49.Final]
    at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251) [netty-transport-4.1.49.Final.jar:4.1.49.Final]
    at io.netty.handler.proxy.HttpProxyHandler$HttpClientCodecWrapper.channelRead(HttpProxyHandler.java:272) [netty-handler-proxy-4.1.49.Final.jar:4.1.49.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) [netty-transport-4.1.49.Final.jar:4.1.49.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) [netty-transport-4.1.49.Final.jar:4.1.49.Final]
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) [netty-transport-4.1.49.Final.jar:4.1.49.Final]
    at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410) [netty-transport-4.1.49.Final.jar:4.1.49.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) [netty-transport-4.1.49.Final.jar:4.1.49.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) [netty-transport-4.1.49.Final.jar:4.1.49.Final]
    at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919) [netty-transport-4.1.49.Final.jar:4.1.49.Final]
    at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163) [netty-transport-4.1.49.Final.jar:4.1.49.Final]
    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:714) [netty-transport-4.1.49.Final.jar:4.1.49.Final]
    at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:650) [netty-transport-4.1.49.Final.jar:4.1.49.Final]
    at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:576) [netty-transport-4.1.49.Final.jar:4.1.49.Final]
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493) [netty-transport-4.1.49.Final.jar:4.1.49.Final]
    at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989) [netty-common-4.1.49.Final.jar:4.1.49.Final]
    at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) [netty-common-4.1.49.Final.jar:4.1.49.Final]
    at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) [netty-common-4.1.49.Final.jar:4.1.49.Final]
    at java.lang.Thread.run(Unknown Source) [na:1.8.0_251]

Соответствующий curl будет выглядеть как

curl  -L -i -x localhost:20003 http://YYY:PORT/XXX/XXX/ -H 'Accept: application/json' -u USERNAME:PASSWORD -H "Proxy-Authorization: Bearer $token"  -H 'X-CSRF-token: Fetch' -H 'cache-control: no-cache'

Пока curl возвращает ответ с токеном csrf, который я ищу. Код с использованием org. apache .http.client.HttpClient, который возвращает статус 200 (Успешно)

HttpGet request = new HttpGet("http://YYY:PORT/XXX/XXX/");
        request.setHeader(HttpHeaders.AUTHORIZATION, authToken);
        request.setHeader("Accept", "application/json");
        request.setHeader("X-CSRF-token", "Fetch");
        request.setHeader("Proxy-Authorization", "Bearer " + bearerToken);
HttpHost proxy = new HttpHost("localhost", 20003, "http");
RequestConfig config = RequestConfig.custom().setProxy(proxy).setConnectTimeout(httpConnectionTimeout * 1000).setConnectionRequestTimeout(httpConnectionTimeout * 1000).setSocketTimeout(httpConnectionTimeout * 1000).build();
       request.setConfig(config);
org.apache.http.client.HttpClient client = HttpClientBuilder.create().build();
HttpResponse response = client.execute(request);

1 Ответ

0 голосов
/ 13 июля 2020

Приведенный ниже код будет работать. Если мы хотим сделать запрос к прокси без метода CONNECT.

WebClient.create()
                .get()
                .uri("http://localhost:20003"+ URI.create(targetUrl.getUrl()).getPath())
                .accept(MediaType.APPLICATION_JSON)
                .headers(headerConsumer -> {
                    headerConsumer.set(HttpHeaders.AUTHORIZATION, authToken);
                    headerConsumer.set("X-CSRF-token", "Fetch");
                    headerConsumer.set(HttpHeaders.HOST, URI.create(targetUrl.getUrl()).getHost()+":"+
                            URI.create(targetUrl.getUrl()).getPort());
                    headerConsumer.set(HttpHeaders.PROXY_AUTHORIZATION, "Bearer " + bearerToken);

                })
                .exchange();
...