pact-foundation / pact-jvm

JVM version of Pact. Enables consumer driven contract testing, providing a mock service and DSL for the consumer project, and interaction playback and verification for the service provider project.
https://docs.pact.io
Apache License 2.0
1.08k stars 479 forks source link

Mock server unable to handle `HEAD` HTTP method #1828

Open RanABI opened 1 month ago

RanABI commented 1 month ago

Hi team, I am using your Mock-Servers, When mocking an HTTP HEAD request, I receive the following error:

sun.net.httpserver.ExchangeImpl sendResponseHeaders

WARNING: sendResponseHeaders: being invoked with a content length for a HEAD request

2024-09-17 10:52:09,159 APP ERROR - [34][HTTP-Dispatcher] [] Failed to generate response

java.io.IOException: response headers not sent yet

at sun.net.httpserver.PlaceholderOutputStream.checkWrap(ExchangeImpl.java:448) ~[jdk.httpserver:?]

I see the error's origin is at MockHttpServer.kt , in the pactResponseToHttpExchange function, I guess the exchange is closing before response headers are being sent.

My mock is very simple -

builder.expectsToReceiveHttpInteraction("Auth check",
        interaction -> interaction
            .withRequest(request -> request
                .path("/v1/my/path")
                .method("HEAD")
            .willRespondWith(response ->
                response.status(200)
    );
uglyog commented 3 weeks ago

WARNING: sendResponseHeaders: being invoked with a content length for a HEAD request

This is because HEAD requests can not have a body. If you don't set a body, you won't get that message. But it is a warning, it won't fail the test.