我有另一个问题。现在我正在尝试编写一个可以从标准HTTP头中成功提取后期数据的函数。
例如,如果我的传入HTTP标头是:
GET / HTTP/1.0
Host: example.com
postdata=1&otherdata=2&whatever=3
我只想检索:
postdata=1&otherdata=2&whatever=3
为符合标准,必须在代码中生成\r\n
以表示新行。
目前,该函数不返回任何内容,但如果删除&& !strstr(p1,"\r\n")
,则返回HTTP头中除第一行之外的每一行。
从左到右的函数参数是:传入的HTTP数据,输出数据和要检索的最大大小。
然后我会以下列方式从另一个程序中调用该函数:
char result[500];
char* httppostdata=gethttpdata();
gethttppost(httppostdata,result,500);
我们必须假设gethttpdata返回一个指向实际HTTP数据的有效指针。
这是需要修复的功能:
unsigned long gethttppost(char* in,char* res,unsigned long max){
char *p2,*p1=in;unsigned long mx;
while ((p1=strstr(p1,"\r\n"))){
p1+=2;
if ((p2=strstr(p1,"\r\n\r\n")) && !strstr(p1,"\r\n")){
mx=(unsigned long)(p2-p1);
if (mx > max){mx=max;}
memcpy(res,p1,mx);
return mx;
}
}
return 0;
}
答案 0 :(得分:0)
也许您可以根据自己的需要进行调整。它使用strtok
查找由CR
和/或LF
分隔的字符串中的最后一个标记。如果终止CRLF
不存在则无关紧要。
#include <stdio.h>
#include <string.h>
int main(void)
{
char httphdr[]=
"GET / HTTP/1.0\r\nHost: example.com\r\n\r\npostdata=1&otherdata=2&whatever=3\r\n";
char *ptr = NULL, *lptr = NULL;
ptr = strtok(httphdr, "\r\n");
while (ptr) {
lptr = ptr;
ptr = strtok(NULL, "\r\n");
}
if (lptr)
printf("%s\n", lptr);
else
printf("Not found\n");
return 0;
}
节目输出
postdata=1&otherdata=2&whatever=3
答案 1 :(得分:0)
问题在于
if ((p2=strstr(p1,"\r\n\r\n")) && !strstr(p1,"\r\n")){
如果p2
不是NULL
,则肯定有"\r\n"
个序列,第二个strstr
无法返回NULL
。因此代码会跳过标题的结尾,之后第一个strstr
总是会失败。
我不明白这些并发症的原因。您只需要找到(一次)标题结束的位置:
char * headers_end = strstr(in, "\r\n\r\n");
if (headers_end == 0)
return 0;
char * body = headers_end += 4;
char * body_end = strstr(body, "\r\n");
....