Pregunta
Estoy teniendo un poco de problemas para usar con 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);
}
}
Si le doy la siguiente cabecera
GET / HTTP/1.0
Me sale este resultado:
Method: GET
Path: /
HTTP: HTTP/1.0
c1: 1
c2: -1
give a 400 error
Como se puede ver, strtok () analiza la cadena correctamente, pero los valores c1 y c2, te parece que tenga sentido (c1 debe devolver 0, pero en su lugar se devuelve 1).
¿Qué está pasando aquí?
Solución
supongo que no está dando esto:
GET / HTTP/1.0
sino más bien esto:
GET / HTTP/1.0\n
o posiblemente esto:
GET / HTTP/1.0\r\n
En cuanto a su código, debe haber una línea en blanco entre la línea de salida "HTTP
" y la línea "c1
", pero hay dos, lo que implica que el valor "HTTP
" en sí contiene una nueva línea.
Salida algunas citas en torno a los valores - apuesto a que vea esto:
HTTP: "HTTP/1.0
"
Otros consejos
Como se puede ver en las líneas en blanco en su salida (y ya que varias personas han dicho ya) no son caracteres de control en el extremo de su HTTP/1.0
. Usted podría solucionar este problema.
Pero ¿por qué estás escribiendo una nueva petición HTTP analizador en C? Es 2009! Hay un montón de ellos ya por ahí, algunos de los cuales son incluso corregir, muchos liberalmente con licencia. E incluso si usted necesita para escribir su propia, por alguna razón, se debe utilizar un lenguaje segura (Python, Java, Lua, C #, Perl, algo ), de modo que si se comete un error de trivial contando caracteres , que no termina con un gran agujero de seguridad en su programa. (E incluso si de alguna manera tiene que utilizar C, strtok
es una función C particularmente atroz.)
Desde su salida parece que puede haber un '/ n' al final de la especificación HTTP / 1.0 cuerda? Richie es demasiado rápido para mí;)
Trate de recortar / extraer un espacio en blanco en la cadena de entrada antes de que tokenize.
Trate de usar
strncmp(httpVer, "HTTP/1.0", 8)
de manera que se ignora espacios en blanco finales.