質問
私有のトラブルを使用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);
}
}
までに以下のヘッダ
GET / HTTP/1.0
を取得します出力:
Method: GET
Path: /
HTTP: HTTP/1.0
c1: 1
c2: -1
give a 400 error
ご覧の通り、strtok()を解析し、文字列に適切な値のc1、c2ょう意味(c1は0を返しますが、代わりにを返します1)です。
していただきましたか。
解決
私はあなたがそれをこれを与えていないことを推測している。
GET / HTTP/1.0
のではなく、この:
GET / HTTP/1.0\n
または多分この:
GET / HTTP/1.0\r\n
あなたのコードを見てみると、「HTTP
」出力ラインと「c1
」行の間に1つの空白行があるはずですが、あなたは「HTTP
」値自体は改行が含まれていることを示唆し、2を持っています。
出力は、いくつかの引用符 - 私はあなたがこれを見賭けます:
HTTP: "HTTP/1.0
"
他のヒント
これを見ていただきますと、空の行を追加する出力として数人の言ではありま制御文字の末にお HTTP/1.0
.す え 固定します。
でもなぜディ-HTTPリクエストパーサーに。この2009!負荷があってがあっても正しく布ライセンスします。とてもうまく管理できなければならない書き自分が何らかの理由ものを使用できる安全な言語のPython、Java、Lua、C#、Perl、 何か ようにする場合、その些細なエラー計数字ではなく、最大きなセキュリティホールが生じます。(た場合でも何とかして使用C strtok
特にC言語道断な機能です。)
HTTP / 1.0の文字列の末尾に「/ N」があるかもしれないように
あなたの出力から、それが見えますか? リッチーは私にとってあまりにも速いです;)
あなたはそれをトークン化する前に、入力文字列に空白を削除/トリミングしてみます。
タグを使用してみてください
strncmp(httpVer, "HTTP/1.0", 8)
あなたは末尾の空白を無視するようにします。
所属していません StackOverflow