LWiP http POST-缓冲区的大小与Content-Length不同

问题描述

我正在编写一个STM32 C函数(使用lwIP netconn),该函数接受带有文件“ attached”的HTTP Post Request。我使用了一种形式来选择要从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与内容长度不同?我在示例代码搜索字符串“ octet-stream”,以了解二进制数据何时开始,但是具有如此小的标题,却找不到它。

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

谢谢。

解决方法

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

现在您应该解析此类流。该流的格式为HTTP 1.1,与STM32和TCP的流相同,不同之处在于:不同的层(请参见OSI model)了解HTTP headers。我看到Content-Type: multipart/form-data您确定要解析吗?

为什么buflen与内容长度不同?

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

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

不,你做对了