Domanda

Sto avendo un po 'di problemi con strtok con 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);
        }
}

Se mi danno la seguente intestazione

GET / HTTP/1.0

ottengo questo output:

Method: GET
Path: /
HTTP: HTTP/1.0


c1: 1
c2: -1

give a 400 error

Come si può vedere, strtok () analizza la stringa correttamente, ma i valori c1, c2 e non sembrano dare un senso (c1 dovrebbe restituire 0, ma invece restituisce 1).

Che cosa succede qui?

È stato utile?

Soluzione

Sto indovinando che non stai dando in questo modo:

GET / HTTP/1.0

ma piuttosto questo:

GET / HTTP/1.0\n

o, eventualmente, in questo modo:

GET / HTTP/1.0\r\n

Guardando il codice, ci dovrebbe essere una riga vuota tra la linea di uscita "HTTP" e la linea "c1", ma avete due, il che implica che il valore "HTTP" stessa contiene un ritorno a capo.

Output alcune citazioni attorno ai valori - scommetto che si vede in questo modo:

HTTP: "HTTP/1.0
"

Altri suggerimenti

Come si può vedere dalle righe vuote nella vostra uscita (e come molte persone hanno già detto) ci sono caratteri di controllo sulla fine della vostra HTTP/1.0. potrebbero risolvere il problema.

Ma perché stai scrivendo una nuova richiesta parser HTTP in C? E 'il 2009! Ci sono un sacco di loro già là fuori, alcuni dei quali sono anche corretto, molti liberamente con licenza. E anche se si ha bisogno di scrivere il proprio, per qualche motivo, si consiglia di utilizzare un linguaggio di sicurezza (Python, Java, Lua, C #, Perl, qualcosa ) in modo che se si commette un errore banale conteggio caratteri , non si finisce con un grosso buco di sicurezza nel programma. (E anche se avete in qualche modo di utilizzare C, strtok è una funzione particolarmente eclatanti C.)

Da l'output sembra che ci può essere un '/ n' alla fine della / 1.0 stringa di HTTP? Richie è troppo veloce per me;)

Prova rifilatura / rimozione di qualsiasi spazio bianco sulla stringa di input prima di tokenize esso.

Prova a usare

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

in modo che si ignora spazio bianco in coda.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top