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.
Comment From: ud1
There are two classes named ServletServerHttpRequest
, first one org.springframework.http.server.ServletServerHttpRequest
and the second org.springframework.http.server.reactive.ServletServerHttpRequest
.
The reactive.ServletServerHttpRequest getLocalAddress
method already uses getLocalAddr()
method.
Comment From: lrgrz
I'm afraid the issue is not resolved.
The AbstractStandardUpgradeStrategy still tries to get InetSocketAddresses during upgrade:
@Override
public void upgrade(ServerHttpRequest request, ServerHttpResponse response,
@Nullable String selectedProtocol, List<WebSocketExtension> selectedExtensions,
@Nullable Principal user, WebSocketHandler wsHandler, Map<String, Object> attrs)
throws HandshakeFailureException {
HttpHeaders headers = request.getHeaders();
InetSocketAddress localAddr = null;
try {
localAddr = request.getLocalAddress();
}
catch (Exception ex) {
// Ignore
}
InetSocketAddress remoteAddr = null;
try {
remoteAddr = request.getRemoteAddress();
}
catch (Exception ex) {
// Ignore
}
and ServerHttpRequest uses constructor of InetSocketAddress, which performs DNS lookup:
@Override
public InetSocketAddress getLocalAddress() {
return new InetSocketAddress(this.servletRequest.getLocalAddr(), this.servletRequest.getLocalPort());
}
@Override
public InetSocketAddress getRemoteAddress() {
return new InetSocketAddress(this.servletRequest.getRemoteHost(), this.servletRequest.getRemotePort());
}
(checked on spring 5.3.20 and java 17)
Comment From: sbrannen
@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