slachiewicz opened a new issue, #908:
URL: https://github.com/apache/maven-wagon/issues/908

   ### Affected version
   
   3.5.3 and `master` — `ConfigurationUtils` and `AbstractHttpClientWagon` are 
byte-identical on both branches.
   
   ### Bug description
   
   Any `httpConfiguration` block that applies to a method discards the timeouts 
set through `Wagon.setTimeout()` and `Wagon.setReadTimeout()`, even when the 
block says nothing about timeouts.
   
   `AbstractHttpClientWagon.execute()` sets them first:
   
   ```java
   requestConfigBuilder.setConnectTimeout(getTimeout());      // :855
   requestConfigBuilder.setSocketTimeout(getReadTimeout());   // :856
   ```
   
   then, eleven lines later, hands the builder to `copyConfig`:
   
   ```java
   ConfigurationUtils.copyConfig(config, requestConfigBuilder);   // :866
   ```
   
   which overwrites both unconditionally, with no test for whether the user 
configured anything:
   
   ```java
   public static void copyConfig(HttpMethodConfiguration config, 
RequestConfig.Builder builder) {
       builder.setConnectTimeout(config.getConnectionTimeout());   // :61
       builder.setSocketTimeout(config.getReadTimeout());          // :62
   ```
   
   The replacement values are `HttpMethodConfiguration`'s field defaults. So 
configuring, say, a single header for PUT silently resets that method's 
timeouts.
   
   This is invisible while nothing calls `setTimeout`/`setReadTimeout`, because 
the defaults coincide. It becomes visible as soon as something does.
   
   ### Two related cases in the same code
   
   **An empty per-method block can override an explicit `<all>` read timeout, 
but only under `-Dmaven.wagon.rto`.** The merge treats "differs from the 
constant default" as "explicitly set":
   
   ```java
   if (local.getReadTimeout() != Wagon.DEFAULT_READ_TIMEOUT) {   // 
ConfigurationUtils:159
       result.setReadTimeout(local.getReadTimeout());
   }
   ```
   
   while the field default is itself read from that property:
   
   ```java
   private int readTimeout =
           Integer.parseInt(System.getProperty("maven.wagon.rto", 
Integer.toString(Wagon.DEFAULT_READ_TIMEOUT)));
   ```
   
   So with `-Dmaven.wagon.rto=60000`, an `<all>` of 600000 and a `<put>` block 
with only headers, the put inherits 60000 rather than the 600000 that was asked 
for. `connectionTimeout` has no equivalent problem, because its field default 
is the constant.
   
   **A per-method timeout cannot be set back to the default value**, by the 
same comparison — writing `<readTimeout>1800000</readTimeout>` is 
indistinguishable from omitting it.
   
   ### Test coverage
   
   None, in either direction. Nothing under `wagon-http-shared/src/test`, 
`wagon-http/src/test` or `wagon-provider-test` references `ConfigurationUtils`, 
so no test locks in the current behaviour and none would catch a fix. The 
existing timeout tests miss it by accident: `HttpWagonTimeoutTest` either calls 
`setReadTimeout` with no `httpConfiguration` at all, or sets an explicit 
`<all>` connection timeout.
   
   ### One thing not verified here
   
   Whether `maven-resolver-transport-wagon` calls `setTimeout`/`setReadTimeout` 
from the resolver's own timeout settings — that code is outside this 
repository. If it does, this is reachable in an ordinary `mvn deploy`; if it 
does not, it needs an embedder that sets them. The in-repo half — that 
`copyConfig` overwrites unconditionally — stands either way.
   
   Found while writing the HTTP configuration guide in #905. Related to #906: 
same file, same class of defect, different mechanism.
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to