КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Листинг 7.8. Файл chapter7/AgainCGI/Again. c
// Розширення CGI, призначене для // роботи з cookie // // (С) Фролов А.В., 1998 // E-mail: frolov@glas.apc.org // WWW: http://www.glasnet.ru/~frolov // або // http://www.dials.ccas.ru/frolov #include <windows.h> #include <stdio.h> #include <stdlib.h> #include <string.h>
// Прототипи функцій, визначених у нашій програмі char *findCookie(char * szName); void insertHTML(char * pszFileName, char * pszBuf); void main(int argc, char *argv[]) { char * pszQueryString; char * pszCookie; char * pszMyCookie; int nCount; char szBuf[4096]; char szBuf1[20]; // Заголовок для додавання cookie char szCookieHeader[] = "Set-Cookie:AgainCount=0;\r\nContent-type: text/html\r\n\r\n"; // Заголовок для видалення cookie char szCookieRemoveHeader[] = "Set-Cookie:AgainCount=0;expires=Mon оЗ-Мау-1993 12:00:00 GMT;" "\r\nContent-type:text/html;\r\n\r\n"; // Одержуємо параметр запуску CGI pszQueryString = getenv("QUERY_STRING"); // Одержуємо рядок Cookie із заголовка HTTP pszCookie = getenv("HTTP_COOKIE"); // Провідини сторінки if(!strcmp(pszQueryString, "go")) { // Якщо cookie не виявлений, створюємо його if(pszCookie == NULL) { // Выводим заголовок для створення cookie printf("Content-type:text/html\r\n"); printf(szCookieHeader); // Виводимо запрошення для перших провідин printf ("<HTML><HEAD><TITLE>Cookie demo</ТITLE></HEAD><BODY>"); printf("<H2>Welcome to our page!</H2>"); } else { // Одержуємо значення параметра cookie // с ім'ям AgainCount pszMyCookie = findCookie("AgainCount"); if(pszMyCookie! = NULL) { // Перетворюємо це значення в число і збільшуємо // на одиницю при кожних провідинах nCount = atoi(pszMyCookie); nCount++; sprintf(szBufl, "%d", nCount); // Выводим заголовок для відновлення cookie printf("Content-type: text/html\r\n"); strcpy(szBuf, "Set-Cookie: AgainCount="); strcat(szBuf, szBuf1); strcat(szBuf, ";\r\nContent-type: text/html\r\n\r\n"); printf(szBuf); // Виводимо запрошення для повторних провідин printf("<H2>Welcome to our page AGAIN!</H2>"); // Выводим лічильник провідин printf("<P>Access count: %s",szBufl); // Вставляємо документ HTML із текстом сценарію // JavaScript, що теж працює з cookie insertHTML("script.ht", szBuf); printf(szBuf); } } // Видалення cookie else if(!strcmp(pszQueryString, "clear")) { // Выводим заголовок для видалення cookie printf("Content-type: text/html\r\n"); printf(szCookieRemoveHeader); // Виводимо повідомлення про успішне видалення cookie printf ("<HTML><HEAD><TITLE>Cookie demo</TITLE></HEAD><BODY>"); printf("<P>Cookie Removed");
} printf("</BODY></HTML>"); } // findCookie // Одержання значення параметра cookie по його // імені char *findCookie(char * szName) { char * pszCookie; char * pszBegin; char * pszEnd; char szBuf[4096]; // Одержуємо текстовий рядок cookie pszCookie = getenv("HTTP_COOKIE"); if(pszCookie!= NULL) { // Копіюємо її в робочий буфер strcpy(szBuf, pszCookie); // Шукаємо в рядку ім'я параметра pszBegin = strstr(szBuf, szName); if(pszBegin == NULL) return NULL; else { // Пропускаємо символ рівності pszBegin += strlen(szName) + 1; // Шукаємо символ "точка з запятой" і заміняємо його на // двоичный нуль pszEnd = strstr(pszBegin, ";"); if(pszEnd!= NULL) *pszEnd = 0; // Повертаємо значення параметра return pszBegin; } } } // insertHTML // Вставка в буфер умісту текстового файла void insertHTML(char * pszFileName, char * pszBuf) { HFILE hSrcFile; DWORD dwFileSize; // Открываем файл hSrcFile = _lopen(pszFileName, OF_READ); // Визначаємо його довжину dwFileSize = _llseek(hSrcFile, 0, 2); // Встановлюємо покажчик на початок файла _llseek(hSrcFile, 0, 0); // Читаємо файл у буфер _hread(hSrcFile, pszBuf, dwFileSize); // Закриваємо буфер двоичным нулем pszBuf[dwFileSize] = '\0'; // Закриваємо файл _lclose(hSrcFile);
У перемінної szCookieHeader підготовлений заголовок Set-Cookie, призначений для створення параметра cookie з ім'ям AgainCount:
char szCookieHeader [] = "Set-Cookie: AgainCount=0;\r\nContent-type: text/htnil\r\n\r\n";
Початкове значення цього параметра дорівнює нулю. Заголовок, що зберігається в перемінної szCookieRemoveHeader, призначений для видалення cookie:
chаг szCookieRemoveHeader [] = "Set-Cookie: AgainCount=0; expires=Mon оЗ-Мау-1993 12:00:00 GMT; \r\nContent-type: text/html;\r\n\r\n";
Ефект видалення досягається завдяки тому, що в параметрі expires зазначена дата, що вже наступила. Відразу після запуску програма CGI одержує значення переменных середовища QUERY_STRING і НТТР_СООКIЕ:
pszQueryString = getenv("QUERY_STRING"); pszCookie = getenv("HTTP_COOKIE");
У перший із них зберігається параметр запуску програми CGI, а в другий - рядок cookie (якщо вона визначена). Далі програма аналізує параметр запуску. Якщо програма викликана з параметром go, вона перевіряє перемінну pszCookie. У цю переменную функція getenv записує рядок cookie або значення NULL, якщо cookie не визначено. При перших провідинах cookie ще немає, тому програма добавляють до заголовка HTTP формованого документа заголовок Set-Cookie:
printf ("Content-type: text/html\r\n"); printf(szCookieHeader);
Потім програма виводить запрошення для перших провідин і завершує свою роботу. У тому випадку, якщо в прийнятому запиті вже є інформація про cookie, програма CGI витягає значення параметра cookie з ім'ям AgainCount, викликаючи для цього функцію findCookie:
pszMyCookie = findCookie("AgainCount");
Ця функція визначена в нашій програмі і буде описана трохи пізніше. Отриманий рядок преобразовывается в чисельне значення за допомогою функції atoi, після чого це значення збільшується на одиницю, преобразовывается обернено в тестовий рядок і записується в буфер szBuf1:
nCount = atoi(pszMyCookie); nCount++; sprintf(szBuf1, "%d", nCount);
На такому етапі програма формує заголовок Set-Cookie із новим значенням параметра AgainCount:
printf("Content-type: text/html\r\n"); strcpy(szBuf, "Set-Cookie: AgainCount="); strcat(szBuf, szBuf1); strcat(szBuf, ";\r\nContent-type: text/html\r\n\r\n"); printf(szBuf);
Цей заголовок разом із заголовком Content-type записується в утворюваний документ HTML. Далі після висновка запрошення для повторних провідин сторінки програма CGI записує в документ нове значення лічильника провідин:
printf("<P>Access count: %s",szBuf1);
І, нарешті, перед завершенням своєї роботи програма вставляє в текст документа HTML файл із сценарієм JavaScript, викликаючи для цього функцію insertHTML:
insertHTML("script. ht", szBuf); Ця функція визначена в програмі, як і функція findCookie. Коли програма CGI визивається для видалення cookie із параметром clear, вона виводить спеціально призначений для цього заголовок із простроченою датою: Тепер коротко розповімо про роботу функції findCookie. Отримавши текстовий рядок cookie за допомогою функції getenv, ця функція копіює рядок у робочий буфер, що можна редагувати (нагадаємо, що вміст буфера, отриманого від функції getenv, змінювати не можна). Далі, викликом функції strstr виконується пошук у робочому буфері імені потрібного параметра cookie. Якщо це ім'я знайдене, те пропускається символ рівності і виконується пошук символу роздільника ';' і він заміняється на двоичный нуль. Після виконання всіх цих дій функція повертає адресу шуканого рядка зі значенням потрібного параметра cookie. Функція insertHTML просто відчиняє файл, ім'я якого передається в якості параметра, читає його вміст в оперативну пам'ять і потім у буфер, адреса якого передається через другий параметр. Текст сценарію, що уставляється функцією insertHTML у динамічно формований документ HTML, поданий у листинге 7.9.
Дата добавления: 2014-11-29; Просмотров: 371; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |