Java HttpClient - HTTP/1.1 header parser received no bytes

Viewed 29

I have a small FastAPI app that's running in uvicorn. I'm connecting to it, via Java HttpClient, like this:

HttpRequest request = HttpRequest.newBuilder()
                          .uri(URI.create("http://localhost:8000/api/dummy"))
                          .version(HttpClient.Version.HTTP_1_1)
                          .POST(HttpRequest.BodyPublishers.ofString(jsonRequest.toString()))
                          .build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());

This works fine, when I'm running the FastAPI app on my laptop via:

python -m uvicorn main:api

However, I need to run it in a Docker container. Here's my Dockerfile:

FROM python:3.10

COPY ./src /app/src
COPY requirements.txt /app

WORKDIR /app

RUN pip3 install -r requirements.txt

EXPOSE 8000

WORKDIR /app/src

CMD ["uvicorn", "main:api", "--host=0.0.0.0", "--reload"]

When I run this image, I can connect to it from Postman but when I try to connect via the above Java code, I get the following exception:

    java.io.IOException: http1_0 content, bytes received: 0
        at jdk.internal.net.http.HttpClientImpl.send(HttpClientImpl.java:586) ~[java.net.http:?]
        at jdk.internal.net.http.HttpClientFacade.send(HttpClientFacade.java:123) ~
    ...

        at java.lang.Thread.run(Thread.java:833) [?:?]
    Caused by: java.io.IOException: http1_0 content, bytes received: 0
        at jdk.internal.net.http.common.Utils.wrapWithExtraDetail(Utils.java:351) ~[java.net.http:?]
        at jdk.internal.net.http.Http1Response$BodyReader.onReadError(Http1Response.java:760) ~[java.net.http:?]
        at jdk.internal.net.http.Http1AsyncReceiver.checkForErrors(Http1AsyncReceiver.java:302) ~[java.net.http:?]
        at jdk.internal.net.http.Http1AsyncReceiver.flush(Http1AsyncReceiver.java:268) ~[java.net.http:?]
        at jdk.internal.net.http.common.SequentialScheduler$LockingRestartableTask.run(SequentialScheduler.java:205) ~[java.net.http:?]
        at jdk.internal.net.http.common.SequentialScheduler$CompleteRestartableTask.run(SequentialScheduler.java:149) ~[java.net.http:?]
        at jdk.internal.net.http.common.SequentialScheduler$SchedulableTask.run(SequentialScheduler.java:230) ~[java.net.http:?]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) ~[?:?]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) ~[?:?]
        ... 1 more
Caused by: java.net.SocketException: Connection reset
        at sun.nio.ch.SocketChannelImpl.throwConnectionReset(SocketChannelImpl.java:394) ~[?:?]
        at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:426) ~[?:?]
        at jdk.internal.net.http.SocketTube.readAvailable(SocketTube.java:1170) ~[java.net.http:?]
        at jdk.internal.net.http.SocketTube$InternalReadPublisher$InternalReadSubscription.read(SocketTube.java:833) ~[java.net.http:?]
        at jdk.internal.net.http.SocketTube$SocketFlowTask.run(SocketTube.java:181) ~[java.net.http:?]
        at jdk.internal.net.http.common.SequentialScheduler$SchedulableTask.run(SequentialScheduler.java:230) ~[java.net.http:?]
        at jdk.internal.net.http.common.SequentialScheduler.runOrSchedule(SequentialScheduler.java:303) ~[java.net.http:?]
        at jdk.internal.net.http.common.SequentialScheduler.runOrSchedule(SequentialScheduler.java:256) ~[java.net.http:?]
        at jdk.internal.net.http.SocketTube$InternalReadPublisher$InternalReadSubscription.signalReadable(SocketTube.java:774) ~[java.net.http:?]
        at jdk.internal.net.http.SocketTube$InternalReadPublisher$ReadEvent.signalEvent(SocketTube.java:957) ~[java.net.http:?]
        at jdk.internal.net.http.SocketTube$SocketFlowEvent.handle(SocketTube.java:253) ~[java.net.http:?]
        at jdk.internal.net.http.HttpClientImpl$SelectorManager.handleEvent(HttpClientImpl.java:979) ~[java.net.http:?]
        at jdk.internal.net.http.HttpClientImpl$SelectorManager.lambda$run$3(HttpClientImpl.java:934) ~[java.net.http:?]
        at java.util.ArrayList.forEach(ArrayList.java:1511) ~[?:?]
        at jdk.internal.net.http.HttpClientImpl$SelectorManager.run(HttpClientImpl.java:934) ~[java.net.http:?]

I'm at a bit of a loss here and any help would be much appreciated. I tried not forcing HTTP 1.1 but it didn't help.

0 Answers
Related