init here
This commit is contained in:
140
исх/сеть/хттп/клиент.tri
Normal file
140
исх/сеть/хттп/клиент.tri
Normal file
@@ -0,0 +1,140 @@
|
||||
модуль хттп
|
||||
|
||||
импорт "стд::вывод"
|
||||
импорт "исх/строка"
|
||||
импорт "исх/сеть/тцп"
|
||||
|
||||
фн сериализовать хттп-запрос(хост: Строка, обращение: ХттпОбращение): Строка {
|
||||
пусть метод := обращение.метод
|
||||
если метод = "" {
|
||||
метод := "GET"
|
||||
}
|
||||
|
||||
пусть путь := обращение.путь
|
||||
если путь = "" {
|
||||
путь := "/"
|
||||
}
|
||||
|
||||
пусть первая := строка.ф("$стр $стр HTTP/1.1\r\n", метод, путь)
|
||||
пусть есть длина := ложь
|
||||
пусть выход := первая
|
||||
|
||||
цикл [номер]заглавие среди обращение.заглавия {
|
||||
если заглавие.имя = "Content-Length" { есть длина := истина }
|
||||
выход := строка.собрать(выход, строка.ф("$стр: $стр\r\n", заглавие.имя, заглавие.значение))
|
||||
}
|
||||
|
||||
выход := строка.собрать(выход, строка.ф("Host: $стр\r\n", хост))
|
||||
|
||||
если ~ есть длина {
|
||||
выход := строка.собрать(выход, строка.ф("Content-Length: $цел\r\n", длина(обращение.туловище(:Строка8))))
|
||||
}
|
||||
|
||||
выход := строка.собрать(выход, "\r\n")
|
||||
|
||||
если длина(обращение.туловище) > 0 { выход := строка.собрать(выход, обращение.туловище) }
|
||||
|
||||
вернуть выход
|
||||
}
|
||||
|
||||
фн послать далеко и надолго*(хост: Строка, порт: Цел64, обращение: ХттпОбращение): ХттпОтвет {
|
||||
пусть соединение = тцп.подключиться(хост, порт)
|
||||
пусть данные = сериализовать хттп-запрос(хост, обращение)
|
||||
|
||||
соединение.записать(данные)
|
||||
|
||||
вывод.ф("Ждем хттп ответ\n")
|
||||
пусть ответ = разобрать хттп ответ(соединение)
|
||||
соединение.закрыть()
|
||||
вывод.ф("Дождались\n")
|
||||
|
||||
вернуть ответ
|
||||
}
|
||||
|
||||
фн послать на три буквы*(хост: Строка, порт: Цел64, путь: Строка): ХттпОтвет {
|
||||
вернуть послать далеко и надолго(хост, порт, ХттпОбращение{ метод: "GET", путь: путь })
|
||||
}
|
||||
|
||||
тип Урл* = класс {
|
||||
хост*: Строка := ""
|
||||
порт*: Цел64 := 0
|
||||
путь*: Строка := ""
|
||||
}
|
||||
|
||||
фн парсить урл*(стр: Строка, оплошность := Строка): Урл {
|
||||
оплошность := ""
|
||||
|
||||
пусть с = строка.обрезать пробельные символы(стр)
|
||||
если с = "" {
|
||||
оплошность := "пустой урл"
|
||||
вернуть Урл{}
|
||||
}
|
||||
|
||||
пусть схема := "http"
|
||||
пусть ост := с
|
||||
если строка.разделить(с, "://", схема, ост) {
|
||||
схема := строка.обрезать пробельные символы(схема)
|
||||
} иначе {
|
||||
// без схемы считаем http
|
||||
схема := "http"
|
||||
ост := с
|
||||
}
|
||||
|
||||
// отделяем authority и путь
|
||||
пусть № слеша = строка.индекс(ост, 0, "/")
|
||||
пусть авторитет := ""
|
||||
пусть путь := ""
|
||||
если № слеша >= 0 {
|
||||
пусть ост8 = ост(:Строка8)
|
||||
авторитет := строка.извлечь(ост, 0, № слеша)
|
||||
путь := строка.извлечь(ост, № слеша, длина(ост8) - № слеша)
|
||||
} иначе {
|
||||
авторитет := ост
|
||||
путь := ""
|
||||
}
|
||||
|
||||
авторитет := строка.обрезать пробельные символы(авторитет)
|
||||
если авторитет = "" {
|
||||
оплошность := "пустой хост в урл"
|
||||
вернуть Урл{}
|
||||
}
|
||||
|
||||
// парсим хост и порт
|
||||
пусть хост := авторитет
|
||||
пусть порт: Цел64 := 0
|
||||
пусть № двоеточия = строка.индекс(авторитет, 0, ":")
|
||||
если № двоеточия >= 0 {
|
||||
пусть ав8 = авторитет(:Строка8)
|
||||
хост := строка.извлечь(авторитет, 0, № двоеточия)
|
||||
пусть порт строка := строка.извлечь(авторитет, № двоеточия + 1, длина(ав8) - (№ двоеточия + 1))
|
||||
порт строка := строка.обрезать пробельные символы(порт строка)
|
||||
|
||||
пусть порт значение := 0
|
||||
пусть № байта := 0
|
||||
если ~ строка.извлечь цел(порт строка, № байта, порт значение) {
|
||||
оплошность := "некорректный порт в урл"
|
||||
вернуть Урл{}
|
||||
}
|
||||
если порт значение <= 0 | порт значение > 65535 {
|
||||
оплошность := "порт вне диапазона в урл"
|
||||
вернуть Урл{}
|
||||
}
|
||||
порт := порт значение
|
||||
} иначе {
|
||||
если схема = "https" {
|
||||
порт := 443
|
||||
} иначе {
|
||||
порт := 80
|
||||
}
|
||||
}
|
||||
|
||||
хост := строка.обрезать пробельные символы(хост)
|
||||
если хост = "" {
|
||||
оплошность := "пустой хост в урл"
|
||||
вернуть Урл{}
|
||||
}
|
||||
|
||||
если путь = "" { путь := "/" }
|
||||
|
||||
вернуть Урл{ хост: хост, порт: порт, путь: путь }
|
||||
}
|
||||
Reference in New Issue
Block a user