fix: Корректно определяется локаль при конвертации через /api/convert (#236) (#238)

This commit is contained in:
Dmitry Ivanov
2025-10-05 13:20:27 +03:00
committed by GitHub
parent 4b6450eefa
commit 76c874a17f
10 changed files with 243 additions and 34 deletions
+1 -1
View File
@@ -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
+1
View File
@@ -24,4 +24,5 @@
.РазработкаЗависитОт("1testrunner")
.РазработкаЗависитОт("asserts")
.РазработкаЗависитОт("coverage")
.РазработкаЗависитОт("1connector")
.ИсполняемыйФайл("src/main.os", "curlone")
@@ -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(
ПередаваемыйФайл.ПолноеИмяФайла,
@@ -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);
КонецЕсли;
Если ДанныеЗапроса = Неопределено Тогда
@@ -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.Схема);
ИсходящиеОшибки.Добавить(ОбщийНаборИнструментов.НоваяКритичнаяОшибка(ТекстОшибки));
@@ -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", Текст, Критичная);
КонецФункции
@@ -1,7 +1,7 @@
// BSLLS:LatinAndCyrillicSymbolInWord-off
Перем _ОписаниеЗапроса; // ОписаниеЗапроса
Перем _СтруктураURL; // ПарсерURL
Перем _СтруктураURL; // РазборURL
Перем _ТекстовыеДанные; // Массив из ПередаваемыйТекст
Перем _ПрочитанныеФайлы; // Массив из Структура:
// - ПередаваемыйФайл - см. ПередаваемыйФайл
@@ -1,7 +1,7 @@
// BSLLS:LatinAndCyrillicSymbolInWord-off
Перем _ОписаниеЗапроса; // ОписаниеЗапроса
Перем _СтруктураURL; // ПарсерURL
Перем _СтруктураURL; // РазборURL
Перем _ТекстовыеДанные; // Массив из ПередаваемыйТекст
Перем _ПрочитанныеФайлы; // Массив из Структура:
// - ПередаваемыйФайл - см. ПередаваемыйФайл
@@ -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";
КонецФункции