C - strtok и strcmp - PullRequest
       37

C - strtok и strcmp

2 голосов
/ 20 сентября 2009

У меня проблемы с использованием 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).

Что здесь происходит?

Ответы [ 4 ]

6 голосов
/ 20 сентября 2009

Я предполагаю, что вы не даете это:

GET / HTTP/1.0

а вот так:

GET / HTTP/1.0\n

или, возможно, это:

GET / HTTP/1.0\r\n

Глядя на ваш код, должна быть одна пустая строка между строкой вывода "HTTP" и строкой "c1", но у вас есть две, подразумевая, что само значение "HTTP" содержит новую строку .

Выведите несколько кавычек вокруг значений - держу пари, вы видите это:

HTTP: "HTTP/1.0
"
2 голосов
/ 20 сентября 2009

Как вы можете видеть из пустых строк в вашем выводе (и, как уже сказали несколько человек), в конце вашего HTTP/1.0 есть управляющие символы. Вы можете исправить это.

Но почему вы пишете новый синтаксический анализатор HTTP-запросов на C? Это 2009! Их уже много, некоторые из них даже правильные, многие либерально лицензированы. И даже если вам по какой-то причине нужно написать свой собственный язык, вы должны использовать безопасный язык (Python, Java, Lua, C #, Perl, что-то ), так что если вы совершаете тривиальную ошибку при подсчете символов, в вашей программе нет большой дыры в безопасности. (И даже если вам как-то придется использовать C, strtok является особенно вопиющей функцией C.)

1 голос
/ 20 сентября 2009

По вашему выводу может показаться, что в конце строки HTTP / 1.0 может быть '/ n'? Ричи слишком быстр для меня;)

Попробуйте обрезать / удалить все пробелы во входной строке перед тем, как ее токенизировать.

0 голосов
/ 20 сентября 2009

Попробуйте использовать

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

так что вы игнорируете конечные пробелы.

...