Hello, The latest version in the 4.4 line (4.4.10) documents[0] the default value for the TCP_NODELAY socket option via SocketConfig.isTcpNoDelay as unset (false).
org.apache.http.config.SocketConfig.isTcpNoDelay L128:
/**
* Determines the default value of the {@link
java.net.SocketOptions#TCP_NODELAY} parameter
* for newly created sockets.
* <p>
* Default: {@code false}
* </p>
*
* @return the default value of the {@link
java.net.SocketOptions#TCP_NODELAY} parameter.
* @see java.net.SocketOptions#TCP_NODELAY
*/
public boolean isTcpNoDelay() {
return tcpNoDelay;
}
However, the builder sets it (sets its own tcpNoDelay field to true) by
default before passing it in the SocketConfig constructor when building
the object.
org.apache.http.config.SocketConfig.Builder.Builder L233:
Builder() {
this.soLinger = -1;
this.tcpNoDelay = true;
}
Given SocketConfig can only be instantiated with the builder and given
the relevant field there isn't written to by anything (other than the
public setTcpNoDelay method of course) I believe there is a mismatch
between the documentation and reality.
I'm not sure what the original intent is as both these lines were added
in the same revision (1400016[1], git mirror commit ID
373066c3d7d5c6b4877cfbd09acca99dc0623650[2]) in October 2012. That
being said, the same author previously (August 2012) explicitly set the
default to true in HttpCore NIO in revision 1369809[3] (git mirror
commit ID 3674f6d8e056df67dbf510857841acbae9aaf8be[4]) as part of
HTTPCORE-306[5] released as part of version 4.3. In the previous
version before the 4.3 line (in which the SocketConfig class was
introduced) was branched off (4.2.1) it seems the default was to set it
as well.
[4.2.1] org.apache.http.params.HttpConnectionParams.getTcpNoDelay L100:
/**
* Obtains value of the {@link CoreConnectionPNames#TCP_NODELAY}
parameter.
* If not set, defaults to <code>true</code>.
*
* @param params HTTP parameters.
* @return Nagle's algorithm flag
*/
public static boolean getTcpNoDelay(final HttpParams params) {
if (params == null) {
throw new IllegalArgumentException("HTTP parameters may not
be null");
}
return params.getBooleanParameter
(CoreConnectionPNames.TCP_NODELAY, true);
}
I'm not sure how much research went into the decision; HTTPCORE-306 at
least doesn't seem to consider much of the nuances behind setting that
option[6]. The earliest reference I could see in the codebase was in
2005 (set), prior to which it was probably using the operating system
default (often unset). Given past and existing behavior in the
codebase I think changing the documentation is the most sensible thing
to do. FWIW I also think setting it is a reasonable default nowadays.
Thanks for having a look into this, as a user the documentation was
definitely confusing.
0:
http://hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/apache/http/config/SocketConfig.html
1: https://svn.apache.org/viewvc?view=revision&revision=1400016
2:
https://github.com/apache/httpcomponents-core/commit/373066c3d7d5c6b4877cfbd09acca99dc0623650
3: https://svn.apache.org/viewvc?view=revision&revision=1369809
4:
https://github.com/apache/httpcomponents-core/commit/3674f6d8e056df67dbf510857841acbae9aaf8be
5: https://issues.apache.org/jira/browse/HTTPCORE-306
6: https://eklitzke.org/the-caveats-of-tcp-nodelay
--
Thibault Nélis <[email protected]>
Osimis
signature.asc
Description: This is a digitally signed message part
