【问题标题】:304 error when refreshing the webpage using facil.io framework使用 facil.io 框架刷新网页时出现 304 错误
【发布时间】:2020-08-10 13:00:26
【问题描述】:

我是 facil.io 框架的新手。我创建了一个简单的服务器来加载 html 页面。当我在 Firefox 中打开本地主机时,它会完美加载。如果我刷新页面,它会收到 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

【问题讨论】:

  • 浏览器显示正确吗?如果是这样,304 不是问题。
  • @JosephSible-ReinstateMonica 它将 html 显示为纯文本而不是普通视图
  • @Myst 你能帮我吗

标签: c sockets http


【解决方案1】:

使用 http_mimetype_find 作为 html

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

由于缺乏信息,我犯了这个错误

【讨论】:

    【解决方案2】:

    两件事:

    304 状态码

    304 status code不是错误,如here所示:

    已收到有条件的 GET 或 HEAD 请求,如果不是因为条件评估为 false 的事实,将导致 200 OK 响应。

    在这种情况下,这意味着 Firefox 浏览器发送了一个 (ETag 标头](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag) 并且基本上说“仅在文件更新时才向我发送文件(它的 ETag 不同)”。

    由于文件未更新,facil.io 响应为空的 304 响应,表示文件未更新。

    此时,Firefox 会显示它之前缓存的文件,而不是重新下载相同的数据。

    静态文件服务 - http_sendfile2

    根据facil.io source code,Mime-Type会根据文件名自动设置,无需手动设置。

    在这种情况下,您可以在 on_request 回调中跳过 http_mimetype_find,因此它可能会显示为:

    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);
        }  
    }
    

    【讨论】:

    • 是的,我使用 cookie 到 x-data 标头
    猜你喜欢
    • 2020-08-14
    • 2013-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多