Skip to content

Commit 95203ca

Browse files
authored
feat: Поддержка кастомных эндпоинтов (#15)
1 parent 3d94b80 commit 95203ca

File tree

10 files changed

+276
-24
lines changed

10 files changed

+276
-24
lines changed

README.md

Lines changed: 45 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,9 @@
1414
* 2.3\. [Swagger UI](#swagger-ui)
1515
* 3\. [Совместимость](#compatibility)
1616
* 4\. [Программный интерфейс](#api)
17-
* 5\. [Ограничения](#limitations)
18-
* 6\. [Сравнение с httpbin.org](#comparison)
17+
* 5\. [Кастомные эндпоинты](#custom-endpoints)
18+
* 6\. [Ограничения](#limitations)
19+
* 7\. [Сравнение с httpbin.org](#comparison)
1920

2021
## Установка <a name="installation"></a>
2122

@@ -39,6 +40,7 @@ httpbin run
3940
| --- | --- | --- |
4041
| `-h`, `--host` | Имя хоста или IP-адрес сервиса | `127.0.0.1` |
4142
| `-p`, `--port` | TCP-порт сервиса | `3333` |
43+
| `--routes-handlers` | Путь к файлу или каталогу кастомных контроллеров | |
4244

4345
### Тестирование с [asserts](https://github.com/oscript-library/asserts) и [1connector](https://github.com/vbondarevsky/1connector) <a name="testing"></a>
4446

@@ -132,6 +134,47 @@ IP-адрес или имя хоста.</br>
132134
| `URL(<АдресРесурса>)` | Формирует полный URL-адрес сервиса с опциональным путем к ресурсу. |
133135
| `ТаймаутЗапуска()` | Возвращает текущее значение таймаута запуска сервиса. |
134136
| `УстановитьТаймаутЗапуска(<Таймаут>)` | Устанавливает максимальное время ожидания запуска сервиса. Применяется при синхронном запуске. |
137+
| `РасположениеКонтроллеров()` | Возвращает текущий путь к папке или файлу с кастомными контроллерами. |
138+
| `УстановитьРасположениеКонтроллеров(<Расположение>)` | Устанавливает путь к папке или файлу с кастомными контроллерами, определяющими маршруты сервиса. |
139+
140+
## Кастомные эндпоинты <a name="custom-endpoints"></a>
141+
142+
Сервис поддерживает подключение пользовательских контроллеров для расширения функциональности и добавления собственных эндпоинтов.
143+
144+
### Создание контроллера
145+
146+
Контроллер представляет собой класс OneScript с аннотацией `&Контроллер`, определяющей базовый путь маршрута. Более подробно можно прочитать в документации [WINOW](https://github.com/autumn-library/winow).
147+
148+
**Пример контроллера**
149+
150+
``` bsl
151+
&Контроллер("/order")
152+
Процедура ПриСозданииОбъекта()
153+
КонецПроцедуры
154+
155+
&ТочкаМаршрута("add")
156+
Процедура Главная(Ответ) Экспорт
157+
// Бизнес-логика
158+
КонецПроцедуры
159+
```
160+
161+
### Подключение контроллеров
162+
163+
**Через программный интерфейс**
164+
165+
Для подключения кастомных контроллеров используйте метод `УстановитьРасположениеКонтроллеров()`, указав путь к папке или файлу с контроллерами:
166+
167+
``` bsl
168+
HttpBin = Новый HttpBin()
169+
.УстановитьРасположениеКонтроллеров("./path/to/routes")
170+
.Запустить();
171+
```
172+
173+
**Через CLI**
174+
175+
``` bash
176+
httpbin run --routes-handlers './path/to/routes'
177+
```
135178

136179
## Ограничения <a name="limitations"></a>
137180

src/app/ОсновнойКонтрол.os renamed to src/app/ОсновнойКонтроллер.os

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
#Использовать "../internal"
21
#Использовать 1connector
32

43
Перем _Помощник; // ПомощникПодготовкиОтветов

src/cmd/main.os

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
#Использовать autumn
22
#Использовать autumn-cli
3-
#Использовать winow
43
#Использовать "."
4+
#Использовать "../internal"
5+
6+
ПодключательКастомныхКонтроллеров = Новый ПодключательКастомныхКонтроллеров();
7+
ПодключательКастомныхКонтроллеров.НайтиИПодключить();
58

69
Поделка = Новый Поделка;
710
Поделка.ЗапуститьПриложение();

src/cmd/Классы/КомандаЗапустить.os

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
// BSLLS:UsingHardcodeNetworkAddress-off
22

3+
#Область Опции
4+
35
&Опция(
46
Имя = "h host",
57
Описание = "Имя хоста или IP-адрес сервиса"
@@ -24,34 +26,40 @@
2426
&ПоУмолчанию(0)
2527
Перем _ИдентификаторРодительскогоПроцесса; // Число
2628

27-
&Пластилин("Настройки")
28-
Перем _НастройкиВебСервера; // НастройкиВебСервера - см. winow
29+
&Опция(
30+
Имя = "routes-handlers",
31+
Описание = "Путь к файлу или каталогу кастомных контроллеров"
32+
)
33+
&ТМассивСтрок
34+
Перем _КастомныеКонтроллеры; // BSLLS:UnusedLocalVariable-off
35+
36+
#КонецОбласти
2937

30-
&Пластилин("ЗапускательВебПриложения")
31-
Перем _ЗапускательВебПриложения; // ЗапускательВебПриложения - см. winow
38+
#Область ОписаниеПеременных
3239

3340
&Пластилин("КонтроллерРодительскогоПроцесса")
3441
Перем _КонтроллерРодительскогоПроцесса; // КонтроллерРодительскогоПроцесса
3542

43+
&Пластилин("ЗапускательСервиса")
44+
Перем _ЗапускательСервиса; // ЗапускательСервиса
45+
46+
#КонецОбласти
47+
48+
#Область СлужебныеПроцедурыИФункции
49+
3650
&КомандаПриложения(Имя = "run", Описание = "Запуск сервиса")
3751
Процедура ПриСозданииОбъекта()
3852
КонецПроцедуры
3953

4054
&ВыполнениеКоманды
4155
Процедура Запустить() Экспорт
4256

43-
_НастройкиВебСервера.РазмерБуфера = 0;
44-
_НастройкиВебСервера.ИмяХоста = _Хост;
45-
_НастройкиВебСервера.Порт = _Порт;
46-
47-
Если ПолучитьПеременнуюСреды("HTTPBIN_IS_TEST_MODE") = "true" Тогда
48-
_НастройкиВебСервера.ЗадержкаПередЧтениемСокета = 400;
49-
КонецЕсли;
50-
5157
Если _ИдентификаторРодительскогоПроцесса > 0 Тогда
5258
_КонтроллерРодительскогоПроцесса.НачатьНаблюдение(_ИдентификаторРодительскогоПроцесса);
5359
КонецЕсли;
5460

55-
_ЗапускательВебПриложения.Запустить();
61+
_ЗапускательСервиса.Запустить(_Хост, _Порт);
62+
63+
КонецПроцедуры
5664

57-
КонецПроцедуры
65+
#КонецОбласти

src/core/Классы/HttpBin.os

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,13 @@
55
#Использовать fs
66
#Использовать logos
77

8-
Перем _ТаймаутЗапуска; // Число - Таймаут запуска сервиса в секундах
9-
Перем _ТаймаутПроверки; // Число - Таймаут HTTP-проверки доступности в секундах
10-
Перем _ИмяХоста; // Строка - IP-адрес или доменное имя хоста
11-
Перем _Порт; // Число - Номер TCP-порта сервиса
12-
Перем _Процесс; // Процесс, Неопределено - Объект запущенного процесса
13-
Перем _Лог; // Лог - Логгер для отладочной информации
8+
Перем _ТаймаутЗапуска; // Число - Таймаут запуска сервиса в секундах
9+
Перем _ТаймаутПроверки; // Число - Таймаут HTTP-проверки доступности в секундах
10+
Перем _ИмяХоста; // Строка - IP-адрес или доменное имя хоста
11+
Перем _Порт; // Число - Номер TCP-порта сервиса
12+
Перем _РасположениеКонтроллеров; // Строка, Неопределено - Путь к папке или файлу с кастомными контроллерами
13+
Перем _Процесс; // Процесс, Неопределено - Объект запущенного процесса
14+
Перем _Лог; // Лог - Логгер для отладочной информации
1415

1516
#Область ПрограммныйИнтерфейс
1617

@@ -197,6 +198,28 @@
197198
Возврат _ТаймаутЗапуска;
198199
КонецФункции
199200

201+
// Устанавливает путь к папке или файлу с кастомными контроллерами, определяющими маршруты сервиса.
202+
//
203+
// Параметры:
204+
// Расположение - Строка - Путь к папке или файлу с контроллерами (например, "./controllers" или "./МойКонтроллер.os")
205+
//
206+
// Возвращаемое значение:
207+
// ЭтотОбъект - Для возможности цепочки вызовов
208+
//
209+
Функция УстановитьРасположениеКонтроллеров(Расположение) Экспорт
210+
_РасположениеКонтроллеров = Расположение;
211+
Возврат ЭтотОбъект;
212+
КонецФункции
213+
214+
// Возвращает текущий путь к папке или файлу с кастомными контроллерами.
215+
//
216+
// Возвращаемое значение:
217+
// Строка, Неопределено
218+
//
219+
Функция РасположениеКонтроллеров() Экспорт
220+
Возврат _РасположениеКонтроллеров;
221+
КонецФункции
222+
200223
#КонецОбласти
201224

202225
#Область СлужебныеПроцедурыИФункции
@@ -242,6 +265,12 @@
242265
СтрокаКоманды.Добавить(Формат(_Порт, "ЧГ="));
243266
СтрокаКоманды.Добавить("--parent-pid");
244267
СтрокаКоманды.Добавить(Формат(ТекущийПроцесс().Идентификатор, "ЧГ="));
268+
269+
Если ЗначениеЗаполнено(_РасположениеКонтроллеров) Тогда
270+
СтрокаКоманды.Добавить("--routes-handlers");
271+
СтрокаКоманды.Добавить(ОбернутьВКавычки(_РасположениеКонтроллеров));
272+
КонецЕсли;
273+
245274
СтрокаКоманды = СтрСоединить(СтрокаКоманды, " ");
246275

247276
_Лог.Отладка("Запуск процесса: %1", СтрокаКоманды);
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
2+
#Использовать winow
3+
4+
Перем _Хост; // Строка
5+
Перем _Порт; // Число
6+
7+
&Пластилин("Настройки")
8+
Перем _НастройкиВебСервера; // Настройки - см. winow
9+
10+
&Пластилин("ЗапускательВебПриложения")
11+
Перем _ЗапускательВебПриложения; // ЗапускательВебПриложения - см. winow
12+
13+
&Желудь
14+
Процедура ПриСозданииОбъекта()
15+
КонецПроцедуры
16+
17+
// Запускает сервис через winow
18+
//
19+
// Параметры:
20+
// Хост - Строка - IP-адрес или имя хоста
21+
// Порт - Число - Номер TCP-порта
22+
Процедура Запустить(Хост, Порт) Экспорт
23+
24+
_Хост = Хост;
25+
_Порт = Порт;
26+
27+
НастроитьВебСервер();
28+
29+
_ЗапускательВебПриложения.Запустить();
30+
31+
КонецПроцедуры
32+
33+
Процедура НастроитьВебСервер()
34+
35+
_НастройкиВебСервера.РазмерБуфера = 0;
36+
_НастройкиВебСервера.ИмяХоста = _Хост;
37+
_НастройкиВебСервера.Порт = _Порт;
38+
39+
Если ПолучитьПеременнуюСреды("HTTPBIN_IS_TEST_MODE") = "true" Тогда
40+
_НастройкиВебСервера.ЗадержкаПередЧтениемСокета = 400;
41+
КонецЕсли;
42+
43+
КонецПроцедуры
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
#Использовать fs
2+
3+
#Область ПрограммныйИнтерфейс
4+
5+
// Находит и подключает кастомные контроллеры из путей, указанных в аргументах командной строки.
6+
//
7+
Процедура НайтиИПодключить() Экспорт
8+
9+
МассивФайлов = НайтиФайлыИзПереданныхАргументов();
10+
11+
Для Каждого ПолноеИмя Из МассивФайлов Цикл
12+
13+
Если ФС.КаталогСуществует(ПолноеИмя) Тогда
14+
ПодключитьИзКаталога(ПолноеИмя);
15+
ИначеЕсли ФС.ФайлСуществует(ПолноеИмя) Тогда
16+
Подключить(ПолноеИмя);
17+
Иначе
18+
ВызватьИсключение СтрШаблон("Не удалось подключить контроллер '%1': файл не существует", ПолноеИмя);
19+
КонецЕсли;
20+
21+
КонецЦикла;
22+
23+
КонецПроцедуры
24+
25+
// Подключает контроллер из указанного файла.
26+
//
27+
// Параметры:
28+
// ПолноеИмя - Строка - Полный путь к файлу контроллера (.os)
29+
//
30+
Процедура Подключить(ПолноеИмя) Экспорт
31+
32+
Имя = Новый Файл(ПолноеИмя).ИмяБезРасширения;
33+
34+
Попытка
35+
ПодключитьСценарий(ПолноеИмя, Имя);
36+
Исключение
37+
ВызватьИсключение СтрШаблон(
38+
"Не удалось подключить контроллер '%1': %2",
39+
ПолноеИмя,
40+
КраткоеПредставлениеОшибки(ИнформацияОбОшибке())
41+
);
42+
КонецПопытки;
43+
44+
КонецПроцедуры
45+
46+
#КонецОбласти
47+
48+
#Область СлужебныеПроцедурыИФункции
49+
50+
Процедура ПодключитьИзКаталога(Каталог)
51+
52+
Файлы = НайтиФайлы(Каталог, "*.os");
53+
54+
Для Каждого Файл Из Файлы Цикл
55+
Подключить(Файл.ПолноеИмя);
56+
КонецЦикла;
57+
58+
КонецПроцедуры
59+
60+
Функция НайтиФайлыИзПереданныхАргументов()
61+
62+
Файлы = Новый Массив();
63+
64+
НайденКлюч = Ложь;
65+
Для Каждого Значение Из АргументыКоманднойСтроки Цикл
66+
67+
Если НайденКлюч Тогда
68+
Файлы.Добавить(Значение);
69+
НайденКлюч = Ложь;
70+
Продолжить;
71+
КонецЕсли;
72+
73+
Если Значение = "--routes-handlers" Тогда
74+
НайденКлюч = Истина;
75+
КонецЕсли;
76+
77+
КонецЦикла;
78+
79+
Возврат Файлы;
80+
81+
КонецФункции
82+
83+
#КонецОбласти

0 commit comments

Comments
 (0)