提取HTTP后期数据

时间:2015-10-20 19:00:22

标签: c string http post memory

我有另一个问题。现在我正在尝试编写一个可以从标准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;
}

2 个答案:

答案 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");
    ....