C - strtok和strcmp

时间:2009-09-19 20:05:06

标签: c strtok strcmp

使用strtok和strcmp时遇到了一些麻烦。

//Handles the header sent by the browser
char* handleHeader(char *header){
        //Method given by browser (will only take GET, POST, and HEAD)
        char *method,*path, *httpVer;

        method = (char*)malloc(strlen(header)+1);
        strcpy(method,header);
        method = strtok(method," ");


        path = strtok(NULL," ");
        httpVer = strtok(NULL, " ");
        printf("\nMethod: %s\nPath: %s\nHTTP: %s\n",method,path,httpVer);


        printf("\nc1: %d\nc2: %d\n",strcmp(httpVer,"HTTP/1.0"),strcmp(httpVer,"HTTP/1.1"));

        if(!(!strcmp(httpVer,"HTTP/1.0") || (!strcmp(httpVer,"HTTP/1.1")))){
                printf("\ngive a 400 error\n");
                return "400 foo";
        }


        if(!strcmp(method,"GET")){
                //char *path = strtok(NULL," ");

                //If they request the root file, change the path to index.html
                if(!strcmp(path,"/")){
                        path = (char*)malloc(strlen(BASE_DIR) + strlen("/index.html")+1);
                        strcpy(path,"/index.html");
                }
                 return readPage(path,2);
        }
}

如果我给它以下标题

GET / HTTP/1.0

我得到了这个输出:

Method: GET
Path: /
HTTP: HTTP/1.0


c1: 1
c2: -1

give a 400 error

正如您所看到的,strtok()正确地解析了字符串,但值c1和c2似乎没有意义(c1应该返回0,而是返回1)。

这是怎么回事?

4 个答案:

答案 0 :(得分:6)

我猜你不是这样说的:

GET / HTTP/1.0

而是这个:

GET / HTTP/1.0\n

或者可能是这样:

GET / HTTP/1.0\r\n

查看代码,“HTTP”输出行与“c1”行之间应该有一个空行,但您有两行,意味着“HTTP “价值本身包含换行符。

在值周围输出一些引号 - 我打赌你看到了这个:

HTTP: "HTTP/1.0
"

答案 1 :(得分:2)

正如您可以从输出中的空白行看到的(正如几位人已经说过的那样),HTTP/1.0的末尾有控制字符。您可以解决此问题。

但为什么要在C中编写新的HTTP请求解析器?这是2009年!已经有很多它们已经存在,其中一些甚至是正确的,许多是自由许可的。即使你出于某些原因需要编写自己的语言,也应该使用安全的语言(Python,Java,Lua,C#,Perl,某些),这样如果你在计算字符时犯了一个小错误,你最终没有在程序中出现大的安全漏洞。 (即使你不得不使用C,strtok也是一个特别令人震惊的C函数。)

答案 2 :(得分:1)

从输出中看起来HTTP / 1.0字符串末尾可能有一个'/ n'? 里奇对我来说太快了;)

在对其进行标记之前,请尝试修剪/删除输入字符串上的任何空白区域。

答案 3 :(得分:-1)

尝试使用

strncmp(httpVer, "HTTP/1.0", 8)

这样就可以忽略尾随空格。