На этом шаге мы начнем создавать свой сценарий CGI.
Программа должна декодировать полученные данные, проверять заполнение обязательных полей формы и правильность подтверждения пароля, в зависимости от результатов проверки формировать документ для отсылки клиенту. Сохраним сценарий в файле /cgi-bin/registrar.cgi. Полный маршрут к данному файлу определяется параметрами конфигурации Web-сервера. Местоположение каталога cgi-bin обычно указывается относительно корня дерева документов Web-сервера, а не корневого каталога файловой системы. Например, если корнем является каталог /home/httpd/html/, то файл сценария будет иметь маршрутное имя /home/httpd/html/cgi-bin/registrar.cgi, которое в запросе клиента будет указано как /cgi-bin/registrar.cgi. В первом приближении текст сценария может выглядеть следующим образом.
#! /usr/bin/perl print "Content-type:text/html\n\n"; $method = $ENV{'REQUEST_METHOD'}; if ($method eq "GET") { $form_data = $ENV{'QUERY_STRING'}; } else { read (STDIN, $form_data, $ENV{'CONTENT_LENGTH'}); } $form_data =~ s/%(..)/pack ("C", hex ($1))/eg; $form_data =~ tr/+/ /; @pairs = split (/&/, $form_data); foreach $pair (@pairs) { ($name, $value)=split(/=/,$pair); $FORM{$name}=$value; } #Проверка заполнения обязательных полей if (!$FORM{'regname'} || !$FORM{'password1'}) { print <<goback <html> <head><title>Неполные данные</title></head> <body><h2>Извините, Вы пропустили обязательные данные</h2> <br> Попробуйте еще раз, пожалуйста. </body></html> goback ;} #Проверка правильности ввода пароля elsif ($FORM{'password1'} eq $FORM{'password2'}) { print <<confirmation <html> <head><title>Поздравляем!</title></head> <body><h2>Поздравляем!</h2><br> Ваша регистрация прошл успешно. Вы можете пользоваться нашей библиотекой. Спасибо за внимание. </body></html> confirmation ;} else { print <<new_form <html><head><title>Ошибка при вводе пароля</title></head> <body><h3>Введенные Вами значения пароля не совпадают</h3> <br><form method="get" action="/cgi-bin/registrar.cgi"> <pre> Введите пароль: <input type="password" name="password1"> Подтвердите пароль: <input type="password" name="password2"> </pre> new_form ; foreach $key (keys %FORM) { if ($key ne "password1" && $key ne "password2") { print "<input type=\"hidden\" name=$key value=$FORM{$key}>\n"; } } print <<EndOfHTML <br><br> <input type="submit" value="OK"> <input type="reset" value="Отменить"> </form></body></html> EndOfHTML ;}
После вывода строки заголовка осуществляется считывание переданной серверу информации в переменную $form_data. В зависимости от метода передачи, эта информация считывается из переменной среды QUERY_STRING (метод GET) или из стандартного ввода программы (метод POST).
Считанная информация декодируется и помещается в ассоциативный массив %FORM.
Отсутствие обязательных данных - регистрационного имени и пароля - проверяется помощью условия
if (!$FORM{'regname '} || !$FORM{'password1' } ) .
В случае отсутствия необходимых данных формируется виртуальный HTML-документ, предлагающий повторить попытку, который и посылается клиенту (рисунок 1).
Рис.1. Ответ сервера в случае отсутствия обязательной информации
При выводе этого документа в операции print использована конструкция "документ здесь". Она позволяет использовать внутри себя символы, которые при заключении в обычные двойные кавычки необходимо маскировать символом "\", например, сами двойные кавычки, символы "@", "$", "%".
Условие
elsif ($FORM{'password1'} eq $FORM{'password2'})
Рис.2. Подтверждение регистрации
В противном случае формируется HTML-документ, предлагающий ввести пароль повторно (рисунок 3).
Рис.3. Повторное приглашение для ввода пароля
Этот новый документ содержит форму, в состав которой входят два видимых поля типа "password" - для ввода и подтверждения пароля, и скрытые поля типа "hidden" - для сохранения остальных данных, введенных при заполнении исходной формы. Каждое скрытое поле новой формы наследует у соответствующего поля исходной формы атрибуты name и value. Если эти данные не сохранить, то их придется вводить заново, принуждая пользователя повторно выполнять уже сделанную работу. Информация, сохраненная в скрытых полях, невидима пользователю и недоступна для изменения.
На следующем шаге мы продолжим изучение этого вопроса.