OberonCore https://forum.oberoncore.ru/ |
|
A2 CGI https://forum.oberoncore.ru/viewtopic.php?f=22&t=6387 |
Страница 1 из 1 |
Автор: | Ярослав Романченко [ Понедельник, 22 Апрель, 2019 09:36 ] |
Заголовок сообщения: | A2 CGI |
Благодаря наличию сборки A2 в виде консольного приложения (все последние сборки в репозитории так собираются по-умолчанию). Для Linux это основной вариант сборки, для Window это через указание линковщику параметра Код: --fileFormat=PE32CUI Мы можем теперь на базе этого сделать простейший CGI-скрипт, например: Цитата: System.Show Content-type: text/html~ И такой результат можем увидеть в браузере (CGI включён в shtml страничку через SSI):System.Ln ~ System.Ln ~ System.Show <HTML> ~ System.Ln ~ System.Show <HEAD><TITLE>Hello from A2 OS</TITLE></HEAD> ~ System.Ln ~ System.Show <BODY> ~ System.Ln ~ System.Show <H1>Hello from A2 OS!</H1> ~ System.Ln ~ System.Show <H2>Version information:</H2> ~ System.Version ~ System.Ln ~ System.Show <H2>Some environment variables:</H2> ~ System.Ln ~ env.var HTTP_HOST ~ System.Show <BR> ~ System.Ln ~ env.var HTTP_USER_AGENT ~ System.Show <BR> ~ System.Ln ~ env.var REQUEST_URI ~ System.Show <BR> ~ System.Ln ~ env.var REQUEST_METHOD ~ System.Show <BR> ~ System.Ln ~ env.var SERVER_NAME ~ System.Show <BR> ~ System.Ln ~ env.var SERVER_SOFTWARE ~ System.Show <BR> ~ System.Ln ~ env.var SERVER_SIGNATURE ~ System.Show <BR> ~ System.Ln ~ env.var UNIQUE_ID ~ System.Show <BR> ~ System.Ln ~ System.Show <H2>Loaded modules:</H2> ~ System.ListModules ~ System.Ln ~ System.Show <H2>To be continued... Stay tuned!</H2> ~ System.Show </BODY></HTML> ~ System.Ln ~ System.PowerDown ~ Вложение: env.var - это вызов простейшего модуля, реализующего процедуру чтения переменной окружения по имени:Код: MODULE env; (** AUTHOR "Yaroslav Romanchenko"; PURPOSE "Simple example of reading environment variables on Unix"; *) IMPORT SYSTEM, Commands, Unix; PROCEDURE GetEnvVar(aName: ARRAY OF CHAR; VAR aVar: ARRAY OF CHAR): BOOLEAN; VAR addr: ADDRESS; i, max: LONGINT; c: CHAR; bOk: BOOLEAN; BEGIN bOk := FALSE; max := LEN(aVar) - 1; (* For reading even one char we need at least array of length 2 *) IF max >= 1 THEN addr := Unix.getenv(ADDRESSOF(aName)); IF addr = 0 THEN (* There is no such variable. Result is FALSE *) aVar[0] := 0X ELSE REPEAT SYSTEM.GET(addr, c); aVar[i] := c; INC(addr); INC(i) UNTIL (c = 0X) OR (i = max); aVar[i] := 0X; bOk := TRUE END END; RETURN bOk END GetEnvVar; PROCEDURE var*(context: Commands.Context); VAR aName, aVar: ARRAY 256 OF CHAR; BEGIN context.arg.SkipWhitespace(); context.arg.Token(aName); IF (aName[0] # 0X) & GetEnvVar(aName, aVar) THEN context.out.String(aName); context.out.Char('='); context.out.String(aVar); context.out.Ln END; END var; END env. Как организовать компиляцию исходника, предназначенного для Linux, из WinAos? Очень просто. Сначала получаем список зависимостей, например, модуля Commands, который нам точно нужен: Цитата: Release.RequiredModules Linux64 Commands ~ Видим, что в списке зависимостей модуль Unix, который нам тоже нужен, уже включён. Значит список полон. Пишем команду компиляции под нужную платформу, включая список зависимостей, модуль Commands.Mod и наш модуль env.Mod и компилируем:Цитата: Compiler.Compile -p=Unix64 Батник, который будет использован на сервере делаем через мощный юниксовый приём Шебанг:AMD64.Builtins.Mod Trace.Mod Linux.Glue.Mod Linux.Unix.Mod Unix.Machine.Mod Heaps.Mod Modules.Mod Unix.Objects.Mod KernelLog.Mod RealConversions.Mod Streams.Mod Commands.Mod env.Mod ~ Цитата: #!./oberon run env.txt Полный Шебанг (что-бы вставить команды прямо в этот батник, а не отдельным файлом) пока не получается, интерпретатор команд A2 пытается исполнить первую строчку #!./oberon и вылетает с ошибкой. Над этим ещё поработаю.
|
Автор: | Kemet [ Понедельник, 22 Апрель, 2019 09:59 ] |
Заголовок сообщения: | Re: A2 CGI |
а через context := Commands.GetContext(); context.out.... работает? |
Автор: | Ярослав Романченко [ Понедельник, 22 Апрель, 2019 10:16 ] |
Заголовок сообщения: | Re: A2 CGI |
Kemet писал(а): а через не пробовал. А это где написать?
context := Commands.GetContext(); context.out.... работает? |
Автор: | Kemet [ Понедельник, 22 Апрель, 2019 10:28 ] |
Заголовок сообщения: | Re: A2 CGI |
Ну это уже в программе на АО. Ещё же есть интерпретатор. Вот задействовать скрипты на Активном Обероне было бы веселее, а из них и писать в контекст |
Автор: | Kemet [ Понедельник, 22 Апрель, 2019 10:48 ] |
Заголовок сообщения: | Re: A2 CGI |
хотя, писать в дефолтный контекст не очень полезно, потому что туда пишут все кому не лень. видимо, нужно создавать специальный контекст для этого и устанавливать текущей активности. System.Show пишет тоже по умолчанию. |
Автор: | Ярослав Романченко [ Понедельник, 22 Апрель, 2019 11:56 ] |
Заголовок сообщения: | Re: A2 CGI |
В общем, если в процедуре System.DoCommands сделать аккуратно удаление однострочных комментариев вида #<текст комментария>EOL (строка должна обязательно начинаться с #, иначе поломаются многие скрипты, т.к. # активно используется), такие скрипты через DoCommands будут работать "из коробки". Уже что-то, я считаю Ведь вместо System.Show мы вполне можем запустить и команду из более серьёзного модуля, заранее скомпилированного, естественно Код: #!./oberon run
System.Show Content-type: text/html~ System.Ln ~ System.Ln ~ System.Show <HTML> ~ ... System.Show </HTML> ~ System.Ln ~ System.PowerDown ~ |
Автор: | Ярослав Романченко [ Понедельник, 22 Апрель, 2019 12:48 ] |
Заголовок сообщения: | Re: A2 CGI |
Kemet писал(а): Ну это уже в программе на АО. Всё-равно не понятно.Это здесь? Код: PROCEDURE var*(context: Commands.Context); Так контекст же здесь и так передаётся и мы как читаем через него параметры так и выводим результат.
VAR aName, aVar: ARRAY 256 OF CHAR; BEGIN context.arg.SkipWhitespace(); context.arg.Token(aName); IF (aName[0] # 0X) & GetEnvVar(aName, aVar) THEN context.out.String(aName); context.out.Char('='); context.out.String(aVar); context.out.Ln END; END var; |
Автор: | Kemet [ Понедельник, 22 Апрель, 2019 14:31 ] |
Заголовок сообщения: | Re: A2 CGI |
Контекст теперь есть у каждой активности. Если создать новую активность, то контекст будет скопирован из текущей активности. То есть он наследуется. Поэтому к нему можно обратиться не только в командах, а в любом месте получить, установить, использовать. |
Автор: | Ярослав Романченко [ Вторник, 03 Декабрь, 2019 10:22 ] |
Заголовок сообщения: | Re: A2 CGI |
Описывается способ эмуляции Shebang на Windows. Кто-то пробовал? Эмулируем shebang на Windows |
Автор: | Ярослав Романченко [ Вторник, 03 Декабрь, 2019 23:29 ] | ||
Заголовок сообщения: | Re: A2 CGI | ||
Замечательно работает! Переписал код из статьи на FreePascal
|
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |