Комментарии 33
А для C правда нет ни одной библиотеки для работы с HTTP?
Скорее всего есть, но в работе с HTTP ничего трудного не вижу, поэтому смысла использовать библиотеки не вижу
Ну да, совсем ничего трудного: стриминга/чанкинга не существует, енкодинга не существует… Вот пришлют вам запрос c Content-Length: find for yourself
— и развлекайтесь себе. А еще в ответ на некорректный контент-тайп надо отвечать 400 или 415. Ну и так далее.
Так я и не писал полноценный http сервер, а только для работы с сервером telegram, у которого строгая спецификация. Я не спорю, даже тут некоторых моментов не хватает.
Так я и не писал полноценный http сервер, а только для работы с сервером telegram, у которого строгая спецификация.
Вот только вы не знаете, что к вам обращается именно сервер telegram. И того, что он всегда будет поддерживать спецификацию — тоже. И того, что между вами нет прокси. И еще пятнадцати вещей.
Поэтому всегда соблюдайте спецификацию. По крайней мере в части корректной обработки того, что к вам присылают.
Я не понимаю чего Вы добиваетесь?
Тут все левые запросы отпадают уже при проверке запроса POST и ссылки которая поедставляет из себя токен, дальше просто проверяется Content-Length и считываются уже сами данные. Да, согласен, прокси может сжать данные в gzip, да тогда прога, вероятнее всего, упадет, правда упадет только дочерний процесс, а с нормальными запросами сервак продолжит работать
Я не понимаю чего Вы добиваетесь?
Отсутствия велосипедов.
Тут все левые запросы отпадают уже при проверке запроса POST и ссылки которая поедставляет из себя токен,
Этот запрос может прислать кто угодно. В буквальном смысле слова.
упадет только дочерний процесс
… давайте заодно подумаем, во сколько вам обойдется несколько сотен параллельных запросов. Или тысяч.
И это мы еще не стали обсуждать ручной парсинг JSON с помощью strstr
.
Так, во-первых прочитайте дисклеймер в начале статьи. А во-вторых серваки apache, nginx и подобные работают по тому же принципу, для каждого соединения отдельный процесс, с одним лишь отличием, процессы там создается заранее, а потом передаются туда данные, так как создание процесса занимает относительно длительное время. Если Вы хотите показать на мою неграмотность в программировании, то не должны судить по одной статье. Текст и так получился достаточно длинным, а если я бы учитывал все тонкости, статья бы получилась слишком громоздкой. Я согласен со всеми Вашими замечаниями, но для Hello, World бота Вы предъявляете слишком высокие тоебования, поэтому прошу закончить эту демагогию.
Так, во-первых прочитайте дисклеймер в начале статьи.
Это повод игнорировать замечания?
А во-вторых серваки apache, nginx и подобные работают по тому же принципу, для каждого соединения отдельный процесс, с одним лишь отличием, процессы там создается заранее, а потом передаются туда данные, так как создание процесса занимает относительно длительное время.
Имеенно. А есть сервера, которые не создают процесс на каждое соединение (именно потому, что это дорого).
Если Вы хотите показать на мою неграмотность в программировании, то не должны судить по одной статье.
Я ничего не хочу сказать о вашей неграмотности, я говорю о неграмотности решения в статье.
Текст и так получился достаточно длинным, а если я бы учитывал все тонкости, статья бы получилась слишком громоздкой.
… а если бы вы взяли готовое решение, то тонкости бы учитывало оно, а не вы. О чем и речь.
Расскажите, а что будет с вашим
char header[1024];
если нигде в запросе не встретится \r\n\r\n и запрос будет больше 1024 байт?
Покажите, пожалуйста, где это написано, и почему нельзя просто оборвать соединение?
Сервер должен, конечно. А как, по-вашему, клиент должен ответить? Клиент же только запросы может посылать.
А, да.
char header[] = "POST /bot352115436:AAEAIEPeKdR2-SS7p9jGeksQljkNa9_Smo0/sendMessage HTTP/1.1\r\nHost: files.ctrl.uz\r\nContent-Type: application/json\r\nContent-Length: %d\r\nConnection: close\r\n\r\n%s";
Круто же. Любой уважающий себя сервер (кроме files.ctrl.uz
) мог бы и послать.
1. Нужна очень высокая скорость работы, недостижимая на скриптовых и VM-языках
В случае с телеграм-ботом не требуется — мы скорее упрёмся в ограничение самого телеграма (примерно не более 30 сообщений/с.)
2. Работаем на оборудовании с очень ограниченными ресурсами.
Хм, сейчас даже роутер на openwrt спокойно тянет простенькие PHP/Python-скрипты. дешевле написать на них телеграм бота, логику которого гораздо легче поддерживать.
3. Совершенно не упомянуто очень важное свойство телеграма — можно не просто ответить 200 OK — а сразу передать ответ!
В код не вдавался, скорее в порядок действий, но успел заметить использование функции bzero.
Из мана:
4.3BSD. This function is deprecated (marked as LEGACY in
POSIX.1-2001): use memset(3) in new programs.
Мемсет — наше спасение :)
Поэтому, кмк, профит данной в статьи именно в алгоритме действий.
У тех, кто в первый раз с этим столкнулся перед глазами будет рабочий пример:)
Эмм, алгоритме каких действий?
Теперь мне стало ясно, как работать с апи, предоставляемым телеграммом.
Я был приятно удивлен тем, что можно оформить это в виде простого сетевого приложения (у меня уже целая библитека функций для приложений на сокетах).
Теперь мне стало ясно, как работать с апи, предоставляемым телеграммом.
… и как же, если не секрет?
Я был приятно удивлен тем, что можно оформить это в виде простого сетевого приложения
Ну да, http-сервер — это "простое сетевое приложение", что в этом удивительного?
… и как же, если не секрет?Про сертификат до этой статьи я был ни сном, ни духом :)
Ну да, http-сервер — это «простое сетевое приложение», что в этом удивительного?Последние пару месяцев я моими тасками было ковыряться в сорцах udhcpc и udhcpd, расширяя его функционал.
После всего этого то, что представлено тут, воспринимается очень просто :)
Теперь мне стало ясно, как работать с апи, предоставляемым телеграммом.
Вот, например, простой вопрос: как убедиться, что запрос, присланный на вебхук, пришел именно от телеграма?
Обмен сообщениями на сокетах тесно связан со структурой sockaddr_in. В один из ее экземпляров можно записывать адрес клиента, который пытается подключиться.
Если этот вариант не проканает, то можно воспользоваться RAW-сокетами — тогда можно будет распарсить сырой пакет полностью и посмотреть заголовки.
После этого — сравнить сертефикаты.
В один из ее экземпляров можно записывать адрес клиента, который пытается подключиться.
И что делать с этим адресом?
Если этот вариант не проканает, то можно воспользоваться RAW-сокетами — тогда можно будет распарсить сырой пакет полностью и посмотреть заголовки. После этого — сравнить сертефикаты.
Сравнить какой сертификат с чем?
Кроме переполнения header из комента выше могу добавит проблему что не везде есть проверки что strstr находит подстроку. И дальше может быть обращение к плохому указателю.
Пишем «Hello, World» Telegram бота на Си