我使用的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)。

请告诉我怎么回事?

有帮助吗?

解决方案

我猜你不给它这样的:

GET / HTTP/1.0

,而是这样的:

GET / HTTP/1.0\n

或可能这样的:

GET / HTTP/1.0\r\n

看你的代码,应该有“HTTP”输出线和“c1”行之间的一个空白行,但你有两个,这意味着“HTTP”值本身包含一个换行符。

输出周围的价值观一些报价 - 我敢打赌,你看到这一点:

HTTP: "HTTP/1.0
"

其他提示

正如你可以在你的输出空白线看(和几个人已经说过)有你的HTTP/1.0结束控制字符。您的可能的解决这个问题。

但你为什么C编写一个新的HTTP请求剖析?这是2009年!有他们的负荷已经在那里,其中一些甚至是正确的,许多宽松的许可。即使你确实需要编写自己出于某种原因,你应该使用一个安全的语言(Python和Java的,Lua中,C#,Perl中,的的东西的),所以,如果你犯了一个微不足道的错误计数字符,你不要在你的程序中很大的安全漏洞而告终。 (而且,即使你以某种方式必须使用C,strtok是一个特别严重的C函数。)

从您的输出它看起来像有可以在HTTP / 1.0字符串的末尾是“/ N”? 里奇是对我来说太快)

尝试微调/输入字符串除去任何空白你记号化之前。

尝试使用

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

,这样你忽略尾随空白。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top