Jens Schulze created HTTPCLIENT-2249:
----------------------------------------

             Summary: Regression in HTTP client/core
                 Key: HTTPCLIENT-2249
                 URL: https://issues.apache.org/jira/browse/HTTPCLIENT-2249
             Project: HttpComponents HttpClient
          Issue Type: Bug
          Components: HttpClient (async)
    Affects Versions: 5.2
            Reporter: Jens Schulze


This commit 
[https://github.com/apache/httpcomponents-core/commit/6741e3c555b96c4a64358adcb69aa0fddeb735b1]
 introduced a regression in either Core or Client.

It leads to failing requests with "ProtocolException: Header `Host` is illegal" 
also the initiating request didn't included the mentioned header. I created a 
small reproducer:
{code:java}
package test.http.apachehttp;

import java.util.concurrent.*;

import org.apache.hc.client5.http.async.methods.SimpleHttpResponse;
import org.apache.hc.client5.http.async.methods.SimpleResponseConsumer;
import org.apache.hc.client5.http.impl.async.CloseableHttpAsyncClient;
import org.apache.hc.client5.http.impl.async.HttpAsyncClientBuilder;
import org.apache.hc.core5.concurrent.FutureCallback;
import org.apache.hc.core5.http.nio.AsyncRequestProducer;
import org.apache.hc.core5.http.nio.support.AsyncRequestBuilder;

public class HttpTest {

    //    @Test
    public void reproduceHostError() {
        final Executor executor = new ForkJoinPool();
        final CloseableHttpAsyncClient client = 
HttpAsyncClientBuilder.create().build();
        client.start();
        AsyncRequestProducer p = 
AsyncRequestBuilder.get("https://google.com";).build();

        final SimpleHttpResponse response1 = execute(executor, client, 
p).join();
        final SimpleHttpResponse response2 = execute(executor, client, 
p).join();
        final SimpleHttpResponse response3 = execute(executor, client, 
p).join();
        //        final SimpleHttpResponse response4 = execute(executor, 
client, p).join();

        final int code = response1.getCode();
    }

    private CompletableFuture<SimpleHttpResponse> execute(Executor executor, 
CloseableHttpAsyncClient client,
            AsyncRequestProducer p) {
        final CompletableFuture<SimpleHttpResponse> apacheResponseFuture = new 
CompletableFuture<>();

        client.execute(p, SimpleResponseConsumer.create(), new 
FutureCallback<SimpleHttpResponse>() {
            @Override
            public void completed(SimpleHttpResponse result) {
                apacheResponseFuture.complete(result);
            }

            @Override
            public void failed(Exception ex) {
                apacheResponseFuture.completeExceptionally(ex);
            }

            @Override
            public void cancelled() {
                apacheResponseFuture.cancel(true);
            }
        });
        return apacheResponseFuture.thenApplyAsync(simpleHttpResponse1 -> 
simpleHttpResponse1, executor);
    }
}
{code}
The 3rd request will fail with the mentioned ProtocolException.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to