首页 > 解决方案 > LWiP http POST - 缓冲区大小与 Content-Length 不同

问题描述

我正在编写一个 STM32 C 函数(使用 lwIP netconn),它接受带有“附加”文件的 HTTP Post 请求。我使用了一个表格来选择要从 PC 传输到 MCU 的文件。我使用以下行来捕获请求:

netbuf_data(inbuf, (void**)&buf, &buflen);

buflen 的值为 624,但“Content-Length”标头为 75093。这是捕获的缓冲区:

POST /upload.cgi HTTP/1.1
Host: 192.168.0.10
Connection: keep-alive 
Content-Length: 75093
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: http://192.168.0.10
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary46gMrRDRRGlHEkwC
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://192.168.0.10/
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9

为什么 buflen 与 Content Length 不同?我的示例代码搜索字符串“octet-stream”以了解二进制数据何时开始,但标题如此之小却找不到它。

不幸的是,我现在确实有 Wireshark 知道 HTTP 数据包的确切大小。我应该使用另一种方法来捕获对 RTOS 安全的缓冲区吗?

谢谢。

标签: cposthttp-poststm32lwip

解决方案


随着netbuf_data您从流中获取数据片段。并且流可能有任何数据。尝试使用任何 telnet 客户端 (Putty) 连接到您的主机并输入一些内容。您将在缓冲区中看到它。

现在你应该解析这样的流。此流具有格式HTTP 1.1,并且此流与 STM32 和 TCP 没有任何共同点:不同的层(请参阅OSI 模型)阅读有关HTTP 标头的信息。我明白Content-Type: multipart/form-data了你确定要解析这个吗?

为什么 buflen 与 Content Length 不同?

因为buflen是您捕获的切片长度,Content-Length: 75093大约是HTTP

我应该使用另一种方法来捕获对 RTOS 安全的缓冲区吗?

不,你做对了


推荐阅读