Как обойти ожидание 100-непрерывного ответа сервера S3 в методе boto3 put_objectPython

Программы на Python
Ответить
Anonymous
 Как обойти ожидание 100-непрерывного ответа сервера S3 в методе boto3 put_object

Сообщение Anonymous »

Я пытаюсь запустить простую клиентскую программу boto3, чтобы поместить объект в корзину на рабочем сервере S3. Я уверен, что сервер запущен и настроен правильно, поскольку я могу прекрасно загрузить его через Curl, через AWS Java SDK и т. д. Фактически, я могу взять строки журнала отладки из моего неудачного скрипта boto3 и преобразовать их в запрос Curl. и они работают отлично. Я пытаюсь загрузить очень маленький файл, длиной всего 136 байт.
Однако мой сервер S3 НЕ отправляет 100 ответов продолжения до тех пор, пока не будет отправлено тело файла. Но boto3 и botocore ожидают ответа 100 перед передачей тела запроса put_object. Более того, похоже, что boto3 и botocore указывают длину содержимого тела в начальном наборе заголовков, а это означает, что сервер бесконечно ожидает прибытия 136 байтов содержимого. В результате сервер простаивает в ожидании передачи тела сообщения, а у клиента истекает время ожидания ответа 100, который так и не придет. Файл никогда не загружается. Этот сервер является коммерческим продуктом, поэтому я не могу ничего изменить в его конфигурациях S3 или HTTP. Я застрял с настройками, как они есть.
Есть ли простой способ обойти ожидание кода ответа 100 в клиентском коде или принудительно передать тело запроса, даже если 100 не возвращается?
Вот мой код boto3. Да, я знаю, что sigV4 лучше, но у меня та же проблема с V2 или V4, и при отладке с другими программами с помощью V2 легче создавать подписи. Это только черновик.

Код: Выделить всё

import boto3
import botocore
import logging
import warnings
from boto3.compat import PythonDeprecationWarning
from botocore.config import Config
import http.client as http_client

# Suppress deprecation warnings
warnings.filterwarnings("ignore", category=PythonDeprecationWarning)

# Configure logging
logging.basicConfig(level=logging.DEBUG)

# Configure to use Signature Version 2
config = Config(
signature_version='s3',
retries = {'max_attempts': 0},
s3 = {
'use_accelerate_endpoint': False,
'expect_100_continue': False
}
)

# Initialize the S3 client with the custom endpoint and configuration
s3 = boto3.client('s3', endpoint_url='http://:80', config=config)

# Upload the file
try:
with open('jeremy_test.txt', 'rb') as data:
s3.put_object(
Bucket='a-bucket',
Key='jeremy_upload.txt',
Body=data.read(),
ContentType='text/plain'
)
print("File uploaded successfully.")
except Exception as e:
print(f"An error occurred: {e}")
Вот соответствующие файлы журналов, показывающие, что происходит:

Код: Выделить всё

DEBUG:botocore.hooks:Event request-created.s3.PutObject: calling handler 
DEBUG:botocore.endpoint:Sending http request: 
DEBUG:urllib3.connectionpool:Starting new HTTP connection (1): :80
send: b'PUT /a-bucket/jeremy_upload.txt HTTP/1.1\r\nHost: \r\nAccept-Encoding: identity\r\nContent-Type: text/plain\r\nUser-Agent: Boto3/1.33.13 md/Botocore#1.33.13 ua/2.0 os/linux#4.18.19-100.fc27.x86_64 md/arch#x86_64 lang/python#3.7.11 md/pyimpl#CPython cfg/retry-mode#legacy Botocore/1.33.13\r\nContent-MD5: p5noto3k/PSRC+Krl8ivcQ==\r\nExpect: 100-continue\r\nDate: Fri, 27 Sep 2024 03:13:32 GMT\r\nAuthorization: AWS rUNA7sEVArrRIaEp3zlA:/SY4HtAuh4x7edFBU5u8krHMGz4=\r\namz-sdk-invocation-id: 616bbf1b-f8fb-448e-9c33-340c6d7b614c\r\namz-sdk-request: attempt=1\r\nContent-Length: 136\r\n\r\n'
DEBUG:botocore.awsrequest:Waiting for 100 Continue response.
reply: '\r\n'
DEBUG:botocore.hooks:Event needs-retry.s3.PutObject: calling handler 
An error occurred: Connection was closed before we received a valid response from endpoint URL: "http://:80/a-bucket/jeremy_upload.txt".
Я пробовал обработчики событий и настроил конфигурацию так, чтобы она не ожидала_100_continue. Я пробовал обработчики событий, но я очень хорошо разбираюсь в boto3/botocore, поэтому мне не повезло.

Подробнее здесь: https://stackoverflow.com/questions/790 ... put-object
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»