Включения на стороне CGI

Технология включений не стороне CGI (назовем ее CSI) подразумевает включение специальных кусков кода в HTML документы, очень похожих на SSI. Этот код обрабатывает специальный CGI-сценарий, который заменяет их на конкретные данные, позволяющие сохранять контекст.

CSI код выглядет примерно следующим образом (важно понимать, что CSI не является ни стандартом, ни общепризнанной технологией, поэтому способ представления и реализации CSI полностью зависит от Вашей фантазии):

<html>
<head><title></title></head>
<body>
<ul>
<li><a href=”/cgi-bin/takeit.cgi?cookie=
<!–#insert var=”COOKIE”–>&film_id=1″>
Ну, погоди!</a>
<li><a href=”/cgi-bin/takeit.cgi?cookie=
<!–#insert var=”COOKIE”–>&film_id=2″>
Колобок</a></ul>
<a href=”/cgi-bin/csi.pl/next.html?cookie=
<!–#insert var=”COOKIE”–>”>Далее</a>
<form action=”/cgi-bin/buyit.cgi?cookie=
<!–#insert var=”COOKIE”–>” method=post>
Ваше имя: <input type=”text”
name=”name”><br>
<input type=”submit” value=”Купить”>
</form>
</body></html>

Вы вольны придумывать любые параметры, необходимые для реализации Вашей задачи. В общем случае достаточно указывать только “волшебный cookie” – число, уникальное для каждого сеанса работы с пользователем, а остальные данные хранить в соответствующем этому числу временном файле или базе данных. Или, если это позволяет объем данных, Вы можете передавать все данные через CSI.

Для обработки CSI вызывается сценарий, имя документа передается ему также, как и в случае скрытых полей:

http://www.your.sever.ru/cgi-bin/csi.pl/

film_cathalog.html

Сам сценарий обработки CSI выглядит примерно так:

#!/usr/local/bin/perl
print “Content-type: text/html\n\n”;

read(STDIN, $buffer, $ENV{‘CONTENT_LENGTH’});
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
   local($name, $value) = split(/=/, $pair);
   $name =~ tr/+/ /;
   $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack(“C”,
   hex($1))/eg;
   $value =~ tr/+/ /;
   $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack(“C”,
   hex($1))/eg;
   $value =~ s/<!–(.|\n)*–>//g;
   $FORM_DATA{$name} = $value;
}

$cookie = $FORM_DATA{‘cookie’};
$cookie = join(“_”, $ENV{‘REMOTE_HOST’}, time)
 if (!$cookie);
$cookie =~ s/(\W)/sprintf(“%%%x”, ord($1))/eg;

$form_file = $ENV{‘PATH_INFO’};
$full_path = “/usr/local/etc/httpd/htdocs” .
$form_file;

open(FILE, “<” . $full_path);
while (<FILE>) {
  while ( ($command, $argument, $parameter) =
          (/<!–\s*#\s*(\w+)\s+(\w+)\s*=\s*”?
    (\w+)”?\s*–>/io) ) {
    if ($command eq “insert”) {
      if ($argument eq “var”) {
        if ($parameter eq “COOKIE”) {
          s//$cookie/;
        } elsif ($parameter eq “DATE_TIME”) {
          local ($time) = &get_date_time();
          s//$time/;
        } else {
          s///;
        }
      }
    }
  print;
}
close(FILE);

В нашем случае поддерживаются только команды insert с аргументом var и двумя параметрами: COOKIE и DATE_TIME. Но Вы можете ввести любые необходимые Вам команды, аргументы и параметры. Только следите при этом за отсутствием совпадений с SSI.

Добавить комментарий

Вам надо войти, чтобы написать комментарий.