문제

STRCMP와 함께 Strtok을 사용하는 데 약간의 어려움이 있습니다.

//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"값 자체에는 Newline이 포함되어 있습니다.

값에 대한 인용문을 출력 - 나는 당신이 이것을 볼 것이라고 확신합니다.

HTTP: "HTTP/1.0
"

다른 팁

당신의 출력의 빈 줄에서 볼 수 있듯이 (그리고 여러 사람이 이미 말했듯이) 끝에 제어 문자가 있습니다. HTTP/1.0. 너 ~할 수 있었다 이것 좀 고쳐줘.

그러나 왜 C에서 새로운 HTTP 요청 파서를 작성하고 있습니까? 2009 년입니다! 이미 많은 부하가 있으며, 그 중 일부는 정확하고 자유롭게 라이센스가 부여되었습니다. 그리고 어떤 이유로 든 자신의 글을 써야하더라도 안전한 언어 (Python, Java, Lua, C#, Perl, 무엇) 따라서 사소한 오류 계산 문자를 만들면 프로그램에 큰 보안 구멍이 생기지 않습니다. (그리고 어떻게 든 C를 사용해야하더라도 strtok 특히 심각한 C 기능입니다.)

출력에서 HTTP/1.0 문자열의 끝에 '/n'이있을 수 있습니까? Richie는 나를 위해 너무 빠릅니다.)

입력 문자열의 공백을 트리밍/제거하기 전에 입력 문자열을 트리밍/제거하십시오.

사용해보십시오

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

당신은 후행 흰색 스페이스를 무시합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top