private void put()

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);
        }
    }