【问题标题】:extracting HTTP post data提取 HTTP 发布数据
【发布时间】:2015-10-20 19:00:21
【问题描述】:

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

【问题讨论】:

  • 您的 HTTP 标头是否总是包含单词 postdata
  • 并非总是如此。可能是随机的

标签: c string http post memory


【解决方案1】:

也许您可以根据自己的需要进行调整。它使用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

【讨论】:

  • 谢谢,但我认为 strtok 不适用于 64 位系统。
  • @Mike:为什么不呢?它不适用于宽字符,但这是另一回事。
  • @Mike 为什么不试试呢?您的部分成功尝试使用了strstr,这些字符串函数不需要任何特定大小的系统即可工作。
【解决方案2】:

问题出在

    if ((p2=strstr(p1,"\r\n\r\n")) && !strstr(p1,"\r\n")){

如果p2 不是NULL,则肯定有"\r\n"sequence,第二个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");
    ....

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-04
    • 2016-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多