| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > CGI Headers |
| Автор: GarryFV 11.10.2002, 23:44 |
| При выводе на С нескольких Header-ов первый корректно обрабатывается сервером, а остальные понимаются просто как текст. Краткий пример: #include <stdio.h> #include <fcntl.h> #include <io.h> #define header(STR) printf(STR); printf("%c%c",10,10); #define br printf("<br>") void main(void){ _setmode( _fileno( stdout ), _O_BINARY ); header("Server: NETstat/Forwarder/1.0 build: Jan 30 2001 00 header("Connection: Close"); } При просмотре из браузера видим: Connection: Close Тот же самый код на PHP, естественно, не выводит ничего, т.к. сервером обрабатываются оба Header-a. Может знает кто в чем дело? А может кто-нибудь еще и ответит Заранее спасибо. |
| Автор: Mike Kostyuhin 12.10.2002, 00:19 |
| #define header(STR) printf("%s\r\n", STR); #define br printf("<br>") void main(void){ _setmode( _fileno( stdout ), _O_BINARY ); header("Server: NETstat/Forwarder/1.0 build: Jan 30 2001 0001"); header("Connection: Close"); } |
| Автор: GarryFV 12.10.2002, 02:18 |
| Ни фига!! Internal Server Error Так сервак вообще не воспринимает это как ответ cgi скрипта В доке сказано - после header-a обязательно должна быть пустая строка |
| Автор: Fantasist 12.10.2002, 05:25 |
| А #define header(STR) printf(STR); printf("%c%c",13,13); ? или #define header(STR) printf(STR); printf("%c%c",13,10); ? или #define header(STR) printf(STR); printf("%c%c%c%c",13,10,13,10); ? |
| Автор: GarryFV 12.10.2002, 22:17 |
| Да не работает! Первые 2 примера - просто ошибка исполнения скрипта: 500 Internal Server Error т.к. после Headera обязательно должна быть еще одна пустая строка (а два CR(13) это просто "возврат каретки"). А когда есть пустая строка, то, как я говорил, обрабатывается только первый header. Ну кто писал cgi на с, отзовитесь! Или все на PHP, Perl-e и т.д. колбасят? :) Ну ведь, очевидно, настолько простая вещь, что даже в мануалах не описана. Или может какую настройку для Apache надо изменить? Такая хрень и весь проект тормозит!!! Помогите, братья программеры!!! :) |
| Автор: Fantasist 13.10.2002, 00:59 |
| Хм, вроде было наоборот - 13 - перенос строки 10 - возврат каретки. Или что, я всю жизнь ошибался? Вообще-то я не знаю откуда два хеадера. За всю свой небольшой опыт по HTTP, загаловок там всегда один. А зачем несколько загаловков? |
| Автор: GarryFV 13.10.2002, 01:20 |
| Выходит, ошибался :) Зачем два Header-a? А если надо передать и "Server:..." и "Connection:..." и еще cookie записать "Set-Cookie:..."? То что делать? Вот PHP код - как это должно быть на C? header("Server: NETstat/Forwarder/1.0 build: Jan 30 2001 00:00:01"); header("Connection: Close"); header("Set-Cookie: netstat_ct=$sql_ClientId;expires=Fri, 30-Jan-2004 00:00:01 GMT;path=/;domain=.netstat.by"); header('P3P: policyref="/w3c/p3p.xml", CP="NON DSP COR CUR ADM DEV PSA PSD OUR UNR BUS UNI COM NAV INT DEM STA"'); header("Cache-Control: no-cache, must-revalidate"); header("Pragma: no-cache"); P.S. А я CGI первый раз программлю - друг подкинул работенку - небольшой модулек с PHP на С перевести. Типа за пару дней один к одному переписать? ВОт неделю уже трахаюсь, т.к. там оказалась и работа с БД MySQL и создание картинок "на лету" и т.д., блин ;). Так все остальное дерьмо победил, а какие-то долбаные Header-ы не пашут, аж обидно!!!! |
| Автор: Fantasist 13.10.2002, 02:00 |
| Хе! Так это-же один хеадер так тебя за ногу! |
| Автор: Fantasist 13.10.2002, 02:13 | ||
Вот это я получил с сервера forum.vingrad.ru.
Первый абзац - загаловок, второй - текст. И не могло быть по другому, потому как если ставить после каждой строчки пустую строку, то как тогда узнать что загаловок кончился. Ты просто так хитро вопрос поставил CGI headers, что я долго тормозил, не понимая о чем ты говоришь. |
| Автор: GarryFV 13.10.2002, 02:22 |
| Да, наверное так!!! Я уже и сам стал думать, что этот чертов PHP интерпретатор все Header-ы в один объединяет, а потом выводит. Только опять же, а мне как их разделять? Через ';' ? printf("Server: NETstat/Forwarder/1.0 build: Jan 30 2001 00:00:01; Connection: Close; Set-Cookie: cookiethree=89\n\n"); Вот в этом случае, например, не записываются cookie :( А если переставляю printf("Set-Cookie: cookiethree=89; Server: NETstat/Forwarder/1.0 build: Jan 30 2001 00:00:01; Connection: Close\n\n"); то cookie записываются, но тогда у меня подозрение, что просто отрабатывает опять же только первый Header, а остальные хрен его знает... |
| Автор: GarryFV 13.10.2002, 02:31 |
| Тьфу ты, бл#!!! Наконец то дошло!!! После каждого Header-a(т.е. одной строки Header-a) надо "\n", т.е. 10 А после последней строки "\n\n", и все работает!!! Через define-ы тут не сделаешь... Ну спасибо тебе, добрый фей, если б рядом жили - пиво однозначно А так только удовлетворение, что помог человеку |
| Автор: GarryFV 13.10.2002, 02:33 |
| P.S. Извиняюсь за жуткое ламерство, просто как говорил, первый раз пишу по надобности. Ни фига в этом вопросе не шарил |
| Автор: Fantasist 13.10.2002, 04:37 | ||||
Ну, слава богу.
Так все и учимся. |
| Автор: GarryFV 13.10.2002, 05:27 |
| Учение - жизнь! Неучение - смерть. Как только перестал что-то постигать, считай - помер |
| Автор: Vaulter 14.1.2003, 15:38 |
| ALL. полазил по сайтам - ненашел нормальных доков по CGI в С++ как начать? хочу =)) |
| Автор: Fantasist 15.1.2003, 01:02 |
| Да там знать ничего не надо. CGI - это обычная консольная программа. Знать надо начала HTTP, а по нему информации достадочно. А общем случае это так: 1. Браузер посылает обычный запрос к серверу HTTP, запрашивая документ, который ты его попросил.Браузеру пофиг что это за документ - ты тыкаешь ссылку - браузер формирует запрос и посылает 2. Сервер смотрит, что запрашиваемый документ лежит в папке, которая определена как папка с CGI, и он запускает этот файл на исполнение, а стандартные входные и выходные потоки, перенаправляет в сетевое подключение. То есть когда ты в С++ пишишь: cout<<"текст", то в консольном приложении это выводиться на консоль (экран), а в случае CGI - этот текст получит браузер, как ответ. |
| Автор: Vaulter 15.1.2003, 11:00 |
| Fantasist это я уж понял =) я искал инфу по хеадерам. |
| Автор: Vaulter 15.1.2003, 13:07 |
| ну вот. начал млин код: #include <iostream.h> void main() { cout<<"Content-Type: text/html \n\n"; cout<<"<html><head><title>sample</title>\n"; cout<<"<meta http-equiv=\"Content-Type\" content=\"text/html;charset=windows-1251\">\n>"; cout<<"</head><body>Sample</body></html>"; } компилиться лишь с флагом _CONSOLE в VC++ далее закидываю на h1.ru (а куда еще?) ставлю аттрибуты 755. http://www.vaulter.h1.ru/cgi-bin/script.cgi пробуйте млин |
| Автор: Fantasist 15.1.2003, 14:39 |
| Ну, у тебя должен на провайдере где-нибудь лог писаться, с описанием ошибки. Потому как это ошибка выполнения самого скрипта. |