avatar

松果工作室

欢迎光临

  • 首页
  • ESP
  • LVGL
  • CubeMX
  • freeRTOS
  • 快速笔记
  • 个人收藏
  • 我的服务
  • 考察日志
Home HTTP 快速刷新
文章

HTTP 快速刷新

Posted 11 days ago Updated 11 days ago
By YCP
4~6 min read

此举将修改 ESPIDF

#define HTTP_SEND_BUF_SIZE 4096

esp_err_t httpd_resp_send_all(httpd_req_t *r, const char *buf, ssize_t buf_len)
{
    if (!r || !httpd_valid_req(r)) {
        return ESP_ERR_INVALID_ARG;
    }

    struct httpd_req_aux *ra = r->aux;

    if (buf_len == HTTPD_RESP_USE_STRLEN) {
        buf_len = (buf) ? strlen(buf) : 0;
    }

    /* ---------- 静态 buffer(避免碎片) ---------- */
    static char send_buf[HTTP_SEND_BUF_SIZE];

    int offset = 0;
    int remain = HTTP_SEND_BUF_SIZE;

    /* ---------- 1. 写状态行 + 基础 header ---------- */
    int ret = snprintf(send_buf + offset, remain,
                       "HTTP/1.1 %s\r\n"
                       "Content-Type: %s\r\n"
                       "Content-Length: %d\r\n",
                       ra->status,
                       ra->content_type,
                       (int)buf_len);

    if (ret < 0 || ret >= remain) {
        return ESP_ERR_HTTPD_RESP_HDR;
    }

    offset += ret;
    remain -= ret;

    /* ---------- 2. 追加用户 header ---------- */
    for (unsigned i = 0; i < ra->resp_hdrs_count; i++) {

        const char *field = ra->resp_hdrs[i].field;
        const char *value = ra->resp_hdrs[i].value;

        if (!field || !value) {
            return ESP_ERR_HTTPD_RESP_HDR;
        }

        ret = snprintf(send_buf + offset, remain,
                       "%s: %s\r\n", field, value);

        if (ret < 0 || ret >= remain) {
            return ESP_ERR_HTTPD_RESP_HDR;
        }

        offset += ret;
        remain -= ret;
    }

    /* ---------- 3. header 结束 ---------- */
    if (remain < 2) {
        return ESP_ERR_HTTPD_RESP_HDR;
    }

    send_buf[offset++] = '\r';
    send_buf[offset++] = '\n';
    remain -= 2;

    /* ---------- 4. 拼 body(关键优化点) ---------- */
    if (buf && buf_len > 0) {

        if (buf_len > remain) {
            /* ? 超出 4096,拒绝(防止截断) */
            return ESP_ERR_HTTPD_RESP_SEND;
        }

        memcpy(send_buf + offset, buf, buf_len);
        offset += buf_len;
    }

    /* ---------- 5. 单次发送 ---------- */
    if (httpd_send_all(r, send_buf, offset) != ESP_OK) {
        return ESP_ERR_HTTPD_RESP_SEND;
    }

    return ESP_OK;
}
ESP
License:  CC BY 4.0
Share

Further Reading

OLDER

ESP Event

NEWER

[adb] 读取屏幕内容与点击,用于测试

Recently Updated

  • ESP32s3 内存占用测试报告
  • ESP Event
  • HTTP 快速刷新
  • [adb] 读取屏幕内容与点击,用于测试
  • [CubeMX] SPI

Trending Tags

LVGL WCH Linux Elec ThatProject freeRTOS STM ESP Flutter Others

Contents

©2026 松果工作室. Some rights reserved.

Using the Halo theme Chirpy