HTTP 快速刷新
此举将修改 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;
}
License:
CC BY 4.0