Однако мой сервер 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".
Подробнее здесь: https://stackoverflow.com/questions/790 ... put-object
Мобильная версия