OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 28 Март, 2024 19:27

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
 Заголовок сообщения: A2 CGI
СообщениеДобавлено: Понедельник, 22 Апрель, 2019 09:36 
Аватара пользователя

Зарегистрирован: Пятница, 11 Май, 2007 21:57
Сообщения: 1488
Откуда: Украина, Киев
Благодаря наличию сборки A2 в виде консольного приложения (все последние сборки в репозитории так собираются по-умолчанию). Для Linux это основной вариант сборки, для Window это через указание линковщику параметра
Код:
--fileFormat=PE32CUI
Мы можем теперь на базе этого сделать простейший CGI-скрипт, например:
Цитата:
System.Show Content-type: text/html~
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 ~
И такой результат можем увидеть в браузере (CGI включён в shtml страничку через SSI):
Вложение:
A2 CGI.png
A2 CGI.png [ 58.12 КБ | Просмотров: 7796 ]
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 и вылетает с ошибкой. Над этим ещё поработаю.


Последний раз редактировалось Ярослав Романченко Понедельник, 22 Апрель, 2019 11:38, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: A2 CGI
СообщениеДобавлено: Понедельник, 22 Апрель, 2019 09:59 

Зарегистрирован: Вторник, 26 Январь, 2010 09:31
Сообщения: 717
Откуда: Барнаул
а через
context := Commands.GetContext();
context.out....
работает?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: A2 CGI
СообщениеДобавлено: Понедельник, 22 Апрель, 2019 10:16 
Аватара пользователя

Зарегистрирован: Пятница, 11 Май, 2007 21:57
Сообщения: 1488
Откуда: Украина, Киев
Kemet писал(а):
а через
context := Commands.GetContext();
context.out....
работает?
не пробовал. А это где написать?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: A2 CGI
СообщениеДобавлено: Понедельник, 22 Апрель, 2019 10:28 

Зарегистрирован: Вторник, 26 Январь, 2010 09:31
Сообщения: 717
Откуда: Барнаул
Ну это уже в программе на АО.
Ещё же есть интерпретатор. Вот задействовать скрипты на Активном Обероне было бы веселее, а из них и писать в контекст


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: A2 CGI
СообщениеДобавлено: Понедельник, 22 Апрель, 2019 10:48 

Зарегистрирован: Вторник, 26 Январь, 2010 09:31
Сообщения: 717
Откуда: Барнаул
хотя, писать в дефолтный контекст не очень полезно, потому что туда пишут все кому не лень. видимо, нужно создавать специальный контекст для этого и устанавливать текущей активности. System.Show пишет тоже по умолчанию.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: A2 CGI
СообщениеДобавлено: Понедельник, 22 Апрель, 2019 11:56 
Аватара пользователя

Зарегистрирован: Пятница, 11 Май, 2007 21:57
Сообщения: 1488
Откуда: Украина, Киев
В общем, если в процедуре 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 ~


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: A2 CGI
СообщениеДобавлено: Понедельник, 22 Апрель, 2019 12:48 
Аватара пользователя

Зарегистрирован: Пятница, 11 Май, 2007 21:57
Сообщения: 1488
Откуда: Украина, Киев
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;
Так контекст же здесь и так передаётся и мы как читаем через него параметры так и выводим результат.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: A2 CGI
СообщениеДобавлено: Понедельник, 22 Апрель, 2019 14:31 

Зарегистрирован: Вторник, 26 Январь, 2010 09:31
Сообщения: 717
Откуда: Барнаул
Контекст теперь есть у каждой активности. Если создать новую активность, то контекст будет скопирован из текущей активности. То есть он наследуется.
Поэтому к нему можно обратиться не только в командах, а в любом месте получить, установить, использовать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: A2 CGI
СообщениеДобавлено: Вторник, 03 Декабрь, 2019 10:22 
Аватара пользователя

Зарегистрирован: Пятница, 11 Май, 2007 21:57
Сообщения: 1488
Откуда: Украина, Киев
Описывается способ эмуляции Shebang на Windows. Кто-то пробовал?
Эмулируем shebang на Windows


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: A2 CGI
СообщениеДобавлено: Вторник, 03 Декабрь, 2019 23:29 
Аватара пользователя

Зарегистрирован: Пятница, 11 Май, 2007 21:57
Сообщения: 1488
Откуда: Украина, Киев
Замечательно работает!
Переписал код из статьи на FreePascal


Вложения:
WinShebang.zip [87.54 КБ]
Скачиваний: 288
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB