OberonCore
https://forum.oberoncore.ru/

Http (от Josef Templ) посыл-прием пакетов
https://forum.oberoncore.ru/viewtopic.php?f=47&t=6588
Страница 1 из 1

Автор:  ddn1 [ Пятница, 20 Март, 2020 17:35 ]
Заголовок сообщения:  Http (от Josef Templ) посыл-прием пакетов

Вот смотрю расширение Http и не могу понять, какие его модуль и процедуры вызывают команды windowds API (работа с сокетами), чтобы отправить уже сформированный сетевой пакет в сеть (на роутер) или принять его?

Преобразует ли (обволакивает, перекодирует) windowds этот сетевой пакет, или оставляет неизменным байт в байт?

Автор:  adimetrius [ Пятница, 20 Март, 2020 17:59 ]
Заголовок сообщения:  Re: Http (от Josef Templ) посыл-прием пакетов

ddn1 писал(а):
Вот смотрю расширение Http и не могу понять, какие его модуль и процедуры вызывают команды windowds API (работа с сокетами), чтобы отправить уже сформированный сетевой пакет в сеть (на роутер) или принять его?

Преобразует ли (обволакивает, перекодирует) windowds этот сетевой пакет, или оставляет неизменным байт в байт?


Кмк, работа с сокетами делается в CommTCP, а не в подсистеме Http. Если речь про HTTPS, то HttpCommSSL.

Автор:  ddn1 [ Пятница, 20 Март, 2020 19:55 ]
Заголовок сообщения:  Re: Http (от Josef Templ) посыл-прием пакетов

adimetrius писал(а):
Кмк, работа с сокетами делается в CommTCP, а не в подсистеме Http.
Ну его же (CommTCP) надо импортировать, а модули HttpServers и HttpWeb его (WinApi как оказалось, а не CommTCP) не импортируют. Видимо они только формируют пакеты.

adimetrius писал(а):
Если речь про HTTPS, то HttpCommSSL.
То есть по протоколу HTTP (без шифрования) пакеты в сеть не отправяются? Логично тогда назвать расширение Https.

Вот схема импорта расширения Http:
Код:
HttpServers (IMPORT Strings, Services, CommStreams, Files, Dates, StdLog)
   HttpWeb (IMPORT HttpServers, Files := Files64, Strings)
      HttpCmds (IMPORT HttpServers, HttpWeb, Strings, Files, CommStreams, TextModels, TextViews, Views)
WinApi
   HttpOpenssl ["libssl32"] (IMPORT WinApi)
      HttpCommSSL (IMPORT SYSTEM, WinNet, Strings, Dialog, CommStreams, HttpOpenssl, StdLog)
         HttpSSLCmds (IMPORT CommSSL := HttpCommSSL, CommStreams, TextModels, TextViews, Views)


Хочу написать (и скомпилировать на чем-нибудь) свой сервер, чтобы можно было программно работать с интернетом, с прокси, с поисковиками, загружать и раздавать файлы и т.д., потому что сторонний софт так работать не умеет. Поскольку в этих IT протоколах и миллионе "технологиях" я ни черта не разбираюсь - документация у них расплывчатая, свой птичий сленг и все на английском, то причесанная, без лишнего мусора реализация на понятном Паскале может помочь разобраться, как это работает, для начала в общих чертах. Смотрел сетевые модули A2, они довольно сложные и вообще там много лишнего логирования всего подряд, у Josef Templ-а смотрится проще. Лет через 30 может разберусь.

Автор:  Борис Рюмшин [ Пятница, 20 Март, 2020 20:03 ]
Заголовок сообщения:  Re: Http (от Josef Templ) посыл-прием пакетов

ddn1 писал(а):
adimetrius писал(а):
Кмк, работа с сокетами делается в CommTCP, а не в подсистеме Http.
Ну его же (CommTCP) надо импортировать, а модули HttpServers и HttpWeb его (WinApi как оказалось, а не CommTCP) не импортируют. Видимо они только формируют пакеты.

Его не надо импортировать. Он загружается динамически, так как указан в параметрах процедуры CommStreams.NewListener. Смотрите документацию и примеры подсистемы Comm. В частности CommObxStreamsServer.

Автор:  adimetrius [ Пятница, 20 Март, 2020 21:54 ]
Заголовок сообщения:  Re: Http (от Josef Templ) посыл-прием пакетов

ddn1,

я согласен с Борисом. Http не импортирует CommTCP, и вообще не импортирует напрямую ни один транспортный протокол-модуль. Наименование модуля-транспорта передается как строка, и модуль-транспорт загружается динамически (не через IMPORT, а через Dialog.Call). И в этом красота и мосчь: Http может работать с произвольными транспортами, возможно, написанными позже, чем сама Http.
Вот команда запуска сервера:
Код:
KeepRemote.StartHttpServer('CommTCP', '0.0.0.0:1081', '/BB/')

Как видите, я использую транспорт CommTCP, а мог бы указать HttpCommSSL

На Templ's Http я смог быстро сделать сервер для обслуживания запросов моего приложения. Для обычного веб-сервера - т.е. для раздачи html-файлов - уже все реализовано в Http, только запустить, программировать ничего не надо. И, кста, это самое внятное и лаконичное определение веб-сервера, которое я встречал, как раз в духе оберона. И как раз для изучения. Сложностью может быть, пожалуй, использованная - вполне уместно - машина состояний, чтобы разбить обработку запроса на этапы; но тоже довольно ясно все сделано.

К сожалению, Хттп построена только как сервер. Чтобы получить документ по http, я пользовался модулем от Ивана Денисова. А было бы логично и здорово, чтобы Хттп-клиент и Хттп-сервер пользовались единым набором Хттп-понятий.

Ну и еще, Джозеф широко использовал SHORTCHAR, что вызывало у меня сильное раздражение.

Автор:  Trurl [ Пятница, 20 Март, 2020 22:21 ]
Заголовок сообщения:  Re: Http (от Josef Templ) посыл-прием пакетов

ddn1 писал(а):
Вот смотрю расширение Http и не могу понять, какие его модуль и процедуры вызывают команды windowds API (работа с сокетами), чтобы отправить уже сформированный сетевой пакет в сеть (на роутер) или принять его?


Никакие. И сетевые пакеты там не формируются. Этим занимается windows.

Автор:  Иван Денисов [ Суббота, 21 Март, 2020 05:21 ]
Заголовок сообщения:  Re: Http (от Josef Templ) посыл-прием пакетов

В GNU/Linux это расширение Йозефа тоже работает, кстати. Проверял https://community.blackboxframework.org ... t=162#p928

Автор:  ddn1 [ Понедельник, 19 Октябрь, 2020 21:15 ]
Заголовок сообщения:  Re: Http (от Josef Templ) посыл-прием пакетов

adimetrius писал(а):
Вот команда запуска сервера:
Код:
KeepRemote.StartHttpServer('CommTCP', '0.0.0.0:1081', '/BB/')
В модуле Http нет процедуры StartHttpServer. Что за модуль KeepRemote, он опубликован?

adimetrius писал(а):
Для обычного веб-сервера - т.е. для раздачи html-файлов - уже все реализовано в Http, только запустить, программировать ничего не надо.
Что-то сомневаюсь, как раздать папку с файлами через заданный порт?

Вообще, язык html-запросов, это какой-то маразм. Зачем он нужен? Проще сделать ftp-сервер, работающий с файловой системой через модуль Files, параметры сервера будут в txt-файлах служебного каталога, авторизацию можно сделать через запись команд в служебный файл, данные - в каталогах пользователей. Остальное - забота браузера, без маразматических протоколов.

adimetrius писал(а):
Чтобы получить документ по http, я пользовался модулем от Ивана Денисова.
Что за модуль, где его достать?

Автор:  Иван Денисов [ Вторник, 20 Октябрь, 2020 18:44 ]
Заголовок сообщения:  Re: Http (от Josef Templ) посыл-прием пакетов

CommHttp есть в старой сборке https://oberoncore.ru/projects/intron
Посмотрите файл CommObxHttp
Всё пока руки не дойдут его отдельно нормально опубликовать.

А вот тут ещё есть сервер для раздачи файлов:
https://github.com/bbcb/bbcp/tree/maste ... les/server
Если посмотреть TcpTask, то увидите, что там любое динамическое содержимое также возможно отдавать.
Но обработку POST запросов я так и не доделал пока. Ну и в целом реализация требует доработки.

Автор:  adimetrius [ Вторник, 20 Октябрь, 2020 20:59 ]
Заголовок сообщения:  Re: Http (от Josef Templ) посыл-прием пакетов

Упс, нестыковочка вышла. Действительно, StartHttpServer есть только в KeepRemote, а Http ее нет. Но StartHttpServer проста:

Код:
   TYPE Servlet = POINTER TO RECORD (HttpServers.Servlet) ... END;
   VAR server: HttpServers.Server;
   PROCEDURE StartHttpServer* (IN protocol, localAdr, prefix: ARRAY OF CHAR);
      CONST methods = { HttpServers.METHOD_GET, HttpServers.METHOD_PUT,
         HttpServers.METHOD_DELETE, HttpServers.METHOD_PATCH };
      VAR servlet: Servlet;
   BEGIN
      IF server = NIL THEN server := Http.NewServer() ELSE server.Stop END;
      NEW(servlet);
      server.RegisterServlet(servlet, prefix, methods);
      server.Start(protocol, localAdr);
   END StartHttpServer;   (* "KeepRemote.StartHttpServer('CommTCP', '0.0.0.0:1081', '/BB/')" *)


Чтобы раздавать файлы через Http (т.е. по сути веб-сервер организовать), воспользуйтесь HttpWeb.Servlet. Чтобы на произвольный порт его повесить, смотрите на строки инициализации в примере.

ddn1 писал(а):
Вообще, язык html-запросов, это какой-то маразм. Зачем он нужен?

Вот чтобы его заменить там, где он неуместен, я делал KeepRemote: чтобы вызывать из ББ1 процедуры в ББ2 и получать результаты обратно в ББ1. Но - пока не достаточно оттестировал и не опубликовал.

Автор:  Иван Денисов [ Четверг, 23 Декабрь, 2021 23:24 ]
Заголовок сообщения:  Re: Http (от Josef Templ) посыл-прием пакетов

Иван Денисов писал(а):
CommHttp есть в старой сборке https://oberoncore.ru/projects/intron
Посмотрите файл CommObxHttp
Всё пока руки не дойдут его отдельно нормально опубликовать.


Не написал документацию, на там в целом довольно понятные примеры.
Зато опубликовал!
https://blackbox.oberon.org/extension/Hyper

Для замечаний и пулреквестов:
https://github.com/bbext/hyper

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/