Question

J'ai un peu de mal en utilisant strtok avec 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);
        }
}

Si je lui donne l'en-tête suivant

GET / HTTP/1.0

Je reçois cette sortie:

Method: GET
Path: /
HTTP: HTTP/1.0


c1: 1
c2: -1

give a 400 error

Comme vous pouvez le voir, strtok () scinde la chaîne correctement, mais les valeurs c1 et c2 ne semblent donner un sens (c1 doit retourner 0, mais il retourne 1).

ce qui se passe ici?

Était-ce utile?

La solution

Je suppose que vous n'êtes pas lui donner ceci:

GET / HTTP/1.0

mais plutôt ceci:

GET / HTTP/1.0\n

ou peut-être ceci:

GET / HTTP/1.0\r\n

En regardant votre code, il devrait y avoir une ligne vide entre la ligne de sortie « HTTP » et la ligne « c1 », mais vous avez deux, ce qui implique que la valeur « HTTP » lui-même contient un saut de ligne.

-

Sortie des guillemets autour des valeurs que vous voyez ce que je parie:

HTTP: "HTTP/1.0
"

Autres conseils

Comme vous pouvez le voir sur les lignes vides dans votre sortie (et que plusieurs personnes ont déjà dit) il y a des caractères de contrôle sur la fin de votre HTTP/1.0. Vous peut résoudre ce problème.

Mais pourquoi vous écrivez un nouvel analyseur de requête HTTP en C? Il est 2009! Il y a des tas d'entre eux déjà là-bas, dont certains sont même correct, beaucoup généreusement sous licence. Et même si vous avez besoin d'écrire votre propre pour une raison quelconque, vous devez utiliser un langage sûr (Python, Java, Lua, C #, Perl, quelque chose ) de sorte que si vous faites un comptage des caractères erreur triviale , vous ne finissent pas avec un gros trou de sécurité dans votre programme. (Et même si vous avez en quelque sorte à utiliser C, strtok est une fonction C particulièrement flagrants.)

A partir de votre sortie, il semble qu'il y ait peut-être un « / n » à la fin de la chaîne HTTP / 1.0? Richie est trop rapide pour moi;)

Essayez parage / enlever tout espace blanc sur la chaîne d'entrée avant tokenize il.

Essayez d'utiliser

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

de sorte que vous ignorez les espaces de fin.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top