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, которые должны выполняться сервером 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 и попробуйте установить куки, используя следующую ссылку. Он установит четыре куки на вашем компьютере —
Получение куки
Легко получить все установленные куки. Файлы 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, доступных на вашем компьютере —
Это создаст список всех четырех файлов 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, но вы можете открыть свой файловый поток и сохранить содержимое загруженного файла в файл в нужном месте.
Надеюсь, вам понравился этот урок. Если да, пожалуйста, отправьте нам свой отзыв.