Giter Club home page Giter Club logo

connector's Issues

Отправка запроса портит переданные настройки, что мешает в некоторых случаях

При выполнении кода:

Сервер = "https://jsonplaceholder.typicode.com/";

Настройки = Новый Структура; 
Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Type","application/json");
Настройки.Вставить("Заголовки", Заголовки);
//ПараметрыЗапроса = Новый Структура("username, password", "anonymous", "hrgesf7HDR67Bd");
ПараметрыЗапроса = "{""username"":""anonymous"",""password"":""anonymous""}";

НастройкиКопия = ЗначениеИзСтрокиВнутр(ЗначениеВСтрокуВнутр(Настройки));
Результат = КоннекторHTTP.Post(Сервер + "posts", ПараметрыЗапроса, НастройкиКопия);

Запись = Новый ЗаписьJSON();
Запись.УстановитьСтроку();
ЗаписатьJSON(Запись, Настройки);
Дамп1 = Запись.Закрыть();
Запись.УстановитьСтроку();
ЗаписатьJSON(Запись, НастройкиКопия);
Дамп2 = Запись.Закрыть();

Видно, что настройки модифицируются. Это ведет к тому, что при последовательном использовании (например post и postjson) одной структуры с настройками возможны проблемы. Собственно, я их и получил, иначе сюда бы не писал.

Некорректное формирование подписи AWS4 в старых версиях платформы\режима совместимости при пустом теле запроса

Используем библиотеку на платформе 8.3.11.2867, режим совместимости "Версия 8.2.13". Обнаружили, что некорректно формируется подпись AWS в случае когда у запроса нет тела, например ListObjects

Причина - разное поведение функций ПолучитьТелоКак*() объекта HTTPЗапрос

ХешированиеДанных(ХешФункция.SHA256, ПодготовленныйЗапрос.HTTPЗапрос.ПолучитьТелоКакПоток());

В старших версиях платформы в случае, если тело запроса не было установлено, возвращает пустые ДвоичныеДанные, старые же версии платформы - Неопределено. Из-за разных типов рассчитывается разный sha-256 хеш тела запроса

Некорректное декодирование параметров запроса

При передачи параметра, содержащего закодированный урл с несколькими "вложенными параметрами" происходит некорректное декодирование.
Например урл: https://www.DOMEN.ru?URL_INNER=http%3A%2F%2Fwww.kuku.ru%2F%3Fs%3D1%26b%3D2&OTHER=1
Будет расценен как: https://www.DOMEN.ru?URL_INNER=http%3A%2F%2Fwww.kuku.ru%2F%3Fs%3D1&OTHER=1&b=2

Как сохранить cookies при редиректе?

Описание проблемы:
Есть запрос к сайту с заголовком "contentType = 'application/json'", сайт делает редирект с кодом 308, но при попытке обратится по новому адресу появляется ошибка из-за того что заголовок contentType поменялся с 'application/json' на 'application/octet-stream'

Возможная причина и решение:

В функции ВызватьHTTPМетод если происходит редирект с кодом отличным от 307 и 308 то из куков удаляются заголовки "content-length,content-type,transfer-encoding" в противном случае по идее они должны остаться, но это не происходит, как решение добавил строку кода НовыйHTTPЗапрос.Заголовки = ПодготовленныйЗапрос.Заголовки;

До изменений:

Если Ответ.КодСостояния <> КодыСостоянияHTTP.ВременноеПеренаправление_307 
	И Ответ.КодСостояния <> КодыСостоянияHTTP.ПостоянноеПеренаправление_308 Тогда
	УдалитьЗаголовки(ПодготовленныйЗапрос.Заголовки, "content-length,content-type,transfer-encoding");
	НовыйHTTPЗапрос.Заголовки = ПодготовленныйЗапрос.Заголовки;
Иначе
	ИсходныйПоток = ПодготовленныйЗапрос.HTTPЗапрос.ПолучитьТелоКакПоток();
	ИсходныйПоток.КопироватьВ(НовыйHTTPЗапрос.ПолучитьТелоКакПоток());
КонецЕсли;

После:

Если Ответ.КодСостояния <> КодыСостоянияHTTP.ВременноеПеренаправление_307 
	И Ответ.КодСостояния <> КодыСостоянияHTTP.ПостоянноеПеренаправление_308 Тогда
	УдалитьЗаголовки(ПодготовленныйЗапрос.Заголовки, "content-length,content-type,transfer-encoding");
	НовыйHTTPЗапрос.Заголовки = ПодготовленныйЗапрос.Заголовки;
Иначе
	ИсходныйПоток = ПодготовленныйЗапрос.HTTPЗапрос.ПолучитьТелоКакПоток();
	ИсходныйПоток.КопироватьВ(НовыйHTTPЗапрос.ПолучитьТелоКакПоток());
	НовыйHTTPЗапрос.Заголовки = ПодготовленныйЗапрос.Заголовки;
КонецЕсли;

Ошибка кодирования параметров запроса GET

Владимир, прежде всего преогромнейшее спасибо за чудесную библиотеку!

Воспроизведение ошибки:

  1. Ставим точку останова в методе ВызватьHTTPМетод после строки:
    ПодготовленныйЗапрос = ПодготовитьЗапрос(Сессия, Запрос);
  2. Выполним код:
    КоннекторHTTP.GetJson("http://localhost/query", Новый Структура("date", Формат(Дата('20191103'), "ДФ=yyyy-MM-ddTHH:mm:ss.000000")))

В результате в ПодготовленныйЗапрос.HTTPЗапрос.АдресРесурса получим:
/query?date=2019-11-03T00:00:00.000000
Хотя ожидается:
/query?date=2019-11-03T00%3A00%3A00.000000

Где уши: метод КодироватьПараметрыЗапроса, строка:
ЗначениеПараметра = КодироватьСтроку(Значение, СпособКодированияСтроки.URLВКодировкеURL);

Исправление:
-ЗначениеПараметра = КодироватьСтроку(Значение, СпособКодированияСтроки.URLВКодировкеURL);
+ЗначениеПараметра = КодироватьСтроку(Значение, СпособКодированияСтроки.КодировкаURL);

Добавить метод КакXML

Спасибо за такую полезную библиотеку.

Предлагаю добавить новый метод КакXML, который по ответу возвращает XML с помощью ФабрикаXDTO

Показывать исходную проблему при ошибке разбора JSON в методе КакJson (GetJson, PostJson, PutJson, DeleteJson)

Здравствуйте! Шикарная библиотека, я даже теперь не боюсь писать код для вызова разных API, поскольку стало супер просто ))

Вот мой мелкий кейс.

  1. Пока сайт (точнее его API) доступно, метод GetJson работает ок, поскольку API отдает Json.
  2. Но если доступ к сайту, например, заблокировать в .htaccess, то он начинает по любому запросу отдавать html, например:
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access /wp-json/wp/v2/settings
on this server.</p>
</body></html>

=> библиотека крашится в функции JsonВОбъект на строчке Объект = ПрочитатьJSON(, поскольку тело ответа - не json.

Я понимаю, что это не проблема библиотеки - ведь сайт вдруг вместо json начинает отдавать html :) Но м.б. обернуть Объект = ПрочитатьJSON в Попытку/Исключение и вернуть, не знаю, какую-нибудь ошибку?

Получение тела как строки в новых версиях.

В старых версиях (1.2.3) в структуре ответа был ключ "Ответ", содержащий встроенный объект 1С типа HTTPОтвет. Соответственно, я мог получить строковое тело ответа с как СтруктураОтвета.Ответ.ПолучитьТелоКакСтроку(); В актуальной версии это не работает так как ключа "Ответ" нет.

Прошу уточнить - это плановое изменение или регрессия. Если плановое, то как предполагается работать с текстовыми ответами?

Некорректно формируется подпись AWS4, если порт отличается от стандартного

При получении заголовков для подписи порт, отличный от стандартных 80 и 443, не добавляется к заголовку host, в результате чего получается некорректная подпись

Список.Добавить("host", Сервер);

Проблему можно было бы обойти, добавив собственный заголовок host, но проверка на наличие такого заголовка не срабатывает, если этот заголовок не последний
ЗаголовокHostЕстьВЗапросе = Заголовок = "host";

Передача параметров-массивов с [] в именах

Возможно, опционально. В общем,

ПараметрыЗапроса = Новый Структура;
ПараметрыЗапроса.Вставить("param", СтрРазделить("1,2", ","));

Ответ = КоннекторHTTP.GetJson("https://httpbin.org/anything/params", ПараметрыЗапроса);	

должна быть возможность отправить не только https://httpbin.org/anything/params?param=1&param=2, но и https://httpbin.org/anything/params?param[]=1&param[]=2 (важно для php, например)

Не работает клиентский сертификат SSL

Ошибка проверки типа в функции
Сравнивается значение с типом, а не тип значения с типом

Функция ОбъектЗащищенногоСоединения(ДополнительныеПараметры)
	
	Если ДополнительныеПараметры.ПроверятьSSL = Ложь Тогда
		СертификатыУЦ = Неопределено;
	ИначеЕсли ТипЗнч(ДополнительныеПараметры.ПроверятьSSL) = Тип("СертификатыУдостоверяющихЦентровФайл") Тогда
		СертификатыУЦ = ДополнительныеПараметры.ПроверятьSSL;
	Иначе
		СертификатыУЦ = Новый СертификатыУдостоверяющихЦентровОС;
	КонецЕсли;
	КлиентскийСертификат = Неопределено;
	Если ДополнительныеПараметры.КлиентскийСертификатSSL = Тип("СертификатКлиентаФайл") 
		ИЛИ ДополнительныеПараметры.КлиентскийСертификатSSL = Тип("СертификатКлиентаWindows") Тогда
		КлиентскийСертификат = ДополнительныеПараметры.КлиентскийСертификатSSL;
	КонецЕсли;
	
	Возврат Новый ЗащищенноеСоединениеOpenSSL(КлиентскийСертификат, СертификатыУЦ);
	
КонецФункции

должно быть:

Если ТипЗнч(ДополнительныеПараметры.КлиентскийСертификатSSL) = Тип("СертификатКлиентаФайл") 
	ИЛИ ТипЗнч(ДополнительныеПараметры.КлиентскийСертификатSSL) = Тип("СертификатКлиентаWindows") Тогда
	КлиентскийСертификат = ДополнительныеПараметры.КлиентскийСертификатSSL;
КонецЕсли;

Упорядочение параметров в URL

Коннектор принимает в качестве параметров в URL структуру или соответствие, которые не гарантируют порядок следования элементов. Возникают проблемы при взаимодействии с API, для которых порядок параметров в URL имеет значение.

Сложные параметры.

Вопрос для рассмотрения.
Я воспользовался данной библиотекой для получения данных их JIRA.
С простыми праметрическими запросами проблем не возникло, но когда пришлось писать запросы с ипользованием jql, то возникли проблемы.
Дело в том, что могут использоваться запросы вида:
\search?jql=project=1200
\search?jql=worklogDate >= 2017-04-01 AND worklogDate <= 2017-05-01
Возникают две проблемы: Форматирование текста запроса и множественные знаки "=".

У Вас в функции РазобратьURL парсятся праметры по "=". В таком случае это приводит к ошибкам. Передача параметров через структуру помогает избежать проблемы, но не полностью, т.к. в процедуре ПодготовитьТелоЗапроса, при получении HTTPЗапрос.АдресРесурса, вызывается РазобратьURL еще раз для уже собранной строки. И она опять ломается.

Я для себя внес изменения:
АдресРесурса подготавливается сразу в функции ПодготовитьЗапрос через функцию ПодготовитьURL (точнее вместо нее).
Пришлось внести исключения в КодироватьПараметрыЗапроса для символов ">", " <" и других. Т.к. JIRA их использует в явном виде.

Некорректно формируется AWS4 аутентификация на старых платформах

Портировали Коннектор на более старый режим совместимости - 8.3.11.2867, режим совместимости Версия 8.2.13.

Обнаружили, что некорректно формируется подпись AWS4 в случае когда запрос не содержит параметров (вида ?name=1&action=put)

Формируется неверный канонический запрос, канонические параметры запроса устанавливаются равными "=". Из за этого рассчитывается неверная подпись.

Пример правильного канонического запроса:

GET
/

host:chefstorage.s3.us-east-1.amazonaws.com
x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
x-amz-date:20200214T181103Z

host;x-amz-content-sha256;x-amz-date
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Пример неправильного канонического запроса, формируемого Коннектором на старой платформе:

GET
/
=
host:chefstorage.s3.us-east-1.amazonaws.com
x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
x-amz-date:20200214T181103Z

host;x-amz-content-sha256;x-amz-date
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Проблема в функции РазобратьURL(), РазобратьURL("http://localhost/") на старых версиях платформы вернет структуру, ключ "Параметры" которой будет содержать массив с одной пустой строкой

В новых версиях платформы РазобратьURL("http://localhost/") в "Параметры" возвращает пустой массив

В ЗаполнитьПараметрыЗапроса() когда Запрос равен пустой строке, СтрРазделить(Запрос, "&", Ложь) на старых версиях платформы возвращает массив, содержащий одну пустую строку. Из-за такого поведения канонические параметры формируются неверно. В новых версиях платформы СтрРазделить("", "&", Ложь) возвращает пустой массив, там библиотека работает корректно

Для Каждого СтрокаКлючРавноПараметр Из СтрРазделить(Запрос, "&", Ложь) Цикл

Сборка проекта в формате cfe для использования впакетном менеджере А1И

Существует проблема
Остутствует возможность загружать в базу расширение с модулем Коннектор, в дальнейшем оперативно проверять обновляения и при необходимости загружать свежую версию.

Хотелось бы иметь следующую функциональность
Собрать cfe с префиксом, для минимизации пересечений по имени модуля при использовании в соседних расширениях.

Сформировать описание пакета с сылками на проверки, для того чтобы при работе из 1С можно было получить общую информацию о состоянии пакета.

Дополнительный контекст
Развернуто мысль описал в http://forum.infostart.ru/forum9/topic249947/message2537570/

Тесты требуют наличия действующего аккаунта ИТС

В данный момент чтобы запустить и проверить прохождение тестов, требуется действующий аккаунт ИТС. Это немного усложняет доработку библиотеки, у некоторых разработчиков (типа меня) аккаунта нет.

Возможно стоит сделать так, чтобы запуск и прохождение теста не зависели от наличия у тестирующего действующего аккаунта ИТС. httpbin вроде умеет работать с куками, его возможностей будет достаточно для того чтобы этот тест сделать?

image

Типизация параметра Cookies

В СоздатьСессию()
Сессия.Вставить("Cookies", Новый Соответствие);

Но в ПодготовитьЗапрос()
Cookies = ВыбратьЗначение(Неопределено, ДополнительныеПараметры, "Cookies", Новый Массив);
И в ДозаполнитьCookie(Cookies, URL)
Используется условие Если ТипЗнч(Cookies) = Тип("Массив") Тогда

Непонятно зачем использовать массив.

Библиотека не предназначена для клиентского контекста.

Текущая реализация библиотеки предназначена для серверного контекста. В некоторых случаях это неудобно, например:
-- при встраивании библиотеки во внешние обработки удобно было бы разместить ее в модуле формы
-- в случае клиент-серверного режима 1С Предприятия HTTP запрос будет делать сервер 1С Предприятия а не клиентская машина.

Я взял на себя смелость доработать библиотеку для работы в клиентском контексте. Прогресс есть, даже проходит часть тестов. Результатом работы будет две внешние обработки:

  • обработка КоннекторКлиент в которой будет одна форма в модуле которой будет размещаться библиотека
  • обработка Тесты

@vbondarevsky Владимир, требуется ли материнскому проекту эта доработка? Делать PR?

2020-11-18_20-30-14

Возможность переопределять дату AWS4 запроса

Не могу придумать реального случая, когда это может пригодиться, кроме отладки. В данный момент всегда берется текущая дата:

ТекущееВремя = ТекущаяУниверсальнаяДата();

Варианты:

  • анализировать заголовки запроса, если в них есть x-amz-date или date - использовать их значение
  • еще один параметр аутентификации^
Аутентификация = Новый Структура;
Аутентификация.Вставить("ДатаЗапроса", Дата(2020, 02, 01));
...

Авторизация по Api-Key

Привет, подскажи, есть ли возможность создать сессию пользователя имея ключ Api?

То есть авторизовав пользователя по ключу,
мы имеем Токен, который необходимо передавать в другие запросы....

GZip-кодирование по-умолчанию

Вопрос для обсуждения

При отправке любого запроса библиотека по-умолчанию шлет заголовок Accept-Encoding: gzip, т.е. всегда запрашивает у сервера сжатые данные. Имеет ли смысл делать такое действие по-умолчанию?

В текущей версии чтобы получить несжатые данные мне как пользователю библиотеки нужно предприниматься какие-то действия (какие?). Возможно, было бы удобно сделать так, чтобы по умолчанию этот заголовок не добавлялся. Возможно, сделать доп параметр, передача которого добавит заголовок при запросе:

Результат = КоннекторHTTP.PostJson("https://httpbin.org/post",, Новый Структура("СжиматьОтвет", Истина));

П.С. Как в текущей версии отключить запрос на сжатие?

Учитывать expires для cookies

Set-Cookie: login=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0, login=test; expires=Tue, 26-Nov-2019 02:35:14 GMT

Сохранить в хранилище cookies нужно значение test

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.