3

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

4 に答える 4

6

私はあなたがそれにこれを与えていないと推測しています:

GET / HTTP/1.0

むしろこれ:

GET / HTTP/1.0\n

またはおそらくこれ:

GET / HTTP/1.0\r\n

HTTPコードを見ると、「 」出力行と「」行の間に1行の空白行があるはずですが、2行あり、「 」値自体に改行が含まれているc1ことを意味します。HTTP

値の前後にいくつかの引用符を出力します-私はあなたがこれを見るに違いない:

HTTP: "HTTP/1.0
"
于 2009-09-19T20:09:14.043 に答える
2

出力の空白行からわかるように(そして何人かの人がすでに言っているように)、の末尾に制御文字がありますHTTP/1.0。これを修正できます。

しかし、なぜCで新しいHTTPリクエストパーサーを作成しているのでしょうか。2009年です!それらはすでにたくさんあり、そのうちのいくつかは正しく、多くは自由に認可されています。また、何らかの理由で独自の言語を作成する必要がある場合でも、安全な言語(Python、Java、Lua、C#、Perlなど)を使用し、文字のカウントで些細なエラーが発生した場合に、結果が出ないようにする必要があります。プログラムに大きなセキュリティホールがあります。(そして、どういうわけかCを使用しなければならない場合でも、これstrtokは特にひどいC関数です。)

于 2009-09-19T21:09:56.070 に答える
1

出力から、HTTP /1.0文字列の最後に「/n」があるように見えますか?リッチーは私には速すぎます;)

トークン化する前に、入力文字列の空白をトリミング/削除してみてください。

于 2009-09-19T20:12:47.720 に答える
-1

使ってみてください

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

末尾の空白を無視するようにします。

于 2009-09-19T20:12:31.733 に答える