c - 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 安全的缓冲区吗?
谢谢。
解决方案
随着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 安全的缓冲区吗?
不,你做对了
推荐阅读
- firebase - 无法从其他用户 FirebaseDatabase 获取消息
- excel - Power Query 函数 - 可选参数 - 需要令牌文字
- python - 如何简化将具有某些值的列添加到我的数据框中?
- reactjs - 谷歌身份验证使用反应。如何实现?
- python - 如何将日期时间索引的日期更改为月初
- python - 在 Python 中将 CSV 文件组合成一个数据帧
- jetty - Jetty ResourceCache 与 CachedContentFactory
- python - Python manage.py runserver 错误做 Python Crash Course
- r - 打印屏幕后如何修改按钮输出(R闪亮)?
- salesforce - 通过 Lightning Web 组件中的插槽渲染图表 JS