diff --git a/NOTICES b/NOTICES index 15c8418..0664aa5 100644 --- a/NOTICES +++ b/NOTICES @@ -15,7 +15,7 @@ Copyright 2024 Aleksey Khorev (https://github.com/khorevaa) limitations under the License. -License for src/Классы/internal/Классы/ПарсерURL.os (https://github.com/vbondarevsky/1connector) +License for src/Классы/internal/Классы/РазборURL.os (https://github.com/vbondarevsky/1connector) -------------------------------------- Copyright 2019-2020 Vladimir Bondarevskiy diff --git a/packagedef b/packagedef index f2ae7d5..1cd9eba 100644 --- a/packagedef +++ b/packagedef @@ -24,4 +24,5 @@ .РазработкаЗависитОт("1testrunner") .РазработкаЗависитОт("asserts") .РазработкаЗависитОт("coverage") + .РазработкаЗависитОт("1connector") .ИсполняемыйФайл("src/main.os", "curlone") diff --git a/src/core/Классы/ГенераторПрограммногоКода1С.os b/src/core/Классы/ГенераторПрограммногоКода1С.os index 070c787..e6a8aca 100644 --- a/src/core/Классы/ГенераторПрограммногоКода1С.os +++ b/src/core/Классы/ГенераторПрограммногоКода1С.os @@ -354,7 +354,7 @@ Для Каждого ОписаниеРесурса Из ОписаниеЗапроса.АдресаРесурсов Цикл - СтруктураURL = Новый ПарсерURL(ОписаниеРесурса.URL); + СтруктураURL = Новый РазборURL(ОписаниеРесурса.URL); ИспользуетсяЗащищенноеСоединение = ИспользуетсяЗащищенноеСоединение(СтруктураURL); Если ИспользуетсяЗащищенноеСоединение Тогда @@ -451,7 +451,7 @@ Для Каждого ОписаниеРесурса Из ОписаниеЗапроса.АдресаРесурсов Цикл НомерЗапроса = НомерЗапроса + 1; - СтруктураURL = Новый ПарсерURL(ОписаниеРесурса.URL); + СтруктураURL = Новый РазборURL(ОписаниеРесурса.URL); ВызванМетодПоТекущемуURL = Ложь; Конструктор.ДобавитьПустуюСтроку(); @@ -523,7 +523,7 @@ ); КонецЕсли; - СтруктураURL = Новый ПарсерURL(ОписаниеРесурса.URL); + СтруктураURL = Новый РазборURL(ОписаниеРесурса.URL); Если ПередаваемыйФайл.ДобавлятьИмяФайлаКURL Тогда СтруктураURL.Путь = ОбщийНаборИнструментов.ДополнитьИменемФайлаПутьURL( ПередаваемыйФайл.ПолноеИмяФайла, diff --git a/src/core/Классы/ГенераторПрограммногоКодаКоннекторHTTP.os b/src/core/Классы/ГенераторПрограммногоКодаКоннекторHTTP.os index 8b88fcc..117c82f 100644 --- a/src/core/Классы/ГенераторПрограммногоКодаКоннекторHTTP.os +++ b/src/core/Классы/ГенераторПрограммногоКодаКоннекторHTTP.os @@ -572,7 +572,7 @@ ); КонецЕсли; - СтруктураURL = Новый ПарсерURL(ОписаниеРесурса.URL); + СтруктураURL = Новый РазборURL(ОписаниеРесурса.URL); Если ПередаваемыйФайл.ДобавлятьИмяФайлаКURL Тогда СтруктураURL.Путь = ОбщийНаборИнструментов.ДополнитьИменемФайлаПутьURL(ПередаваемыйФайл.ПолноеИмяФайла, СтруктураURL.Путь); КонецЕсли; @@ -740,7 +740,7 @@ Для Каждого ОписаниеРесурса Из ОписаниеЗапроса.АдресаРесурсов Цикл НомерЗапроса = НомерЗапроса + 1; - СтруктураURL = Новый ПарсерURL(ОписаниеРесурса.URL); + СтруктураURL = Новый РазборURL(ОписаниеРесурса.URL); Состояние.ВызванМетодПоТекущемуURL = Ложь; Если Не ОбщийНаборИнструментов.ЭтоHTTP(СтруктураURL.Схема) Тогда @@ -776,7 +776,7 @@ Процедура ДобавитьВызовМетода(ОписаниеРесурса, Знач СтруктураURL = Неопределено, Знач ДанныеЗапроса = Неопределено) Если СтруктураURL = Неопределено Тогда - СтруктураURL = Новый ПарсерURL(ОписаниеРесурса.URL); + СтруктураURL = Новый РазборURL(ОписаниеРесурса.URL); КонецЕсли; Если ДанныеЗапроса = Неопределено Тогда diff --git a/src/core/Классы/КонвертерКомандыCURL.os b/src/core/Классы/КонвертерКомандыCURL.os index 093c229..83c9a80 100644 --- a/src/core/Классы/КонвертерКомандыCURL.os +++ b/src/core/Классы/КонвертерКомандыCURL.os @@ -224,7 +224,7 @@ КонецЕсли; - СтруктураURL = Новый ПарсерURL(ОписаниеРесурса.URL); + СтруктураURL = Новый РазборURL(ОписаниеРесурса.URL); Если ОбщийНаборИнструментов.ЭтоHTTP(СтруктураURL.Схема) Тогда Если ЕстьМетодPOST Тогда @@ -318,13 +318,13 @@ Продолжить; КонецЕсли; - ПарсерURL = Новый ПарсерURL(ОписаниеАдреса.URL); + РазборURL = Новый РазборURL(ОписаниеАдреса.URL); - ИндексСлеша = СтрНайти(ПарсерURL.Путь, "/", НаправлениеПоиска.СКонца); + ИндексСлеша = СтрНайти(РазборURL.Путь, "/", НаправлениеПоиска.СКонца); Если ИндексСлеша Тогда - ИмяВыходногоФайла = СокрЛП(Сред(ПарсерURL.Путь, ИндексСлеша + 1)); + ИмяВыходногоФайла = СокрЛП(Сред(РазборURL.Путь, ИндексСлеша + 1)); Иначе - ИмяВыходногоФайла = ПарсерURL.Путь; + ИмяВыходногоФайла = РазборURL.Путь; КонецЕсли; Если Не ЗначениеЗаполнено(ИмяВыходногоФайла) Тогда @@ -989,16 +989,16 @@ Возврат; КонецЕсли; - ПарсерURL = Новый ПарсерURL(АдресПрокси); + РазборURL = Новый РазборURL(АдресПрокси); - ОписаниеЗапроса.ПроксиСервер = ПарсерURL.Сервер; + ОписаниеЗапроса.ПроксиСервер = РазборURL.Сервер; - ОписаниеЗапроса.ПроксиПротокол = НРег(ПарсерURL.Схема); + ОписаниеЗапроса.ПроксиПротокол = НРег(РазборURL.Схема); Если Не ЗначениеЗаполнено(ОписаниеЗапроса.ПроксиПротокол) Тогда ОписаниеЗапроса.ПроксиПротокол = ПротоколыURL.HTTP; КонецЕсли; - ОписаниеЗапроса.ПроксиПорт = ПарсерURL.Порт; + ОписаниеЗапроса.ПроксиПорт = РазборURL.Порт; Если Не ЗначениеЗаполнено(ОписаниеЗапроса.ПроксиПорт) Тогда ОписаниеЗапроса.ПроксиПорт = 1080; КонецЕсли; @@ -1667,7 +1667,7 @@ КонецЕсли; Для Каждого ОписаниеРесурса Из ОписаниеЗапроса.АдресаРесурсов Цикл - СтруктураURL = Новый ПарсерURL(ОписаниеРесурса.URL); + СтруктураURL = Новый РазборURL(ОписаниеРесурса.URL); Если ПоддерживаемыеПротоколы.Найти(СтруктураURL.Схема) = Неопределено Тогда ТекстОшибки = СтрШаблон("Протокол ""%1"" не поддерживается", СтруктураURL.Схема); ИсходящиеОшибки.Добавить(ОбщийНаборИнструментов.НоваяКритичнаяОшибка(ТекстОшибки)); diff --git a/src/interface/Классы/ОсновнойКонтрол.os b/src/interface/Классы/ОсновнойКонтрол.os index 41887f5..5cdf94a 100644 --- a/src/interface/Классы/ОсновнойКонтрол.os +++ b/src/interface/Классы/ОсновнойКонтрол.os @@ -1,17 +1,18 @@ -#Использовать "../../core" #Использовать jason +#Использовать "../../core" -Перем КонвертерКомандыCURL; // см. КонвертерКомандыCURL +Перем КонвертерКомандыCURL; // КонвертерКомандыCURL +Перем СериализаторJson; // СериализаторJson &Контроллер("/") Процедура ПриСозданииОбъекта() - + КонвертерКомандыCURL = Новый КонвертерКомандыCURL(); + СериализаторJson = Новый СериализаторJson(); КонецПроцедуры &ТочкаМаршрута("") &Отображение("./src/interface/view/index.html") Процедура Главная(Ответ) Экспорт - КонецПроцедуры &ТочкаМаршрута("/api") @@ -22,7 +23,6 @@ &ТочкаМаршрута("/api/v1") &Отображение("./src/interface/view/api.html") Процедура APIv1() Экспорт - КонецПроцедуры &ТочкаМаршрута("/api/v1/convert") @@ -36,16 +36,14 @@ Локаль = ПараметрыЗапросаИменные.Получить("locale"); ДесериализоватьОтветИзJSON = НРег(ПараметрыЗапросаИменные.Получить("response-type")) = "json"; + Если Локаль = Неопределено Тогда + Локаль = ЛокальПоУмолчанию(); + КонецЕсли; + Если ТекстКоманды <> Неопределено Тогда - Если КонвертерКомандыCURL = Неопределено Тогда - КонвертерКомандыCURL = Новый КонвертерКомандыCURL(); - КонецЕсли; + КонвертерКомандыCURL.УстановитьЯзыкПеревода(Локаль); - Если ЗначениеЗаполнено(Локаль) Тогда - КонвертерКомандыCURL.УстановитьЯзыкПеревода(Локаль); - КонецЕсли; - Генератор = ПолучитьГенератор(Язык); Генератор.ДесериализоватьОтветИзJSON(ДесериализоватьОтветИзJSON); @@ -66,10 +64,8 @@ КонецЕсли; - Сериализатор = Новый СериализаторJson(); - Ответ.УстановитьТипКонтента("json"); - Ответ.ТелоТекст = Сериализатор.Сериализовать(ДанныеОтвета); + Ответ.ТелоТекст = СериализаторJson.Сериализовать(ДанныеОтвета); КонецПроцедуры @@ -89,6 +85,10 @@ Возврат Новый ГенераторПрограммногоКода1С(); КонецФункции +Функция ЛокальПоУмолчанию() + Возврат "ru"; +КонецФункции + Функция НоваяОшибка(Текст, Критичная = Ложь) Возврат Новый Структура("text, critical", Текст, Критичная); КонецФункции \ No newline at end of file diff --git a/src/internal/Классы/ГенераторКодаURL.os b/src/internal/Классы/ГенераторКодаURL.os index 81c11ee..660500d 100644 --- a/src/internal/Классы/ГенераторКодаURL.os +++ b/src/internal/Классы/ГенераторКодаURL.os @@ -1,7 +1,7 @@ // BSLLS:LatinAndCyrillicSymbolInWord-off Перем _ОписаниеЗапроса; // ОписаниеЗапроса -Перем _СтруктураURL; // ПарсерURL +Перем _СтруктураURL; // РазборURL Перем _ТекстовыеДанные; // Массив из ПередаваемыйТекст Перем _ПрочитанныеФайлы; // Массив из Структура: // - ПередаваемыйФайл - см. ПередаваемыйФайл diff --git a/src/internal/Классы/ГенераторКодаАдресРесурса.os b/src/internal/Классы/ГенераторКодаАдресРесурса.os index 36df77b..643848a 100644 --- a/src/internal/Классы/ГенераторКодаАдресРесурса.os +++ b/src/internal/Классы/ГенераторКодаАдресРесурса.os @@ -1,7 +1,7 @@ // BSLLS:LatinAndCyrillicSymbolInWord-off Перем _ОписаниеЗапроса; // ОписаниеЗапроса -Перем _СтруктураURL; // ПарсерURL +Перем _СтруктураURL; // РазборURL Перем _ТекстовыеДанные; // Массив из ПередаваемыйТекст Перем _ПрочитанныеФайлы; // Массив из Структура: // - ПередаваемыйФайл - см. ПередаваемыйФайл diff --git a/src/internal/Классы/ПарсерURL.os b/src/internal/Классы/РазборURL.os similarity index 100% rename from src/internal/Классы/ПарсерURL.os rename to src/internal/Классы/РазборURL.os diff --git a/tests/ОсновнойКонтрол_test.os b/tests/ОсновнойКонтрол_test.os new file mode 100644 index 0000000..2b5b7e2 --- /dev/null +++ b/tests/ОсновнойКонтрол_test.os @@ -0,0 +1,208 @@ +// BSLLS:DuplicateStringLiteral-off + +#Использовать 1connector +#Использовать jason + +Перем ПроцессВебСервера; // Процесс + +&Инициализация +Процедура Инициализация() Экспорт + + ПроцессВебСервера = СоздатьПроцесс("oscript src/main.os web", "."); + ПроцессВебСервера.Запустить(); + + НачатьОжиданиеЗапуска(); + +КонецПроцедуры + +&Завершение +Процедура Завершение() Экспорт + ПроцессВебСервера.Завершить(); +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ВыполнитьКонвертацию() Экспорт + + Сериализатор = Новый СериализаторJson(); + + ТестовыеСлучаи = НоваяТаблицаТестовыхСлучаев(); + + НовыйТестовыйСлучай( + ТестовыеСлучаи, + "curl http://example.com", + Неопределено, + Неопределено, + Неопределено, + "Соединение = Новый HTTPСоединение(""example.com"", 80); + |HTTPЗапрос = Новый HTTPЗапрос(""/""); + | + |HTTPОтвет = Соединение.ВызватьHTTPМетод(""GET"", HTTPЗапрос);" + ); + + НовыйТестовыйСлучай( + ТестовыеСлучаи, + "curl http://example.com", + "1c", + Неопределено, + Неопределено, + "Соединение = Новый HTTPСоединение(""example.com"", 80); + |HTTPЗапрос = Новый HTTPЗапрос(""/""); + | + |HTTPОтвет = Соединение.ВызватьHTTPМетод(""GET"", HTTPЗапрос);" + ); + + НовыйТестовыйСлучай( + ТестовыеСлучаи, + "curl http://example.com", + Неопределено, + "en", + Неопределено, + "Connection = New HTTPConnection(""example.com"", 80); + |HTTPRequest = New HTTPRequest(""/""); + | + |HTTPResponse = Connection.CallHTTPMethod(""GET"", HTTPRequest);" + ); + + НовыйТестовыйСлучай( + ТестовыеСлучаи, + "curl http://example.com", + "connector", + Неопределено, + Неопределено, + "Результат = КоннекторHTTP.Get(""http://example.com"");" + ); + + НовыйТестовыйСлучай( + ТестовыеСлучаи, + "curl http://example.com", + "connector", + "en", + Неопределено, + "Result = HTTPConnector.Get(""http://example.com"");" + ); + + НовыйТестовыйСлучай( + ТестовыеСлучаи, + "curl http://example.com", + "connector", + "ru", + Неопределено, + "Результат = КоннекторHTTP.Get(""http://example.com"");" + ); + + НовыйТестовыйСлучай( + ТестовыеСлучаи, + "curl http://example.com", + "connector", + Неопределено, + "json", + "Результат = КоннекторHTTP.GetJson(""http://example.com"");" + ); + + Для Каждого ТестовыйСлучай Из ТестовыеСлучаи Цикл + + ПараметрыЗапроса = Новый Соответствие(); + ПараметрыЗапроса.Вставить("cmd", ТестовыйСлучай.Команда); + + Если ТестовыйСлучай.Язык <> Неопределено Тогда + ПараметрыЗапроса.Вставить("lang", ТестовыйСлучай.Язык); + КонецЕсли; + + Если ТестовыйСлучай.Локаль <> Неопределено Тогда + ПараметрыЗапроса.Вставить("locale", ТестовыйСлучай.Локаль); + КонецЕсли; + + Если ТестовыйСлучай.ТипОтвета <> Неопределено Тогда + ПараметрыЗапроса.Вставить("response-type", ТестовыйСлучай.ТипОтвета); + КонецЕсли; + + Json = Сериализатор.Сериализовать(ПараметрыЗапроса); + + // Действие + Ответ = ВыполнитьЗапросКонвертации(ПараметрыЗапроса); + + // Проверка + Ожидаем.Что(Ответ["result"], Json).Равно(ТестовыйСлучай.Результат); + + КонецЦикла; + +КонецПроцедуры + +Функция НоваяТаблицаТестовыхСлучаев() + + Таблица = Новый ТаблицаЗначений(); + Таблица.Колонки.Добавить("Команда"); + Таблица.Колонки.Добавить("Язык"); + Таблица.Колонки.Добавить("Локаль"); + Таблица.Колонки.Добавить("ТипОтвета"); + Таблица.Колонки.Добавить("Результат"); + + Возврат Таблица; + +КонецФункции + +Процедура НовыйТестовыйСлучай(ТестовыеСлучаи, Команда, Язык, Локаль, ТипОтвета, Результат) + + Строка = ТестовыеСлучаи.Добавить(); + Строка.Команда = Команда; + Строка.Язык = Язык; + Строка.Локаль = Локаль; + Строка.ТипОтвета = ТипОтвета; + Строка.Результат = Результат; + +КонецПроцедуры + +Функция ВыполнитьЗапросКонвертации(ПараметрыЗапроса) + Возврат КоннекторHTTP.Get(СтрШаблон("%1/api/v1/convert", URL()), ПараметрыЗапроса).Json(); +КонецФункции + +Процедура НачатьОжиданиеЗапуска() + + ЗадержкаМеждуПопытками = 100; // Миллисекунд + ТаймаутОжидания = 5; // Секунд + ВремяНачала = ТекущаяУниверсальнаяДата(); + + Пока Истина Цикл + + КодСостояния = Неопределено; + ТекстИсключения = ""; + Попытка + Ответ = КоннекторHTTP.Head(URL(), Новый Структура("Таймаут", ТаймаутОжидания)); + КодСостояния = Ответ.КодСостояния; + Исключение + ТекстИсключения = СокрП(КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + ТекстИсключения = СтрПолучитьСтроку(ТекстИсключения, СтрЧислоСтрок(ТекстИсключения)); + КонецПопытки; + + Если КодСостояния = КодыСостоянияHTTP.ОК_200 Тогда + Прервать; + КонецЕсли; + + ПрошлоСекунд = ТекущаяУниверсальнаяДата() - ВремяНачала; + Если ПрошлоСекунд > ТаймаутОжидания Или ЗначениеЗаполнено(КодСостояния) Тогда + + ТекстОшибки = СтрШаблон( + "Не удалось запустить веб-сервер в течение %1 сек.", + ТаймаутОжидания); + + Если ЗначениеЗаполнено(КодСостояния) Тогда + ТекстОшибки = СтрШаблон("%1: + |%2", ТекстОшибки, КодыСостоянияHTTP.Представление(КодСостояния)); + Иначе + ТекстОшибки = СтрШаблон("%1: + |%2", ТекстОшибки, ТекстИсключения); + КонецЕсли; + + ВызватьИсключение ТекстОшибки; + + КонецЕсли; + + Приостановить(ЗадержкаМеждуПопытками); + + КонецЦикла; + +КонецПроцедуры + +Функция URL() + Возврат "http://127.0.0.1:3333"; +КонецФункции \ No newline at end of file