webnet get提交丢参数问题

发布于 2019-06-22 14:42:14    浏览:773
最近测试webnet 发现get提交参数时只能提交一个参数,而网页是我们产品中正常使用的,最后发现是request->query_counter一直为1导致的。定位变量发现是在static void _webnet_request_parse_query(struct webnet_request* request)中改变的,
但函数中request->content_length一直为0导致request->query_counter最大值是1.

static void _webnet_request_parse_query(struct webnet_request* request)
{
char *ptr, *end_ptr;
rt_uint32_t index;

if ((request->query == RT_NULL) || (*request->query == '\0')) return; /* no query */

/* get the query counter */
ptr = request->query;
end_ptr = request->query + request->content_length;//这个变量一直为0导致下面的轮询查找无法进行,进而导致request->query_counter最大为1.
//request->content_length是在webnet_request_parse_header函数中赋值的,但这个函数没被调用。
//目前的做法是将request->content_length改为一个比较大的值,使下面的while能够正常进行一直到检测到'\0'退出,这样可以解决问题
request->query_counter = 1;
while (*ptr && ptr <= end_ptr)
{
if (*ptr == '&')
{
while ((*ptr == '&') && (*ptr != '\0')) ptr ++;
if (*ptr == '\0') break;

request->query_counter ++;
}
ptr ++;
}
if (request->query_counter == 0) return; /* no query */

/* allocate query item */
request->query_items = (struct webnet_query_item*) wn_malloc (sizeof(struct webnet_query_item)
* request->query_counter);
if (request->query_items == RT_NULL)
{
request->result_code = 500;
return;
}

/* parse the query */
ptr = request->query;
for (index = 0; index < request->query_counter; index ++)
{
request->query_items[index].name = ptr;
request->query_items[index].value = RT_NULL;

/* get value or goto next item */
while ((*ptr != '&') && (*ptr != '\0'))
{
/* get value */
if (*ptr == '=')
{
*ptr = '\0';
ptr ++;
request->query_items[index].value = ptr;
urldecode(request->query_items[index].value, strlen(request->query_items[index].value));
}
else ptr ++;
}

if (*ptr == '\0') break;
if (*ptr == '&')
{
/* make a item */
*ptr = '\0';
ptr ++;
while (*ptr == '&' && *ptr != '\0' && ptr <= end_ptr)ptr ++;
if (*ptr == '\0') break;
}
}
}


查看更多

8 个回答
aozima
aozima 2019-06-22
拒绝白嫖,拒绝键盘侠!
能提供一下测试时的URL链接和抓包吗?

1. URL链接
2. 浏览器按F12,可以进入调试状态,在网络一栏里面可以对这个请求右键复制请求头。
2. 或提供这个请求的 Wireshark 抓包,过滤器可以设一下,只要这个请求的。
libing
libing 2019-06-24
This guy hasn't written anything yet
Cheney_Chen
Cheney_Chen 2019-06-24
This guy hasn't written anything yet
libing 发表于 2019-6-24 09:08
我之前有提这个问题,https://www.rt-thread.org/qa/thread-10548-1-1.html


这个后来你好像没提 PR 吧?
libing
libing 2019-06-24
This guy hasn't written anything yet
Cheney_Chen 发表于 2019-6-24 09:41
这个后来你好像没提 PR 吧?


我只提了issue
Cheney_Chen
Cheney_Chen 2019-06-24
This guy hasn't written anything yet
楼主试一下 https://fastadmin.rt-thread.org/ask/question/10548.html 这个贴的处理方式能不能解决你的问题,可以的话我提 PR 修复一下
xiaoqi
xiaoqi 2019-06-24
This guy hasn't written anything yet
Cheney_Chen 发表于 2019-6-24 12:04
楼主试一下 https://www.rt-thread.org/qa/thread-10548-1-1.html 这个贴的处理方式能不能解决你的问题,可 ...


我大体也是这么处理的,这一块感觉有漏洞,你们还是修复一下吧
Cheney_Chen
Cheney_Chen 2019-06-24
This guy hasn't written anything yet
感谢楼主反馈,问题已经 PR 修复 ,可以拉取最新 webnet 软件包测试

撰写答案

请登录后再发布答案,点击登录
关注者
0
被浏览
773

发布
问题

分享
好友

手机
浏览

扫码手机浏览