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

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top