Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Gateway MVC: Calling the Wiremock service results in a java.io.IOException: EOF reached while reading. #3296

Closed
NiiazKhan opened this issue Mar 12, 2024 · 4 comments

Comments

@NiiazKhan
Copy link

NiiazKhan commented Mar 12, 2024

I use java 21, Gradle, Spring cloud 2023.0.0, Spring Boot 3.2.2, spring-cloud-starter-gateway-mvc:4.1.1 and spring-cloud-gateway-server-mvc:4.1.1 .
Calling the Wiremock service from the Gateway MVC service results in a java.io.IOException: EOF reached while reading.
BUT it works for Gateway (WebFlux)!!!

When the Application-Mode=demo header is passed, routing to the Wiremock service should occur.
https://wiremock.org/docs/download-and-installation/

  1. I run wiremock:
docker run -it --rm -p 8080:8080 --name wiremock \
  wiremock/wiremock:3.4.1
  1. setting a universal stub for all calls:
curl --location --request POST 'http://localhost:8080/__admin/mappings' \
--data-raw '{
  "request": {
    "method": "ANY",
    "urlPattern": ".*"
  },
  "response": {
    "status": 200,
    "body": "This is a universal response to all requests.",
    "headers": {
      "Content-Type": "text/plain"
    }
  }
}
'
  1. check my stub http://localhost:8080/__admin/mappings
  2. I use Postman to do POST localhost:8080/authenticate/test and get response 200 "This is a universal response to all requests."
  3. I run my Gateway MVC in port 8081:
server:
  port: 8081
  shutdown: graceful
  error:
    include-message: always

spring:
  application:
    name: my-gateway
  threads:
    virtual:
      enabled: true
  cloud:
    config:
      enabled: false
    gateway:
      mvc:
        routes:
          - id: my-wiremock
            uri: http://localhost:8080
            predicates:
              - Header=Application-Mode, demo
  1. I use Postman to do POST localhost:8081/authenticate/test or curl curl --location --request POST 'localhost:8081/authenticate/test' \ --header 'Application-Mode: demo' \ --data-raw ''

  2. I have exception:

12/03/24 16:22:51.525 TRACE [tomcat-handler-1] o.s.w.s.DispatcherServlet [serviceName=my-gateway, traceId=65f0491b6568f295607788e7ba2ea2d5, spanId=607788e7ba2ea2d5] [FrameworkServlet.java:1106] Failed to complete request
 org.springframework.web.client.ResourceAccessException: I/O error on POST request for "http://localhost:8080/authenticate/test": EOF reached while reading
	at org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.createResourceAccessException(DefaultRestClient.java:549)
	at org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchangeInternal(DefaultRestClient.java:474)
	at org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchange(DefaultRestClient.java:444)
	at org.springframework.cloud.gateway.server.mvc.handler.RestClientProxyExchange.exchange(RestClientProxyExchange.java:40)
	at org.springframework.cloud.gateway.server.mvc.handler.ProxyExchangeHandlerFunction.handle(ProxyExchangeHandlerFunction.java:105)
	at org.springframework.cloud.gateway.server.mvc.handler.HandlerFunctions$LookupProxyExchangeHandlerFunction.handle(HandlerFunctions.java:102)
	at org.springframework.web.servlet.function.HandlerFilterFunction.lambda$ofRequestProcessor$3(HandlerFilterFunction.java:83)
	at org.springframework.web.servlet.function.HandlerFilterFunction.lambda$andThen$0(HandlerFilterFunction.java:58)
	at org.springframework.cloud.gateway.server.mvc.config.GatewayMvcPropertiesBeanDefinitionRegistrar.lambda$getRouterFunction$3(GatewayMvcPropertiesBeanDefinitionRegistrar.java:180)
	at org.springframework.web.servlet.function.HandlerFilterFunction.lambda$andThen$0(HandlerFilterFunction.java:58)
	at org.springframework.web.servlet.function.HandlerFilterFunction.lambda$ofRequestProcessor$3(HandlerFilterFunction.java:83)
	at org.springframework.web.servlet.function.HandlerFilterFunction.lambda$andThen$1(HandlerFilterFunction.java:59)
	at org.springframework.web.servlet.function.HandlerFilterFunction.lambda$andThen$1(HandlerFilterFunction.java:59)
	at org.springframework.web.servlet.function.HandlerFilterFunction.lambda$apply$2(HandlerFilterFunction.java:70)
	at org.springframework.web.servlet.function.support.HandlerFunctionAdapter.handle(HandlerFunctionAdapter.java:107)
Caused by: java.io.IOException: EOF reached while reading
	at java.net.http/jdk.internal.net.http.HttpClientImpl.send(HttpClientImpl.java:964)
	at java.net.http/jdk.internal.net.http.HttpClientFacade.send(HttpClientFacade.java:133)
	at org.springframework.http.client.JdkClientHttpRequest.executeInternal(JdkClientHttpRequest.java:102)
	at org.springframework.http.client.AbstractStreamingClientHttpRequest.executeInternal(AbstractStreamingClientHttpRequest.java:70)
	at org.springframework.http.client.AbstractClientHttpRequest.execute(AbstractClientHttpRequest.java:66)
	at org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchangeInternal(DefaultRestClient.java:468)
	at org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchange(DefaultRestClient.java:444)
	at org.springframework.cloud.gateway.server.mvc.handler.RestClientProxyExchange.exchange(RestClientProxyExchange.java:40)
	at org.springframework.cloud.gateway.server.mvc.handler.ProxyExchangeHandlerFunction.handle(ProxyExchangeHandlerFunction.java:105)
	at org.springframework.cloud.gateway.server.mvc.handler.HandlerFunctions$LookupProxyExchangeHandlerFunction.handle(HandlerFunctions.java:102)
	at org.springframework.web.servlet.function.HandlerFilterFunction.lambda$ofRequestProcessor$3(HandlerFilterFunction.java:83)
	at org.springframework.web.servlet.function.HandlerFilterFunction.lambda$andThen$0(HandlerFilterFunction.java:58)
	at org.springframework.cloud.gateway.server.mvc.config.GatewayMvcPropertiesBeanDefinitionRegistrar.lambda$getRouterFunction$3(GatewayMvcPropertiesBeanDefinitionRegistrar.java:180)
	at org.springframework.web.servlet.function.HandlerFilterFunction.lambda$andThen$0(HandlerFilterFunction.java:58)
	at org.springframework.web.servlet.function.HandlerFilterFunction.lambda$ofRequestProcessor$3(HandlerFilterFunction.java:83)
Caused by: java.io.EOFException: EOF reached while reading
	at java.net.http/jdk.internal.net.http.Http2Connection$Http2TubeSubscriber.onComplete(Http2Connection.java:1587)
	at java.net.http/jdk.internal.net.http.SocketTube$InternalReadPublisher$ReadSubscription.signalCompletion(SocketTube.java:648)
	at java.net.http/jdk.internal.net.http.SocketTube$InternalReadPublisher$InternalReadSubscription.read(SocketTube.java:853)
	at java.net.http/jdk.internal.net.http.SocketTube$SocketFlowTask.run(SocketTube.java:181)
	at java.net.http/jdk.internal.net.http.common.SequentialScheduler$SchedulableTask.run(SequentialScheduler.java:207)
	at java.net.http/jdk.internal.net.http.common.SequentialScheduler.runOrSchedule(SequentialScheduler.java:280)
	at java.net.http/jdk.internal.net.http.common.SequentialScheduler.runOrSchedule(SequentialScheduler.java:233)
	at java.net.http/jdk.internal.net.http.SocketTube$InternalReadPublisher$InternalReadSubscription.signalReadable(SocketTube.java:782)
	at java.net.http/jdk.internal.net.http.SocketTube$InternalReadPublisher$ReadEvent.signalEvent(SocketTube.java:965)
	at java.net.http/jdk.internal.net.http.SocketTube$SocketFlowEvent.handle(SocketTube.java:253)
	at java.net.http/jdk.internal.net.http.HttpClientImpl$SelectorManager.handleEvent(HttpClientImpl.java:1467)
	at java.net.http/jdk.internal.net.http.HttpClientImpl$SelectorManager.lambda$run$3(HttpClientImpl.java:1412)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
	at java.net.http/jdk.internal.net.http.HttpClientImpl$SelectorManager.run(HttpClientImpl.java:1412)
12/03/24 16:22:51.526 TRACE [tomcat-handler-1] o.s.b.f.s.DefaultListableBeanFactory [serviceName=my-gateway, traceId=65f0491b6568f295607788e7ba2ea2d5, spanId=607788e7ba2ea2d5] [AbstractBeanFactory.java:255] Returning cached instance of singleton bean 'refreshEventListener'

@NiiazKhan
Copy link
Author

@spencergibb help me please :) it is important for our product.

@NiiazKhan
Copy link
Author

it works for Spring Cloud Gateway (webFlux);

2024-03-12 16:29:45.699 DEBUG [,335e0f90ba18145f,335e0f90ba18145f] 54378 --- [ctor-http-nio-4] n.m.g.w.l.RequestResponseLoggingFilter   :  RESPONSE [traceId=335e0f90ba18145f]: [took 71 ms] [200 OK] /authenticate/test
RESPONSE BODY: �����������,V��D�Ҽ̲Ԣ����������T��|������4���X����?z-���
2024-03-12 16:29:45.704 DEBUG [,,] 54378 --- [ctor-http-nio-4] r.n.r.DefaultPooledConnectionProvider    : [c4600e68, L:/127.0.0.1:50162 - R:localhost/127.0.0.1:8080] onStateChange(POST{uri=/authenticate/test, connection=PooledConnection{channel=[id: 0xc4600e68, L:/127.0.0.1:50162 - R:localhost/127.0.0.1:8080]}}, [response_completed])

@spencergibb
Copy link
Member

See #3183 (comment) there is an issue with the JDK http client and wiremock with http 2

@NiiazKhan
Copy link
Author

@spencergibb thank you! It works great.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants