Description
The ServletServerHttpRequest
getLocalAddress
and getRemoteAddress
methods contain additional DNS queries. The servletRequest.getLocalName()
method requests a hostname
from an IP address, and the InetSocketAddress
constructor calls InetAddress.getByName
, which requests an IP address from a hostname
.
It looks like these requests can be omitted if you use servletRequest.getLocalAddr()
and servletRequest.getRemoteAddr()
instead of get*Name()
methods.
If DNS is not properly configured on the server, then the establishment of a websocket
connection hangs (for a few seconds).
Problematic stack trace:
at java.net.Inet4AddressImpl.getHostByAddr(Native Method)
at java.net.InetAddress$2.getHostByAddr(InetAddress.java:933)
at java.net.InetAddress.getHostFromNameService(InetAddress.java:618)
at java.net.InetAddress.getHostName(InetAddress.java:560)
at java.net.InetAddress.getHostName(InetAddress.java:532)
at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.populateLocalName(NioEndpoint.java:1506)
at org.apache.tomcat.util.net.SocketWrapperBase.getLocalName(SocketWrapperBase.java:277)
at org.apache.coyote.AbstractProcessor.action(AbstractProcessor.java:478)
at org.apache.coyote.Request.action(Request.java:517)
at org.apache.catalina.connector.Request.getLocalName(Request.java:1357)
at org.apache.catalina.connector.RequestFacade.getLocalName(RequestFacade.java:1002)
at org.springframework.http.server.ServletServerHttpRequest.getLocalAddress(ServletServerHttpRequest.java:200)
at org.springframework.web.socket.server.standard.AbstractStandardUpgradeStrategy.upgrade(AbstractStandardUpgradeStrategy.java:116)
at org.springframework.web.socket.server.support.AbstractHandshakeHandler.doHandshake(AbstractHandshakeHandler.java:297)
at org.springframework.web.socket.server.support.WebSocketHttpRequestHandler.handleRequest(WebSocketHttpRequestHandler.java:178)
at org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:52)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1067)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
The impression is that these addresses are not even used by Spring, but are only needed to ensure the operation of the WebSocketSession
methods getLocalAddress()
and getRemoteAddress()
, and we don't use these methods at all.
Activity
ud1 commentedon Apr 4, 2022
There are two classes named
ServletServerHttpRequest
, first oneorg.springframework.http.server.ServletServerHttpRequest
and the secondorg.springframework.http.server.reactive.ServletServerHttpRequest
.The
reactive.ServletServerHttpRequest getLocalAddress
method already usesgetLocalAddr()
method.Consistent use of getLocalAddr() without DNS lookups in request adapters
Consistent use of getLocalAddr() without DNS lookups in request adapters
lrgrz commentedon Sep 19, 2022
I'm afraid the issue is not resolved.
The AbstractStandardUpgradeStrategy still tries to get InetSocketAddresses during upgrade:
and ServerHttpRequest uses constructor of InetSocketAddress, which performs DNS lookup:
(checked on spring 5.3.20 and java 17)
sbrannen commentedon Sep 20, 2022
@lrgrz, this issue was closed back in April.
If you think you have discovered a bug or regression, please create a new issue to address that.
Thanks