Files
srab/исх/сеть/хттп/маршрутизатор/маршутизатор.tri
2025-11-26 21:32:41 +03:00

121 lines
5.8 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
модуль маршрутизатор
импорт "стд::контейнеры/словарь/стр-стр"
импорт "исх/строка"
импорт "исх/сеть/хттп"
импорт "исх/массивы"
тип Обращение* = класс (хттп.ХттпОбращение) {
запрос-в-пути*: стр-стр.Словарь := стр-стр.Словарь{}
}
тип ОбработчикМаршрута = фн (путь: Строка, параметры: массивы.Строки, обращение: Обращение): хттп.ХттпОтвет
тип Маршрут = класс {
путь: Строка := "/"
обработчик: ОбработчикМаршрута := позже
методы: массивы.Строки := массивы.Строки[]
}
фн (м: Маршрут) подходит по пути(обращение: хттп.ХттпОбращение, параметры := массивы.Строки): Лог {
пусть части пути по запросу = строка.разобрать(обращение.путь, "?")
пусть части пути обращения = строка.разобрать(части пути по запросу[0], "/")
пусть части пути маршрута = строка.разобрать(м.путь, "/")
цикл [номер]часть пути маршрута среди части пути маршрута {
если часть пути маршрута = "*" {
пусть ай := номер
пока ай < длина(части пути обращения) {
параметры.добавить(части пути обращения[ай])
ай++
}
вернуть истина
}
если номер >= длина(части пути обращения) {
вернуть ложь
}
пусть часть пути обращения = части пути обращения[номер]
если часть пути маршрута = "$" {
параметры.добавить(часть пути обращения)
} иначе если часть пути маршрута # часть пути обращения {
вернуть ложь
}
}
вернуть длина(части пути маршрута) = длина(части пути обращения)
}
фн (м: Маршрут) подходит по методу(обращение: хттп.ХттпОбращение): Лог {
цикл [номер]метод среди м.методы {
если метод = обращение.метод {
вернуть истина
}
}
вернуть ложь
}
фн (м: Маршрут) подходит для*(обращение: хттп.ХттпОбращение, параметры := массивы.Строки): Лог {
вернуть м.подходит по пути(обращение, параметры) & м.подходит по методу(обращение)
}
тип Маршруты = []Маршрут
тип Маршрутизатор* = класс {
маршруты: Маршруты := Маршруты[]
обработчик_404: ОбработчикМаршрута := обработчик_404
}
фн (м: Маршрутизатор) добавить маршрут*(путь: Строка, методы: массивы.Строки, обработчик: ОбработчикМаршрута) {
м.маршруты.добавить(Маршрут{путь: путь, обработчик: обработчик, методы: методы})
}
фн (м: Маршрутизатор) обработать обращение*(обращение: хттп.ХттпОбращение): хттп.ХттпОтвет {
пусть обращение маршрутизатора = Обращение{
метод: обращение.метод,
путь: обращение.путь,
версия: обращение.версия,
заглавия: обращение.заглавия,
туловище: обращение.туловище,
запрос-в-пути: разобрать-запрос-в-пути(обращение.путь)
}
цикл [номер]маршрут среди м.маршруты {
пусть параметры := массивы.Строки[]
если маршрут.подходит для(обращение, параметры) {
вернуть маршрут.обработчик(обращение.путь, параметры, обращение маршрутизатора)
}
}
вернуть м.обработчик_404(обращение.путь, массивы.Строки[], обращение маршрутизатора)
}
фн разобрать-запрос-в-пути(путь: Строка): стр-стр.Словарь {
пусть части = строка.разобрать(путь, "?")
если длина(части) < 2 {
вернуть стр-стр.Словарь{}
}
пусть параметры = строка.разобрать(части[1], "&")
пусть словарь = стр-стр.Словарь{}
цикл [номер]параметр среди параметры {
пусть пара = строка.разобрать(параметр, "=")
если длина(пара) = 2 {
словарь.добавить(пара[0], пара[1])
} иначе если длина(пара) = 1 {
словарь.добавить(пара[0], "")
}
}
вернуть словарь
}