Проблема пользовательского заголовка Amazon SDK в Transfer Manager

Мы пытаемся использовать TransferManager для скачивания файла из Amazon S3. Но TransferManager несколько раз использует сервис getObjectMetadata в функции doDownload. И позвонить в те службы, создающие запрос, скопировав общих членов из первоначального запроса, который предоставлен мной.

Проблема в том, что я добавил несколько пользовательских заголовков, включая заголовок авторизации. И getObjectMetadata нуждается в этом заголовке. Поэтому я должен изменить какой-то класс SDK.

AmazonS3Client.java

protected <X extends AmazonWebServiceRequest> Request<X> createRequest(String bucketName, String key, X originalRequest, HttpMethodName httpMethod, URI endpoint) {
        // If the underlying AmazonS3Client has enabled accelerate mode and the original
        // request operation is accelerate mode supported, then the request will use the
        // s3-accelerate endpoint to performe the operations.
        if (clientOptions.isAccelerateModeEnabled() && !(originalRequest instanceof S3AccelerateUnsupported)) {
            if (clientOptions.isDualstackEnabled()) {
                endpoint = RuntimeHttpUtils.toUri(Constants.S3_ACCELERATE_DUALSTACK_HOSTNAME, clientConfiguration);
            } else {
                endpoint = RuntimeHttpUtils.toUri(Constants.S3_ACCELERATE_HOSTNAME, clientConfiguration);
            }
        }



        Request<X> request = new DefaultRequest<X>(originalRequest, Constants.S3_SERVICE_DISPLAY_NAME);
        request.setHttpMethod(httpMethod);
        request.addHandlerContext(S3HandlerContextKeys.IS_CHUNKED_ENCODING_DISABLED,
                Boolean.valueOf(clientOptions.isChunkedEncodingDisabled()));
        request.addHandlerContext(S3HandlerContextKeys.IS_PAYLOAD_SIGNING_ENABLED,
                Boolean.valueOf(clientOptions.isPayloadSigningEnabled()));
        //my code starts here
        if ( originalRequest.getCustomRequestHeaders() != null ) {
            Set<String> keys = originalRequest.getCustomRequestHeaders().keySet();
            for (Iterator<String> iterator = keys.iterator(); iterator.hasNext();) {
                String headerKey =  iterator.next();
                request.addHeader(headerKey, originalRequest.getCustomRequestHeaders().get(headerKey));
            }
        }
        //my code ends here
        resolveRequestEndpoint(request, bucketName, key, endpoint);
        request.addHandlerContext(HandlerContextKey.SIGNING_REGION, getSigningRegion());

        return request;
    }

RequestCopyUtils.java

public static GetObjectMetadataRequest createGetObjectMetadataRequestFrom(GetObjectRequest getObjectRequest) {
    GetObjectMetadataRequest getObjectMetadataRequest = new GetObjectMetadataRequest(getObjectRequest.getBucketName(), getObjectRequest.getKey())
            .withVersionId(getObjectRequest.getVersionId())
            .withRequesterPays(getObjectRequest.isRequesterPays())
            .withSSECustomerKey(getObjectRequest.getSSECustomerKey())
            .withPartNumber(getObjectRequest.getPartNumber());
    Set<String> keys = getObjectRequest.getCustomRequestHeaders().keySet();

    for (Iterator<String> iterator = keys.iterator(); iterator.hasNext();) {
        String key =  iterator.next();
        getObjectMetadataRequest.putCustomRequestHeader(key, getObjectRequest.getCustomRequestHeaders().get(key));
    }

    return getObjectMetadataRequest;
}

Для меня это кажется ошибкой. Но есть ли какое-то правильное решение?

С уважением

0 ответов

Другие вопросы по тегам