Вопрос

У меня возникли проблемы с использованием 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", но у вас их две, что означает, что "HTTP" Само значение содержит новую строку.

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

HTTP: "HTTP/1.0
"

Другие советы

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top