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