vbondarevsky / Connector

Коннектор: удобный HTTP-клиент для 1С:Предприятие 8
Apache License 2.0
638 stars 207 forks source link

Кодировать надо не только параметры URL, но и путь #131

Closed zerobig closed 8 months ago

zerobig commented 9 months ago

Попробовал обратиться по url, который содержит не только английские буквы, получил от сервера ошибку. В принципе мне ничто не мешает кодировать url перед передачей его в библиотеку, но, на мой взгляд, логично было бы внести это внутрь библиотеки чтобы не вспоминать каждый раз перед вызовом. Что-то вроде:

Функция СобратьАдресРесурса(СтруктураURL, ПараметрыЗапроса)

    АдресРесурса = КодироватьСтроку(СтруктураURL.Путь, СпособКодированияСтроки.URLВКодировкеURL);
    ...

КонецФункции

вместо

Функция СобратьАдресРесурса(СтруктураURL, ПараметрыЗапроса)

    АдресРесурса = СтруктураURL.Путь;
    ...

КонецФункции
leemuar commented 9 months ago

получил от сервера ошибку.

Какую именно ошибку получили? Пришлите URL и ошибку

zerobig commented 9 months ago

Это был локальный сервер MinIO и конфигурация демо БСП.

Запрос: HEAD http://localhost:9000/testbucket/_ДемоНоменклатура/20240215/ТестоваяКартинка.png

Ошибка: 403. А должен был вернуть статус 404 или 200.

В Postman всё нормально отвечает. Потому что происходит кодировка пути.

leemuar commented 8 months ago

А попробуйте руками закодировать путь, ошибка будет сохраняться?

zerobig commented 8 months ago

Попробовал (см. моё первое сообщение). После кодирования пути "руками" ошибка ушла.

Вот такое тело возвращается от MinIO на тот же запрос, но с методом GET:

<?xml version="1.0" encoding="UTF-8"?>
<Error>
    <Code>SignatureDoesNotMatch</Code>
    <Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message>
    <Key>_ДемоНоменклатура/20240215/ТестоваяКартинка.png</Key>
    <BucketName>testbucket</BucketName>
    <Resource>/testbucket/_ДемоНоменклатура/20240215/ТестоваяКартинка.png</Resource>
    <RequestId>17B61AC2226C5684</RequestId>
    <HostId>dd9025bab4ad464b049177c95eb6ebf374d3b3fd1af9251148b658df7ac2e3e8</HostId>
</Error>

Причем, судя по https://cloud.yandex.ru/ru/docs/storage/s3/api-ref/response-codes (см. 403 SignatureDoesNotMatch) такое поведение будет для всех серверов S3.

И можно сделать вывод, что скорее всего это особенность формирования ключей серверами S3. Они формируют ключи из URL. А не закодированный URL в качестве ключа им не годится. Так что моё предложение внести кодирование в библиотеку некорректное.

Можно закрывать issue. Всем спасибо!

zerobig commented 8 months ago

Дополнение... В ответе на запрос HEAD тела нет. Потому и не смог сразу разобраться к чему относится эта 403-я ошибка. Но если внимательно посмотреть заголовки, то там можно увидеть:

X-Minio-Error-Desc: "The request signature we calculated does not match the signature you provided. Check your key and signing method."

Отсюда мораль: читайте ответ полностью!

leemuar commented 8 months ago

Ну вообще я бы сделал в библиотке кодирование автоматическое, точно пригодится для S3 и прочих вещей