Ошибка 304 при обновлении веб-страницы с помощью facil.io framework - PullRequest
0 голосов
/ 27 апреля 2020

Я новичок в facil.io Framework. Я создаю простой сервер для загрузки html страницы. когда я открываю локальный хост в firefox, он загружается отлично. Если я перефразирую sh страницу, она получает сообщение 304 и показывает текст html в браузере.

#include "http.h"
void on_request(http_s *request);
FIOBJ HTTP_HEADER_X_DATA;
int main(void) {
    HTTP_HEADER_X_DATA = fiobj_str_new("X-Data", 6);
    http_listen("3000", NULL, .on_request = on_request, .log = 1);
    fio_start(.threads = 1);
    fiobj_free(HTTP_HEADER_X_DATA);
}

void on_request(http_s *request) {
    char *filepath = "index.html";
    http_set_cookie(request, .name = "my_cookie", .name_len = 9, .value = "data",
            .value_len = 4);
    http_set_header(request, HTTP_HEADER_CONTENT_TYPE,
            http_mimetype_find("txt", 3));
    http_set_header(request, HTTP_HEADER_X_DATA, fiobj_str_new("my data", 7));
    if(http_sendfile2(request, filepath, strlen(filepath), NULL, 0)) {
        http_send_error(request, 404);
        FIO_LOG_WARNING("Can't read file %s", filepath);
    }  
}

вывод:

127.0.0.1 - - [Mon, 26 Apr 2020 02:39:15 GMT] "GET / HTTP/1.1" 200 3328b 252ms
127.0.0.1 - - [Mon, 26 Apr 2020 02:39:17 GMT] "GET / HTTP/1.1" 304 -- 275ms

Ответы [ 2 ]

0 голосов
/ 27 апреля 2020

Две вещи:

304 Код состояния

Код состояния 304 не является ошибкой, как указано здесь :

Условный запрос GET или HEAD был получен и привел бы к ответу 200 OK, если бы не тот факт, что условие оценивается как ложное.

В этом контексте оно означает, что браузер Firefox отправил (заголовок ETag) (https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag) и в основном сказал: «Отправьте мне файл, только если файл был обновлен (это ETag отличается)».

Так как файл не был обновлен, facil.io ответил пустым ответом 304, указывающим, что файл не был обновлен.

В этот момент Firefox отображал файл, который он ранее кэшировал вместо повторной загрузки одних и тех же данных.

Stati c файловая служба - http_sendfile2

Согласно исходному коду facil.io , Mime- Тип будет установлен автоматически в соответствии с именем файла, нет необходимости устанавливать его вручную.

В этом контексте вы можете пропустить http_mimetype_find в вашем on_request обратном вызове, чтобы он мог выглядеть так:

void on_request(http_s *request) {
    char *filepath = "index.html";
    http_set_cookie(request, .name = "my_cookie", .name_len = 9, .value = "data",
            .value_len = 4); // do you use this cookie? ot the X-Data header?
    http_set_header(request, HTTP_HEADER_X_DATA, fiobj_str_new("my data", 7));
    if(http_sendfile2(request, filepath, strlen(filepath), NULL, 0)) {
        http_send_error(request, 404);
        FIO_LOG_WARNING("Can't read file %s", filepath);
    }  
}
0 голосов
/ 27 апреля 2020

Использовать http_mimetype_find как html

  http_set_header(request, HTTP_HEADER_CONTENT_TYPE,
            http_mimetype_find("html", 4));

из-за недостатка информации, я сделал эту ошибку

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...