Ответы на POST запрос (HTTP/1.X 200 OK)

Модератор: Модераторы разделов

xfree86
Сообщения: 97

Ответы на POST запрос

Сообщение xfree86 »

Добрый день, дорогие коллеги...

Прежде чем задать этот вопрос, много искал на форумах и читал 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 байт сделал, чтобы отловить конец запроса... Так как иначе, он может прислать не полный буфер еще в середине отправки...
Пишу пока все в файл, не реазбирая... Сам файл мне пока не нужен, нужно лишь отправить браузеру команду для редиректа...
Подскажите
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5456
ОС: Gentoo

Re: Ответы на POST запрос

Сообщение /dev/random »

10.3.4 303 See Other

The response to the request can be found under a different URI and
SHOULD be retrieved using a GET method on that resource. This method
exists primarily to allow the output of a POST-activated script to
redirect the user agent to a selected resource.
The new URI is not a
substitute reference for the originally requested resource. The 303
response MUST NOT be cached, but the response to the second
(redirected) request might be cacheable.

The different URI SHOULD be given by the Location field in the
response. Unless the request method was HEAD, the entity of the
response SHOULD contain a short hypertext note with a hyperlink to
the new URI(s).


Note: Many pre-HTTP/1.1 user agents do not understand the 303
status. When interoperability with such clients is a concern, the
302 status code may be used instead, since most user agents react
to a 302 response as described here for 303.
Спасибо сказали:
xfree86
Сообщения: 97

Re: Ответы на POST запрос

Сообщение xfree86 »

Надо полностью формировать все заголовки
или "HTTP/1.x 303 See Other \n Location: http://blablabla.ru" будет достаточно ?
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5456
ОС: Gentoo

Re: Ответы на POST запрос

Сообщение /dev/random »

Для современных браузеров достаточно.
Если нужна работа с древними браузерами (не поддерживающими HTTP/1.1) - нужно также добавить поля, описывающие параметры html-страницы (как минимум Content-Length либо Transfer-Encoding), и, собственно, страницу, которая должна содержать ссылку на http://blablabla.ru, т.к. старые браузеры не смогут перейти к Location автоматически, и вместо этого выведут приложенную страницу.

Да, чуть не забыл: не "HTTP/1.x 303 See Other \n Location: http://blablabla.ru", а "HTTP/1.x 303 See Other \n Location: http://blablabla.ru\n\n" - после последнего поля заголовка должны идти 2 "\n" подряд.
Спасибо сказали:
xfree86
Сообщения: 97

Re: Ответы на POST запрос

Сообщение xfree86 »

После приему всей информации отвечаю ему "HTTP/1.X 302 Moved Temporarily\r\nLocation: /index.htm\r\n\r\n"
Но на эту страницу не перекидывает, если работать с Mozilla и Firefox... В чем может быть дело? С Эксплорером все ок
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5456
ОС: Gentoo

Re: Ответы на POST запрос

Сообщение /dev/random »

Блин, да тут в одной приведенной строчке сразу несколько ошибок!

1) при чем здесь 302 ?!?!?!?!
303 !!!!!!!!!
При использовании 302 все браузеры, соответствующие стандарту (мелкомягкое дерьмо к таковым не относится), будут пытаться обратиться к Location тем же методом, что и изначально (т.е. в данном случае POST, а не GET). Стандарт ОБЯЗУЕТ браузеры вести себя именно так. Очевидно, что в большинстве случаев это недопустимо, и нужно использовать 303.

2) Какой /index.htm ??????
14.30 Location

The Location response-header field is used to redirect the recipient
to a location other than the Request-URI for completion of the
request or identification of a new resource. For 201 (Created)
responses, the Location is that of the new resource which was created
by the request. For 3xx responses, the location SHOULD indicate the
server's preferred URI for automatic redirection to the resource. The
field value consists of a single absolute URI.

Location = "Location" ":" absoluteURI

URI в поле Location должен быть АБСОЛЮТНЫМ! Это требование стандарта! Т.е. http://blabla.bla/index.htm, а не просто /index.htm!
Спасибо сказали: