Skip to content

Commit b5cc4a1

Browse files
committed
feat: Добавление эндпоинтов /gzip, /deflate, /brotli, /zstd
1 parent 02e5434 commit b5cc4a1

File tree

7 files changed

+194
-5
lines changed

7 files changed

+194
-5
lines changed

README.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -131,9 +131,10 @@ _МойЖелудь.os:_
131131
| `/anything/:anything` |||
132132
| `/base64/:value` |||
133133
| `/encoding/utf8` |||
134-
| `/gzip` |||
135-
| `/deflate` |||
136-
| `/brotli` |||
134+
| `/gzip` |||
135+
| `/deflate` |||
136+
| `/brotli` |||
137+
| `/zstd` |||
137138
| `/status/:code` |||
138139
| `/response-headers?key=val` |||
139140
| `/redirect/:n` |||

packagedef

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
.ВключитьФайл("LICENSE")
1414
.ЗависитОт("winow", "0.8.9")
1515
.ЗависитОт("autumn-cli", "1.0.6")
16+
.ЗависитОт("compressor")
1617
.РазработкаЗависитОт("1connector")
1718
.РазработкаЗависитОт("1testrunner")
1819
.РазработкаЗависитОт("asserts")

src/app/HttpBin_ОсновнойКонтрол.os

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -593,6 +593,34 @@
593593

594594
КонецПроцедуры
595595

596+
&ТочкаМаршрута("gzip")
597+
&GET
598+
Процедура ТочкаGZip(Запрос, Ответ) Экспорт
599+
Данные = Помощник.ПолучитьДанныеЗапроса("gzipped, headers, method, origin", Запрос);
600+
Помощник.ЗаполнитьОтветJson(Ответ, Данные, "gzip");
601+
КонецПроцедуры
602+
603+
&ТочкаМаршрута("deflate")
604+
&GET
605+
Процедура ТочкаDeflate(Запрос, Ответ) Экспорт
606+
Данные = Помощник.ПолучитьДанныеЗапроса("deflated, headers, method, origin", Запрос);
607+
Помощник.ЗаполнитьОтветJson(Ответ, Данные, "deflate");
608+
КонецПроцедуры
609+
610+
&ТочкаМаршрута("brotli")
611+
&GET
612+
Процедура ТочкаBrotli(Запрос, Ответ) Экспорт
613+
Данные = Помощник.ПолучитьДанныеЗапроса("brotli, headers, method, origin", Запрос);
614+
Помощник.ЗаполнитьОтветJson(Ответ, Данные, "brotli");
615+
КонецПроцедуры
616+
617+
&ТочкаМаршрута("zstd")
618+
&GET
619+
Процедура ТочкаZStd(Запрос, Ответ) Экспорт
620+
Данные = Помощник.ПолучитьДанныеЗапроса("zstd, headers, method, origin", Запрос);
621+
Помощник.ЗаполнитьОтветJson(Ответ, Данные, "zstd");
622+
КонецПроцедуры
623+
596624
#КонецОбласти
597625

598626
#Область СлужебныеПроцедурыИФункции

src/app/view/static/openapi.json

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,22 @@
261261
]
262262
}
263263
},
264+
"/brotli": {
265+
"get": {
266+
"produces": [
267+
"application/json"
268+
],
269+
"responses": {
270+
"200": {
271+
"description": "Brotli-encoded data."
272+
}
273+
},
274+
"summary": "Returns Brotli-encoded data.",
275+
"tags": [
276+
"Response formats"
277+
]
278+
}
279+
},
264280
"/bytes/{n}": {
265281
"get": {
266282
"parameters": [
@@ -442,6 +458,22 @@
442458
]
443459
}
444460
},
461+
"/deflate": {
462+
"get": {
463+
"produces": [
464+
"application/json"
465+
],
466+
"responses": {
467+
"200": {
468+
"description": "Defalte-encoded data."
469+
}
470+
},
471+
"summary": "Returns Deflate-encoded data.",
472+
"tags": [
473+
"Response formats"
474+
]
475+
}
476+
},
445477
"/delay/{delay}": {
446478
"delete": {
447479
"parameters": [
@@ -641,6 +673,22 @@
641673
"HTTP Methods"
642674
]
643675
}
676+
},
677+
"/gzip": {
678+
"get": {
679+
"produces": [
680+
"application/json"
681+
],
682+
"responses": {
683+
"200": {
684+
"description": "GZip-encoded data."
685+
}
686+
},
687+
"summary": "Returns GZip-encoded data.",
688+
"tags": [
689+
"Response formats"
690+
]
691+
}
644692
},
645693
"/headers": {
646694
"get": {
@@ -1364,6 +1412,22 @@
13641412
"Response formats"
13651413
]
13661414
}
1415+
},
1416+
"/zstd": {
1417+
"get": {
1418+
"produces": [
1419+
"application/json"
1420+
],
1421+
"responses": {
1422+
"200": {
1423+
"description": "Zstd-encoded data."
1424+
}
1425+
},
1426+
"summary": "Returns Zstd-encoded data.",
1427+
"tags": [
1428+
"Response formats"
1429+
]
1430+
}
13671431
}
13681432
},
13691433
"protocol": "http",

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
#Использовать autumn
44
#Использовать winow
5+
#Использовать compressor
56

67
Перем Поделка; // Ссылка на объект Поделка (autumn)
78
Перем ВебСервер; // Ссылка на объект ПрикладнойВебСервер (winow)

src/internal/Классы/ПомощникПодготовкиОтветов.os

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,32 @@
1111

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

14-
Процедура ЗаполнитьОтветJson(Ответ, Данные) Экспорт
14+
Процедура ЗаполнитьОтветJson(Ответ, Данные, АлгоритмСжатия = Неопределено) Экспорт
1515

1616
Парсер = Новый ПарсерJSON();
17+
ТекстJson = Парсер.ЗаписатьJSON(Данные);
1718

1819
Ответ.УстановитьТипКонтента("json");
19-
Ответ.ТелоТекст = Парсер.ЗаписатьJSON(Данные);
20+
21+
Если АлгоритмСжатия = "gzip" Тогда
22+
Компрессор = Новый GZipКомпрессор();
23+
Ответ.Заголовки["content-encoding"] = "gzip";
24+
Ответ.ТелоДвоичныеДанные = Компрессор.Упаковать(ПолучитьДвоичныеДанныеИзСтроки(ТекстJson));
25+
ИначеЕсли АлгоритмСжатия = "deflate" Тогда
26+
Компрессор = Новый DeflateКомпрессор();
27+
Ответ.Заголовки["content-encoding"] = "deflate";
28+
Ответ.ТелоДвоичныеДанные = Компрессор.Упаковать(ПолучитьДвоичныеДанныеИзСтроки(ТекстJson));
29+
ИначеЕсли АлгоритмСжатия = "brotli" Тогда
30+
Компрессор = Новый BrotliКомпрессор();
31+
Ответ.Заголовки["content-encoding"] = "br";
32+
Ответ.ТелоДвоичныеДанные = Компрессор.Упаковать(ПолучитьДвоичныеДанныеИзСтроки(ТекстJson));
33+
ИначеЕсли АлгоритмСжатия = "zstd" Тогда
34+
Компрессор = Новый ZStdКомпрессор();
35+
Ответ.Заголовки["content-encoding"] = "zstd";
36+
Ответ.ТелоДвоичныеДанные = Компрессор.Упаковать(ПолучитьДвоичныеДанныеИзСтроки(ТекстJson));
37+
Иначе
38+
Ответ.ТелоТекст = Парсер.ЗаписатьJSON(Данные);
39+
КонецЕсли;
2040

2141
КонецПроцедуры
2242

@@ -81,6 +101,10 @@
81101
ДанныеЗапроса.Вставить("data", Данные);
82102
ДанныеЗапроса.Вставить("form", ДанныеФормы.Данные);
83103
ДанныеЗапроса.Вставить("files", ДанныеФормы.Файлы);
104+
ДанныеЗапроса.Вставить("gzipped", Истина);
105+
ДанныеЗапроса.Вставить("deflated", Истина);
106+
ДанныеЗапроса.Вставить("brotli", Истина);
107+
ДанныеЗапроса.Вставить("zstd", Истина);
84108

85109
Результат = Новый Структура(Ключи);
86110
ЗаполнитьЗначенияСвойств(Результат, ДанныеЗапроса);

tests/HttpBin_API_test.os

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#Использовать asserts
22
#Использовать 1connector
3+
#Использовать compressor
34
#Использовать ".."
45

56
Перем HttpBin; // см. HttpBin
@@ -935,6 +936,75 @@
935936

936937
КонецПроцедуры
937938

939+
&Тест
940+
Процедура Должен_ПроверитьТочкуМаршрута_GZip() Экспорт
941+
942+
Ответ = ВызватьМетодGET("gzip");
943+
944+
Парсер = Новый ПарсерJSON();
945+
Json = Парсер.ПрочитатьJSON(Ответ.Текст());
946+
947+
Ожидаем.Что(Ответ.КодСостояния).Равно(200);
948+
Ожидаем.Что(Ответ.Заголовки["Content-Type"]).Равно("application/json");
949+
Ожидаем.Что(Ответ.Заголовки["content-encoding"]).Равно("gzip");
950+
Ожидаем.Что(Json["gzipped"]).Равно(Истина);
951+
952+
КонецПроцедуры
953+
954+
&Тест
955+
Процедура Должен_ПроверитьТочкуМаршрута_Deflate() Экспорт
956+
957+
Ответ = ВызватьМетодGET("deflate");
958+
959+
Компресор = Новый DeflateКомпрессор();
960+
ДвоичныеДанные = Компресор.Распаковать(Ответ.ДвоичныеДанные());
961+
ТестJson = ПолучитьСтрокуИзДвоичныхДанных(ДвоичныеДанные);
962+
Парсер = Новый ПарсерJSON();
963+
Json = Парсер.ПрочитатьJSON(ТестJson);
964+
965+
Ожидаем.Что(Ответ.КодСостояния).Равно(200);
966+
Ожидаем.Что(Ответ.Заголовки["Content-Type"]).Равно("application/json");
967+
Ожидаем.Что(Ответ.Заголовки["content-encoding"]).Равно("deflate");
968+
Ожидаем.Что(Json["deflated"]).Равно(Истина);
969+
970+
КонецПроцедуры
971+
972+
&Тест
973+
Процедура Должен_ПроверитьТочкуМаршрута_Brotli() Экспорт
974+
975+
Ответ = ВызватьМетодGET("brotli");
976+
977+
Компресор = Новый BrotliКомпрессор();
978+
ДвоичныеДанные = Компресор.Распаковать(Ответ.ДвоичныеДанные());
979+
ТестJson = ПолучитьСтрокуИзДвоичныхДанных(ДвоичныеДанные);
980+
Парсер = Новый ПарсерJSON();
981+
Json = Парсер.ПрочитатьJSON(ТестJson);
982+
983+
Ожидаем.Что(Ответ.КодСостояния).Равно(200);
984+
Ожидаем.Что(Ответ.Заголовки["Content-Type"]).Равно("application/json");
985+
Ожидаем.Что(Ответ.Заголовки["content-encoding"]).Равно("br");
986+
Ожидаем.Что(Json["brotli"]).Равно(Истина);
987+
988+
КонецПроцедуры
989+
990+
&Тест
991+
Процедура Должен_ПроверитьТочкуМаршрута_Zstd() Экспорт
992+
993+
Ответ = ВызватьМетодGET("zstd");
994+
995+
Компресор = Новый ZStdКомпрессор();
996+
ДвоичныеДанные = Компресор.Распаковать(Ответ.ДвоичныеДанные());
997+
ТестJson = ПолучитьСтрокуИзДвоичныхДанных(ДвоичныеДанные);
998+
Парсер = Новый ПарсерJSON();
999+
Json = Парсер.ПрочитатьJSON(ТестJson);
1000+
1001+
Ожидаем.Что(Ответ.КодСостояния).Равно(200);
1002+
Ожидаем.Что(Ответ.Заголовки["Content-Type"]).Равно("application/json");
1003+
Ожидаем.Что(Ответ.Заголовки["content-encoding"]).Равно("zstd");
1004+
Ожидаем.Что(Json["zstd"]).Равно(Истина);
1005+
1006+
КонецПроцедуры
1007+
9381008
Функция ВызватьМетодGET(АдресРсесурса, Заголовки = Неопределено, ПараметрыЗапроса = Неопределено)
9391009

9401010
Ответ = КоннекторHTTP.Get(URL(АдресРсесурса), ПараметрыЗапроса, ПараметрыКоннектора(Заголовки));

0 commit comments

Comments
 (0)