Учебники

Веб-программирование на C ++

Common Gateway Interface, или CGI, представляет собой набор стандартов, определяющих, как происходит обмен информацией между веб-сервером и пользовательским сценарием.

Спецификации CGI в настоящее время поддерживаются NCSA, и NCSA определяет CGI следующим образом:

Common Gateway Interface, или CGI, является стандартом для внешних программ-шлюзов для взаимодействия с информационными серверами, такими как HTTP-серверы.

Текущая версия — CGI / 1.1, а CGI / 1.2 находится в стадии разработки.

Чтобы понять концепцию CGI, давайте посмотрим, что происходит, когда мы нажимаем гиперссылку для просмотра определенной веб-страницы или URL-адреса.

  • Ваш браузер связывается с веб-сервером HTTP и запрашивает URL, т.е. имя файла.

  • Веб-сервер проанализирует URL-адрес и найдет имя файла. Если он находит запрошенный файл, веб-сервер отправляет этот файл обратно в браузер, в противном случае отправляет сообщение об ошибке, указывающее, что вы запросили неправильный файл.

  • Веб-браузер принимает ответ от веб-сервера и отображает полученный файл или сообщение об ошибке на основе полученного ответа.

Ваш браузер связывается с веб-сервером HTTP и запрашивает URL, т.е. имя файла.

Веб-сервер проанализирует URL-адрес и найдет имя файла. Если он находит запрошенный файл, веб-сервер отправляет этот файл обратно в браузер, в противном случае отправляет сообщение об ошибке, указывающее, что вы запросили неправильный файл.

Веб-браузер принимает ответ от веб-сервера и отображает полученный файл или сообщение об ошибке на основе полученного ответа.

Однако можно настроить HTTP-сервер таким образом, чтобы всякий раз, когда запрашивается файл в определенном каталоге, этот файл не отправляется обратно; вместо этого он выполняется как программа, и полученный вывод из программы отправляется обратно в ваш браузер для отображения.

Common Gateway Interface (CGI) — это стандартный протокол, позволяющий приложениям (называемым CGI-программами или CGI-скриптами) взаимодействовать с веб-серверами и клиентами. Эти CGI-программы могут быть написаны на Python, PERL, Shell, C или C ++ и т. Д.

Диаграмма архитектуры CGI

Следующая простая программа показывает простую архитектуру CGI —

CGI Архитектура

Конфигурация веб-сервера

Прежде чем приступить к программированию CGI, убедитесь, что ваш веб-сервер поддерживает CGI и настроен на обработку программ CGI. Все программы CGI, которые должны выполняться сервером HTTP, хранятся в предварительно настроенном каталоге. Этот каталог называется CGI-каталогом и по соглашению называется / var / www / cgi-bin. По соглашению CGI-файлы будут иметь расширение .cgi , хотя они исполняемые C ++.

По умолчанию веб-сервер Apache настроен для запуска программ CGI в / var / www / cgi-bin. Если вы хотите указать любой другой каталог для запуска ваших CGI-скриптов, вы можете изменить следующий раздел в файле httpd.conf —

<Directory "/var/www/cgi-bin">
   AllowOverride None
   Options ExecCGI
   Order allow,deny
   Allow from all
</Directory>
 
<Directory "/var/www/cgi-bin">
   Options All
</Directory>

Здесь я предполагаю, что у вас есть веб-сервер, запущенный и работающий успешно, и вы можете запустить любую другую программу CGI, такую ​​как Perl или Shell и т. Д.

Первая программа CGI

Рассмотрим следующее содержание программы на C ++ —

#include <iostream>
using namespace std;

int main () {
   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>Hello World - First CGI Program</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";
   cout << "<h2>Hello World! This is my first CGI program</h2>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

Скомпилируйте приведенный выше код и назовите исполняемый файл как cplusplus.cgi. Этот файл хранится в каталоге / var / www / cgi-bin и имеет следующий контент. Перед запуском программы CGI убедитесь, что у вас есть режим изменения файла, используя команду UNIX chmod 755 cplusplus.cgi, чтобы сделать файл исполняемым.

Моя первая CGI программа

Вышеприведенная программа на C ++ представляет собой простую программу, которая записывает свои выходные данные в файл STDOUT, т.е. на экран. Существует одна важная и дополнительная функция, которая заключается в печати первой строки Content-type: text / html \ r \ n \ r \ n . Эта строка отправляется обратно в браузер и указывает тип контента, который будет отображаться на экране браузера. Теперь вы, должно быть, поняли основную концепцию CGI и можете написать множество сложных CGI-программ на Python. Программа C ++ CGI может взаимодействовать с любой другой внешней системой, такой как СУБД, для обмена информацией.

Заголовок HTTP

Строка Content-type: text / html \ r \ n \ r \ n является частью заголовка HTTP, который отправляется браузеру для понимания содержимого. Весь заголовок HTTP будет в следующей форме —

HTTP Field Name: Field Content
 
For Example
Content-type: text/html\r\n\r\n

Есть несколько других важных заголовков HTTP, которые вы будете часто использовать в программировании CGI.

Sr.No Заголовок и описание
1

Тип содержимого:

Строка MIME, определяющая формат возвращаемого файла. Примером является Content-type: text / html.

2

Истекает: Дата

Дата, когда информация становится недействительной. Это должно использоваться браузером, чтобы решить, когда страница должна быть обновлена. Допустимая строка даты должна быть в формате 01 января 1998 12:00:00 по Гринвичу.

3

Расположение: URL

URL, который должен быть возвращен вместо запрошенного URL. Вы можете использовать это поле для перенаправления запроса в любой файл.

4

Последнее изменение: Дата

Дата последней модификации ресурса.

5

Длина содержимого: N

Длина в байтах возвращаемых данных. Браузер использует это значение, чтобы сообщить примерное время загрузки файла.

6

Набор Cookie: Строка

Установите cookie, пропущенный через строку .

Тип содержимого:

Строка MIME, определяющая формат возвращаемого файла. Примером является Content-type: text / html.

Истекает: Дата

Дата, когда информация становится недействительной. Это должно использоваться браузером, чтобы решить, когда страница должна быть обновлена. Допустимая строка даты должна быть в формате 01 января 1998 12:00:00 по Гринвичу.

Расположение: URL

URL, который должен быть возвращен вместо запрошенного URL. Вы можете использовать это поле для перенаправления запроса в любой файл.

Последнее изменение: Дата

Дата последней модификации ресурса.

Длина содержимого: N

Длина в байтах возвращаемых данных. Браузер использует это значение, чтобы сообщить примерное время загрузки файла.

Набор Cookie: Строка

Установите cookie, пропущенный через строку .

Переменные среды CGI

Все программы CGI будут иметь доступ к следующим переменным среды. Эти переменные играют важную роль при написании любой CGI-программы.

Sr.No Имя и описание переменной
1

ТИП СОДЕРЖИМОГО

Тип данных контента, используемый, когда клиент отправляет прикрепленный контент на сервер. Например, загрузка файла и т. Д.

2

CONTENT_LENGTH

Длина информации запроса, которая доступна только для запросов POST.

3

HTTP_COOKIE

Возвращает установленные куки в виде пары ключ-значение.

4

HTTP_USER_AGENT

Поле заголовка запроса User-Agent содержит информацию о пользовательском агенте, создавшем запрос. Это имя веб-браузера.

5

PATH_INFO

Путь для скрипта CGI.

6

СТРОКА ЗАПРОСА

Информация в кодировке URL, отправляемая с запросом метода GET.

7

REMOTE_ADDR

IP-адрес удаленного хоста, отправляющего запрос. Это может быть полезно для регистрации или для аутентификации.

8

УДАЛЕННЫЙ УЗЕЛ

Полное имя хоста, сделавшего запрос. Если эта информация недоступна, тогда REMOTE_ADDR может использоваться для получения IR-адреса.

9

REQUEST_METHOD

Метод, использованный для запроса. Наиболее распространенными методами являются GET и POST.

10

SCRIPT_FILENAME

Полный путь к скрипту CGI.

11

SCRIPT_NAME

Название скрипта CGI.

12

НАЗВАНИЕ СЕРВЕРА

Имя хоста или IP-адрес сервера.

13

SERVER_SOFTWARE

Название и версия программного обеспечения, на котором работает сервер.

ТИП СОДЕРЖИМОГО

Тип данных контента, используемый, когда клиент отправляет прикрепленный контент на сервер. Например, загрузка файла и т. Д.

CONTENT_LENGTH

Длина информации запроса, которая доступна только для запросов POST.

HTTP_COOKIE

Возвращает установленные куки в виде пары ключ-значение.

HTTP_USER_AGENT

Поле заголовка запроса User-Agent содержит информацию о пользовательском агенте, создавшем запрос. Это имя веб-браузера.

PATH_INFO

Путь для скрипта CGI.

СТРОКА ЗАПРОСА

Информация в кодировке URL, отправляемая с запросом метода GET.

REMOTE_ADDR

IP-адрес удаленного хоста, отправляющего запрос. Это может быть полезно для регистрации или для аутентификации.

УДАЛЕННЫЙ УЗЕЛ

Полное имя хоста, сделавшего запрос. Если эта информация недоступна, тогда REMOTE_ADDR может использоваться для получения IR-адреса.

REQUEST_METHOD

Метод, использованный для запроса. Наиболее распространенными методами являются GET и POST.

SCRIPT_FILENAME

Полный путь к скрипту CGI.

SCRIPT_NAME

Название скрипта CGI.

НАЗВАНИЕ СЕРВЕРА

Имя хоста или IP-адрес сервера.

SERVER_SOFTWARE

Название и версия программного обеспечения, на котором работает сервер.

Вот небольшая программа CGI, чтобы перечислить все переменные CGI.

#include <iostream>
#include <stdlib.h>
using namespace std;

const string ENV[ 24 ] = {
   "COMSPEC", "DOCUMENT_ROOT", "GATEWAY_INTERFACE",   
   "HTTP_ACCEPT", "HTTP_ACCEPT_ENCODING",             
   "HTTP_ACCEPT_LANGUAGE", "HTTP_CONNECTION",         
   "HTTP_HOST", "HTTP_USER_AGENT", "PATH",            
   "QUERY_STRING", "REMOTE_ADDR", "REMOTE_PORT",      
   "REQUEST_METHOD", "REQUEST_URI", "SCRIPT_FILENAME",
   "SCRIPT_NAME", "SERVER_ADDR", "SERVER_ADMIN",      
   "SERVER_NAME","SERVER_PORT","SERVER_PROTOCOL",     
   "SERVER_SIGNATURE","SERVER_SOFTWARE" };   

int main () {
   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>CGI Environment Variables</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";
   cout << "<table border = \"0\" cellspacing = \"2\">";

   for ( int i = 0; i < 24; i++ ) {
      cout << "<tr><td>" << ENV[ i ] << "</td><td>";
      
      // attempt to retrieve value of environment variable
      char *value = getenv( ENV[ i ].c_str() );  
      if ( value != 0 ) {
         cout << value;                                 
      } else {
         cout << "Environment variable does not exist.";
      }
      cout << "</td></tr>\n";
   }
   
   cout << "</table><\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

C ++ CGI Library

Для реальных примеров вам потребуется выполнить много операций в вашей CGI-программе. Существует библиотека CGI, написанная для программы C ++, которую вы можете скачать с ftp://ftp.gnu.org/gnu/cgicc/ и выполнить шаги по установке библиотеки —

$tar xzf cgicc-X.X.X.tar.gz 
$cd cgicc-X.X.X/ 
$./configure --prefix=/usr 
$make
$make install

Вы можете проверить соответствующую документацию, доступную на C ++ CGI Lib Documentation .

GET и POST методы

Вы, должно быть, сталкивались со многими ситуациями, когда вам нужно было передать некоторую информацию из вашего браузера на веб-сервер и, в конечном счете, в вашу программу CGI. Чаще всего браузер использует два метода для передачи этой информации на веб-сервер. Это методы GET и POST.

Передача информации с использованием метода GET

Метод GET отправляет закодированную информацию пользователя, добавленную к запросу страницы. Страница и закодированная информация разделены знаком? персонаж следующим образом —

http://www.test.com/cgi-bin/cpp.cgi?key1=value1&key2=value2

Метод GET является методом по умолчанию для передачи информации из браузера на веб-сервер, и он создает длинную строку, которая появляется в поле «Местоположение:» вашего браузера. Никогда не используйте метод GET, если у вас есть пароль или другая конфиденциальная информация для передачи на сервер. Метод GET имеет ограничение по размеру, и вы можете передать до 1024 символов в строке запроса.

При использовании метода GET информация передается с использованием http-заголовка QUERY_STRING и будет доступна в вашей программе CGI через переменную среды QUERY_STRING.

Вы можете передавать информацию, просто объединяя пары ключ-значение с любым URL-адресом или используя HTML-теги <FORM> для передачи информации, используя метод GET.

Пример простого URL: метод Get

Вот простой URL, который передаст два значения программе hello_get.py с помощью метода GET.

/cgi-bin/cpp_get.cgi?first_name=ZARA&last_name=ALI

Ниже приведена программа для создания CGI-программы cpp_get.cgi для обработки входных данных, данных веб-браузером. Мы собираемся использовать библиотеку C ++ CGI, которая упрощает доступ к передаваемой информации —

#include <iostream>
#include <vector>  
#include <string>  
#include <stdio.h>  
#include <stdlib.h> 

#include <cgicc/CgiDefs.h> 
#include <cgicc/Cgicc.h> 
#include <cgicc/HTTPHTMLHeader.h> 
#include <cgicc/HTMLClasses.h>  

using namespace std;
using namespace cgicc;

int main () {
   Cgicc formData;
   
   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>Using GET and POST Methods</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   form_iterator fi = formData.getElement("first_name");  
   if( !fi->isEmpty() && fi != (*formData).end()) {  
      cout << "First name: " << **fi << endl;  
   } else {
      cout << "No text entered for first name" << endl;  
   }
   
   cout << "<br/>\n";
   fi = formData.getElement("last_name");  
   if( !fi->isEmpty() &&fi != (*formData).end()) {  
      cout << "Last name: " << **fi << endl;  
   } else {
      cout << "No text entered for last name" << endl;  
   }
   
   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

Теперь скомпилируйте вышеуказанную программу следующим образом:

$g++ -o cpp_get.cgi cpp_get.cpp -lcgicc

Сгенерируйте cpp_get.cgi и поместите его в каталог CGI и попробуйте получить доступ по следующей ссылке —

/cgi-bin/cpp_get.cgi?first_name=ZARA&last_name=ALI

Это приведет к следующему результату —

First name: ZARA 
Last name: ALI 

Пример простой формы: метод GET

Вот простой пример, который передает два значения, используя HTML FORM и кнопку отправки. Мы будем использовать тот же сценарий CGI cpp_get.cgi для обработки этого ввода.

<form action = "/cgi-bin/cpp_get.cgi" method = "get">
   First Name: <input type = "text" name = "first_name">  <br />
 
   Last Name: <input type = "text" name = "last_name" />
   <input type = "submit" value = "Submit" />
</form>

Вот фактический результат вышеприведенной формы. Вы вводите имя и фамилию, а затем нажимаете кнопку «Отправить», чтобы увидеть результат.

Имя: Фамилия:

Передача информации с использованием метода POST

Обычно более надежным методом передачи информации в CGI-программу является метод POST. Это упаковывает информацию точно так же, как методы GET, но вместо отправки ее в виде текстовой строки после символа? в URL он отправляет его как отдельное сообщение. Это сообщение поступает в CGI-скрипт в виде стандартного ввода.

Та же самая программа cpp_get.cgi также будет обрабатывать метод POST. Давайте возьмем тот же пример, что и выше, который передает два значения, используя HTML FORM и кнопку submit, но на этот раз с методом POST следующим образом:

<form action = "/cgi-bin/cpp_get.cgi" method = "post">
   First Name: <input type = "text" name = "first_name"><br />
   Last Name: <input type = "text" name = "last_name" />
 
   <input type = "submit" value = "Submit" />
</form>

Вот фактический результат вышеприведенной формы. Вы вводите имя и фамилию, а затем нажимаете кнопку «Отправить», чтобы увидеть результат.

Имя: Фамилия:

Передача данных флажка в программу CGI

Флажки используются, когда требуется выбрать более одной опции.

Вот пример HTML-кода для формы с двумя флажками —

<form action = "/cgi-bin/cpp_checkbox.cgi" method = "POST" target = "_blank">
   <input type = "checkbox" name = "maths" value = "on" /> Maths
   <input type = "checkbox" name = "physics" value = "on" /> Physics
   <input type = "submit" value = "Select Subject" />
</form>

Результатом этого кода является следующая форма —

математика физика

Ниже приведена программа на C ++, которая сгенерирует скрипт cpp_checkbox.cgi для обработки входных данных, данных веб-браузером с помощью кнопки-флажка.

#include <iostream>
#include <vector>  
#include <string>  
#include <stdio.h>  
#include <stdlib.h> 

#include <cgicc/CgiDefs.h> 
#include <cgicc/Cgicc.h> 
#include <cgicc/HTTPHTMLHeader.h> 
#include <cgicc/HTMLClasses.h> 

using namespace std;
using namespace cgicc;

int main () {
   Cgicc formData;
   bool maths_flag, physics_flag;

   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>Checkbox Data to CGI</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   maths_flag = formData.queryCheckbox("maths");
   if( maths_flag ) {  
      cout << "Maths Flag: ON " << endl;  
   } else {
      cout << "Maths Flag: OFF " << endl;  
   }
   cout << "<br/>\n";

   physics_flag = formData.queryCheckbox("physics");
   if( physics_flag ) {  
      cout << "Physics Flag: ON " << endl;  
   } else {
      cout << "Physics Flag: OFF " << endl;  
   }
   
   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

Передача данных переключателей в программу CGI

Радиокнопки используются, когда требуется выбрать только одну опцию.

Вот пример HTML-кода для формы с двумя переключателями —

<form action = "/cgi-bin/cpp_radiobutton.cgi" method = "post" target = "_blank">
   <input type = "radio" name = "subject" value = "maths" checked = "checked"/> Maths 
   <input type = "radio" name = "subject" value = "physics" /> Physics
   <input type = "submit" value = "Select Subject" />
</form>

Результатом этого кода является следующая форма —

математика физика

Ниже приведена программа на C ++, которая сгенерирует скрипт cpp_radiobutton.cgi для обработки ввода, передаваемого веб-браузером через переключатели.

#include <iostream>
#include <vector>  
#include <string>  
#include <stdio.h>  
#include <stdlib.h> 

#include <cgicc/CgiDefs.h> 
#include <cgicc/Cgicc.h> 
#include <cgicc/HTTPHTMLHeader.h> 
#include <cgicc/HTMLClasses.h> 

using namespace std;
using namespace cgicc;

int main () {
   Cgicc formData;
  
   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>Radio Button Data to CGI</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   form_iterator fi = formData.getElement("subject");  
   if( !fi->isEmpty() && fi != (*formData).end()) {  
      cout << "Radio box selected: " << **fi << endl;  
   }
  
   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

Передача данных текстовой области в программу CGI

Элемент TEXTAREA используется, когда многострочный текст должен быть передан в программу CGI.

Вот пример HTML-кода для формы с полем TEXTAREA —

<form action = "/cgi-bin/cpp_textarea.cgi" method = "post" target = "_blank">
   <textarea name = "textcontent" cols = "40" rows = "4">
      Type your text here...
   </textarea>
   <input type = "submit" value = "Submit" />
</form>

Результатом этого кода является следующая форма —

Ниже приведена программа на C ++, которая сгенерирует скрипт cpp_textarea.cgi для обработки ввода, получаемого веб-браузером через текстовую область.

#include <iostream>
#include <vector>  
#include <string>  
#include <stdio.h>  
#include <stdlib.h> 

#include <cgicc/CgiDefs.h> 
#include <cgicc/Cgicc.h> 
#include <cgicc/HTTPHTMLHeader.h> 
#include <cgicc/HTMLClasses.h> 

using namespace std;
using namespace cgicc;

int main () {
   Cgicc formData;
  
   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>Text Area Data to CGI</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   form_iterator fi = formData.getElement("textcontent");  
   if( !fi->isEmpty() && fi != (*formData).end()) {  
      cout << "Text Content: " << **fi << endl;  
   } else {
      cout << "No text entered" << endl;  
   }
  
   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

Передача выпадающих данных в программу CGI

Выпадающий список используется, когда у нас есть много доступных вариантов, но будет выбран только один или два.

Вот пример HTML-кода для формы с одним выпадающим списком —

<form action = "/cgi-bin/cpp_dropdown.cgi" method = "post" target = "_blank">
   <select name = "dropdown">
      <option value = "Maths" selected>Maths</option>
      <option value = "Physics">Physics</option>
   </select>
   
   <input type = "submit" value = "Submit"/>
</form>

Результатом этого кода является следующая форма —

Ниже приведена программа на C ++, которая сгенерирует скрипт cpp_dropdown.cgi для обработки входных данных, предоставленных веб-браузером через раскрывающийся список.

#include <iostream>
#include <vector>  
#include <string>  
#include <stdio.h>  
#include <stdlib.h> 

#include <cgicc/CgiDefs.h> 
#include <cgicc/Cgicc.h> 
#include <cgicc/HTTPHTMLHeader.h> 
#include <cgicc/HTMLClasses.h> 

using namespace std;
using namespace cgicc;

int main () {
   Cgicc formData;
  
   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>Drop Down Box Data to CGI</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   form_iterator fi = formData.getElement("dropdown");  
   if( !fi->isEmpty() && fi != (*formData).end()) {  
      cout << "Value Selected: " << **fi << endl;  
   }
  
   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

Использование Cookies в CGI

Протокол HTTP — это протокол без сохранения состояния. Но для коммерческого веб-сайта требуется поддерживать информацию о сеансе на разных страницах. Например, регистрация одного пользователя заканчивается после заполнения многих страниц. Но как сохранить информацию о сеансе пользователя на всех веб-страницах.

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

Как это устроено

Ваш сервер отправляет некоторые данные в браузер посетителя в виде файла cookie. Браузер может принять куки. Если это так, он сохраняется в виде простой текстовой записи на жестком диске посетителя. Теперь, когда посетитель заходит на другую страницу вашего сайта, файл cookie становится доступным для поиска. После получения ваш сервер знает / запоминает, что было сохранено.

Cookies — это запись данных в виде простого текста из 5 полей переменной длины —

  • Истекает — показывает дату истечения срока действия куки. Если это поле пустое, срок действия файла cookie истечет, когда посетитель выйдет из браузера.

  • Домен — показывает доменное имя вашего сайта.

  • Путь — показывает путь к каталогу или веб-странице, на которой установлен файл cookie. Это может быть пустым, если вы хотите получить куки из любого каталога или страницы.

  • Безопасный — если в этом поле содержится слово «безопасный», тогда cookie может быть получен только с безопасного сервера. Если это поле пустое, такого ограничения не существует.

  • Имя = значение — файлы cookie устанавливаются и извлекаются в форме пар ключ-значение.

Истекает — показывает дату истечения срока действия куки. Если это поле пустое, срок действия файла cookie истечет, когда посетитель выйдет из браузера.

Домен — показывает доменное имя вашего сайта.

Путь — показывает путь к каталогу или веб-странице, на которой установлен файл cookie. Это может быть пустым, если вы хотите получить куки из любого каталога или страницы.

Безопасный — если в этом поле содержится слово «безопасный», тогда cookie может быть получен только с безопасного сервера. Если это поле пустое, такого ограничения не существует.

Имя = значение — файлы cookie устанавливаются и извлекаются в форме пар ключ-значение.

Настройка Cookies

Отправить куки в браузер очень просто. Эти файлы cookie будут отправлены вместе с заголовком HTTP до того, как будет заполнен тип контента. Предполагая, что вы хотите установить идентификатор пользователя и пароль в качестве файлов cookie. Таким образом, настройка куки будет выполнена следующим образом

#include <iostream>
using namespace std;

int main () {
   cout << "Set-Cookie:UserID = XYZ;\r\n";
   cout << "Set-Cookie:Password = XYZ123;\r\n";
   cout << "Set-Cookie:Domain = www.tutorialspoint.com;\r\n";
   cout << "Set-Cookie:Path = /perl;\n";
   cout << "Content-type:text/html\r\n\r\n";

   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>Cookies in CGI</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   cout << "Setting cookies" << endl;  
  
   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

Из этого примера вы должны понимать, как устанавливать файлы cookie. Мы используем HTTP-заголовок Set-Cookie для установки файлов cookie.

Здесь необязательно устанавливать атрибуты cookie, такие как Expires, Domain и Path. Примечательно, что куки устанавливаются перед отправкой волшебной строки «Content-type: text / html \ r \ n \ r \ n .

Скомпилируйте вышеуказанную программу для создания setcookies.cgi и попробуйте установить куки, используя следующую ссылку. Он установит четыре куки на вашем компьютере —

/cgi-bin/setcookies.cgi

Получение куки

Легко получить все установленные куки. Файлы cookie хранятся в переменной среды CGI HTTP_COOKIE и имеют следующую форму.

key1 = value1; key2 = value2; key3 = value3....

Вот пример того, как получить куки.

#include <iostream>
#include <vector>  
#include <string>  
#include <stdio.h>  
#include <stdlib.h> 

#include <cgicc/CgiDefs.h> 
#include <cgicc/Cgicc.h> 
#include <cgicc/HTTPHTMLHeader.h> 
#include <cgicc/HTMLClasses.h>

using namespace std;
using namespace cgicc;

int main () {
   Cgicc cgi;
   const_cookie_iterator cci;

   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>Cookies in CGI</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";
   cout << "<table border = \"0\" cellspacing = \"2\">";
   
   // get environment variables
   const CgiEnvironment& env = cgi.getEnvironment();

   for( cci = env.getCookieList().begin();
   cci != env.getCookieList().end(); 
   ++cci ) {
      cout << "<tr><td>" << cci->getName() << "</td><td>";
      cout << cci->getValue();                                 
      cout << "</td></tr>\n";
   }
   
   cout << "</table><\n";
   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

Теперь скомпилируйте вышеуказанную программу для создания getcookies.cgi и попробуйте получить список всех файлов cookie, доступных на вашем компьютере —

/cgi-bin/getcookies.cgi

Это создаст список всех четырех файлов cookie, установленных в предыдущем разделе, и всех других файлов cookie, установленных на вашем компьютере —

UserID XYZ 
Password XYZ123 
Domain www.tutorialspoint.com 
Path /perl 

Пример загрузки файла

Для загрузки файла в HTML-форме атрибут enctype должен иметь значение multipart / form-data . Тег ввода с типом файла создаст кнопку «Обзор».

<html>
   <body>
      <form enctype = "multipart/form-data" action = "/cgi-bin/cpp_uploadfile.cgi"
         method = "post">
         <p>File: <input type = "file" name = "userfile" /></p>
         <p><input type = "submit" value = "Upload" /></p>
      </form>
   </body>
</html>

Результатом этого кода является следующая форма —

Файл:

Файл:

Примечание. Приведенный выше пример был намеренно отключен, чтобы люди не могли загружать файлы на наш сервер. Но вы можете попробовать приведенный выше код на вашем сервере.

Вот скрипт cpp_uploadfile.cpp для обработки загрузки файла:

#include <iostream>
#include <vector>  
#include <string>  
#include <stdio.h>  
#include <stdlib.h> 

#include <cgicc/CgiDefs.h> 
#include <cgicc/Cgicc.h> 
#include <cgicc/HTTPHTMLHeader.h> 
#include <cgicc/HTMLClasses.h>

using namespace std;
using namespace cgicc;

int main () {
   Cgicc cgi;

   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>File Upload in CGI</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   // get list of files to be uploaded
   const_file_iterator file = cgi.getFile("userfile");
   if(file != cgi.getFiles().end()) {
      // send data type at cout.
      cout << HTTPContentHeader(file->getDataType());
      // write content at cout.
      file->writeToStream(cout);
   }
   cout << "<File uploaded successfully>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

Приведенный выше пример предназначен для записи содержимого в потоке cout, но вы можете открыть свой файловый поток и сохранить содержимое загруженного файла в файл в нужном месте.

Надеюсь, вам понравился этот урок. Если да, пожалуйста, отправьте нам свой отзыв.