Frage

Ich bin ein wenig Mühe mit strtok mit strcmp haben.

//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);
        }
}

Wenn ich gebe es die folgenden Header

GET / HTTP/1.0

ich diese Ausgabe:

Method: GET
Path: /
HTTP: HTTP/1.0


c1: 1
c2: -1

give a 400 error

Wie Sie sehen können, strtok () analysiert die Zeichenfolge richtig, aber die Werte c1, c2 und scheinen nicht sinnvoll sein (c1 sollte 0 zurückgeben, aber stattdessen gibt es 1).

Was ist hier los?

War es hilfreich?

Lösung

Ich vermute, dass Sie nicht es diese geben:

GET / HTTP/1.0

, sondern folgt aus:

GET / HTTP/1.0\n

oder möglicherweise so aus:

GET / HTTP/1.0\r\n

auf dem Code der Suche, es sollte eine Leerzeile zwischen der „HTTP“ Ausgangsleitung und der „c1“ Linie sein, aber Sie haben zwei, was bedeuten, dass der „HTTP“ Wert selbst eine neue Zeile enthält.

Ausgabe einige Zitate um die Werte - Ich wette, Sie sehen:

HTTP: "HTTP/1.0
"

Andere Tipps

Wie Sie aus den leeren Zeilen in der Ausgabe sehen können (und wie einige Leute haben schon gesagt) gibt es Steuerzeichen am Ende Ihres HTTP/1.0. Sie könnte dieses Problem zu beheben.

Aber warum schreiben Sie einen neuen HTTP-Request-Parser in C? Es ist 2009! Es gibt viele von ihnen bereits gibt, von denen einige sogar richtig, viele liberal lizenziert. Und selbst wenn Sie Ihre eigenen aus irgendeinem Grund schreiben müssen, sollten Sie eine sichere Sprache verwenden (Python, Java, Lua, C #, Perl, etwas ), so dass, wenn Sie machen eine triviale Zählfehler Zeichen , die Sie nicht mit einem großen Sicherheitslücke in Ihrem Programm beenden. (Und selbst wenn man irgendwie C verwenden müssen, strtok ist eine besonders eklatante C-Funktion.)

Von Ihrem Ausgang sieht es aus wie es am Ende des HTTP / 1.0-String ein ‚/ n‘ kann? Richie ist zu schnell für mich;)

Versuchen Trimmen / alle Leerzeichen entfernt auf der Eingabezeichenfolge, bevor Sie es tokenize.

Versuchen Sie es mit

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

, so dass Sie nachfolgende Leerzeichen ignoriert werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top