问题描述
我正在编写一个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?
不,你做对了