in wagon-providers/wagon-http-shared/src/main/java/org/apache/maven/wagon/shared/http/AbstractHttpClientWagon.java [676:774]
private void put(int wait, Resource resource, File source, HttpEntity httpEntity, String url)
throws TransferFailedException, AuthorizationException, ResourceDoesNotExistException {
// Parent directories need to be created before posting
try {
mkdirs(PathUtils.dirname(resource.getName()));
} catch (HttpException he) {
fireTransferError(resource, he, TransferEvent.REQUEST_PUT);
} catch (IOException e) {
fireTransferError(resource, e, TransferEvent.REQUEST_PUT);
}
// preemptive for put
// TODO: is it a good idea, though? 'Expect-continue' handshake would serve much better
// FIXME Perform only when preemptive has been configured
Repository repo = getRepository();
HttpHost targetHost = new HttpHost(repo.getHost(), repo.getPort(), repo.getProtocol());
AuthScope targetScope = getBasicAuthScope().getScope(targetHost);
if (credentialsProvider.getCredentials(targetScope) != null) {
BasicScheme targetAuth = new BasicScheme(StandardCharsets.UTF_8);
authCache.put(targetHost, targetAuth);
}
HttpPut putMethod = new HttpPut(url);
firePutStarted(resource, source);
try {
putMethod.setEntity(httpEntity);
CloseableHttpResponse response = execute(putMethod);
try {
fireTransferDebug(formatTransferDebugMessage(
url,
response.getStatusLine().getStatusCode(),
response.getStatusLine().getReasonPhrase(),
getProxyInfo()));
int statusCode = response.getStatusLine().getStatusCode();
// Check that we didn't run out of retries.
switch (statusCode) {
// Success Codes
case HttpStatus.SC_OK: // 200
case HttpStatus.SC_CREATED: // 201
case HttpStatus.SC_ACCEPTED: // 202
case HttpStatus.SC_NO_CONTENT: // 204
break;
// TODO Move 401/407 to AuthenticationException after WAGON-587
case HttpStatus.SC_FORBIDDEN:
case HttpStatus.SC_UNAUTHORIZED:
case HttpStatus.SC_PROXY_AUTHENTICATION_REQUIRED:
EntityUtils.consumeQuietly(response.getEntity());
fireSessionConnectionRefused();
throw new AuthorizationException(formatAuthorizationMessage(
url,
response.getStatusLine().getStatusCode(),
response.getStatusLine().getReasonPhrase(),
getProxyInfo()));
case HttpStatus.SC_NOT_FOUND:
case HttpStatus.SC_GONE:
EntityUtils.consumeQuietly(response.getEntity());
throw new ResourceDoesNotExistException(formatResourceDoesNotExistMessage(
url,
response.getStatusLine().getStatusCode(),
response.getStatusLine().getReasonPhrase(),
getProxyInfo()));
case SC_TOO_MANY_REQUESTS:
EntityUtils.consumeQuietly(response.getEntity());
put(backoff(wait, url), resource, source, httpEntity, url);
break;
// add more entries here
default:
EntityUtils.consumeQuietly(response.getEntity());
TransferFailedException e = new TransferFailedException(formatTransferFailedMessage(
url,
response.getStatusLine().getStatusCode(),
response.getStatusLine().getReasonPhrase(),
getProxyInfo()));
fireTransferError(resource, e, TransferEvent.REQUEST_PUT);
throw e;
}
firePutCompleted(resource, source);
EntityUtils.consume(response.getEntity());
} finally {
response.close();
}
} catch (IOException | HttpException | InterruptedException e) {
fireTransferError(resource, e, TransferEvent.REQUEST_PUT);
throw new TransferFailedException(formatTransferFailedMessage(url, getProxyInfo()), e);
}
}