概述
工作需要,LINUX+QT下基于Mongoose库进行文件上传功能的开发,这是最近的一次经历,给我以激励的同时让我决定需要记录一下日常与收获;
困难:
一、我并不懂得网络开发
二、没有一点儿实现思路,之前大佬也没有实现过的功能
三、查找到的资料并不支持我成功实现
实现过程
发现问题
刚开始没有进入状态,只是查找资料然后参考命令进行编程实现,但实际测试确实失败,服务器根本不给一点儿反馈,找不到问题所在,十分沮丧;
然后通过curl进行测试,结果如下:
curl -v -L -X POST -F "file=@./archive.tar.gz" 网址
< HTTP/1.1 403 Forbidden
< Server: nginx/1.20.1
< Date: Wed, 10 Apr 2024 02:49:45 GMT
< Content-Type: text/html
< Content-Length: 153
< Connection: keep-alive
<
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.20.1</center>
</body>
</html>
* Connection #1 to host charge.thaisen.cn left intact
判断是服务器拒绝了请求,经查证,服务器端未实现此功能, 且只支持put命令;
确定实现命令
服务器更改完成后,通过curl上传成功,然后WireShark抓包,如下:
curl -X PUT -T "./archive.tar.gz" http:// 网址/ -v
> User-Agent: curl/7.47.0
> Accept: */*
> Content-Length: 769
> Expect: 100-continue
>
< HTTP/1.1 100 Continue
* We are completely uploaded and fine
< HTTP/1.1 204 No Content
< Server: nginx/1.22.1
< Date: Wed, 10 Apr 2024 07:38:39 GMT
< Connection: keep-alive
<
* Connection #0 to host left intact
代码实现
经由上述测试,分析得到,命令不需要Content-Type,并确认了命令结构,最终代码实现如下:
mg_printf(s_mg_connection,
"PUT /%s HTTP/1.1\r\n"
"Host: %.*s\r\n"
"Accept: */*\r\n"
"Content-Length: %d\r\n"
"Expect: 100-continue\r\n"
"\r\n",
filename, (int)(s_host.len), s_host.ptr, len);