Pergunta

Estou tendo um pouco de dificuldade usando strtok com 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 eu dar-lhe o seguinte cabeçalho

GET / HTTP/1.0

Eu recebo esta saída:

Method: GET
Path: /
HTTP: HTTP/1.0


c1: 1
c2: -1

give a 400 error

Como você pode ver, strtok () analisa a cadeia corretamente, mas os valores c1, c2 e não parecem fazer sentido (c1 deve retornar 0, mas em vez disso, retorna 1).

O que está acontecendo aqui?

Foi útil?

Solução

Eu estou supondo que você não está dando-lhe o seguinte:

GET / HTTP/1.0

mas sim isto:

GET / HTTP/1.0\n

ou possivelmente isto:

GET / HTTP/1.0\r\n

Olhando para o código, deve haver uma linha em branco entre a linha de saída "HTTP" ea linha "c1", mas você tem dois, o que implica que o valor "HTTP" em si contém uma nova linha.

Saída algumas citações em torno dos valores - Eu aposto que você ver o seguinte:

HTTP: "HTTP/1.0
"

Outras dicas

Como você pode ver a partir das linhas em branco em sua saída (e como várias pessoas já disse), existem caracteres de controle no final do seu HTTP/1.0. Você pode corrigir isso.

Mas por que você está escrevendo um novo analisador solicitação HTTP em C? É 2009! Há cargas deles já lá fora, algumas das quais são ainda correto, muitos liberalmente licenciado. E mesmo se você precisa escrever o seu próprio, por algum motivo, você deve usar uma linguagem segura (Python, Java, Lua, C #, Perl, algo ), de modo que se você cometer um erro trivial caracteres de contagem , você não acabar com um grande buraco de segurança no seu programa. (E mesmo se você de alguma forma tem que usar C, strtok é uma função C particularmente notório.)

Desde sua saída parece que pode haver uma '/ n' no final do HTTP / string 1.0? Richie é rápido demais para mim;)

Tente aparar / removendo qualquer espaço em branco na cadeia de entrada antes de tokenizar-lo.

Tente usar

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

para que você ignorar espaços em branco.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top