Добрый день, дорогие коллеги...Прежде чем задать этот вопрос, много искал на форумах и читал RFC... На форумах ничего не нашел, а в RFC все вроде бы понятно в теории, а в практике...
Ну да ладно... К делуПринимаю от браузера файл методом POST, принял все хорошо... Теперь надо ответить... И не просто ОК, а сказать ему, чтобы он запросил следующую страницу...
В RFC2616 написано примерно следующее
Цитата
* 1xx: Информационный — Запрос получен, процесс продолжается
* 2xx: Успех (Success) — Запрос успешно получен, понят и воспринят
* 3xx: Переадресация (Redirection) — Нужны дополнительные действия для завершения выполнения запроса
* 4xx: Ошибка клиента (Client Error) — Запрос содержит синтаксическую ошибку или не может быть выполнен
* 5xx: Ошибка сервера (Server Error) — Сервер не смог выполнить корректный запрос
видимо мне нужно использовать что-то из 3ххЦитата
| "300" ; Multiple Choices
| "301" ; Moved Permanently
| "302" ; Moved Temporarily
| "303" ; See Other
| "304" ; Not Modified
| "305" ; Use ProxyМне нужно, чтобы браузер отправил следующий запрос на какую-нибудь страницу... типа http://www.blablabla.ru
Тоесть нужно отправить ему не HTTP/1.X 200 OK, а что-то более интересное
Бился бился... Пробовал с "302" ; Moved Temporarily и с 301, но что-то никак...Написал тестовое приложение... Криво конечно и без излишества, но проверять на нем монжо
Пока отправляю ему HTTP/1.X 200 OK, что ему отправить, чтобы сделать редирект, о котором я писал вышел?
Код
#include <iostream>
#include <fstream>
#include <string>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>const int BUFSIZE=8;
int main()
{
int sock, listener;
struct sockaddr_in addr;
int bytes_read;
char buf[BUFSIZE];listener = socket(AF_INET, SOCK_STREAM, 0);
if(listener < 0)
{
perror("Socket create error!!!");
return 1;
}
addr.sin_family = AF_INET;
addr.sin_port = htons(80);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(listener, (struct sockaddr *)&addr, sizeof(addr)) < 0)
{
perror("Socket bind error!!!");
return 2;
}listen(listener, 1);
while(1)
{
sock = accept(listener, NULL, NULL);
if(sock < 0)
{
perror("Socket listening error!!!");
return 3;
}
std::ofstream result("/tmp/test_driver", std::ios::binary);bytes_read=0;
int read = BUFSIZE;
while(BUFSIZE==read)
{
read=recv(sock,buf, BUFSIZE, 0);
result.write(buf,read);
bytes_read+=read;
std::cout<<read<<std::endl;
}
result.close();std::cout<<"Bytes recieved: "<<bytes_read<<std::endl;
std::string send_ = "HTTP/1.X 200 OK";
send(sock,send_.c_str(),send_.size(), 0);
close(sock);
}
return 0;
}
Буфер 8 байт сделал, чтобы отловить конец запроса... Так как иначе, он может прислать не полный буфер еще в середине отправки...
Пишу пока все в файл, не реазбирая... Сам файл мне пока не нужен, нужно лишь отправить браузеру команду для редиректа...
Подскажите
Ну вот например заголовки принимаемые браузером когда его редиректят.
Вам наверное достаточно выставить Response status 302 и отправить заголовок Location
(Response Status) HTTP/1.1 302 Moved Temporarily
Cache-Control private
Connection close
Content-Length 2589
Content-Type text/html; charset=UTF-8
Date Fri, 29 Feb 2008 05:21:36 GMT
Location https://login.xxxx.int/
>[оверквотинг удален]
>Вам наверное достаточно выставить Response status 302 и отправить заголовок Location
>
>
>(Response Status) HTTP/1.1 302 Moved Temporarily
>Cache-Control private
>Connection close
>Content-Length 2589
>Content-Type text/html; charset=UTF-8
>Date Fri, 29 Feb 2008 05:21:36 GMT
>Location https://login.xxxx.int/После приему всей информации отвечаю ему "HTTP/1.X 302 Moved Temporarily\r\nLocation: /index.htm\r\n\r\n"
Но на эту страницу не перекидывает, если работать с Mozilla и Firefox... В чем может быть дело? С Эксплорером все ок
>
>Location: /index.htmВ RFC написано:
Location = "Location" ":" absoluteURI
Попробуй "Location: http://server/index.htm..."