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?
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.