문제

저는 C로 작고 효율적인 웹 서버를 구축하는 데 새로운 관심을 갖게 되었고 HTTP 헤더에서 POST 메서드를 구문 분석하는 데 몇 가지 문제가 있었습니다."게시된" 데이터에서 이름/값 쌍 검색을 처리하는 방법에 대한 조언이 있는 사람이 있습니까?

POST /test HTTP/1.1
Host: test-domain.com:7017
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://test-domain.com:7017/index.html
Cookie: __utma=43166241.217413299.1220726314.1221171690.1221200181.16; __utmz=43166241.1220726314.1.1.utmccn=(direct)|utmcsr=(direct)|utmcmd=(none)
Cache-Control: max-age=0
Content-Type: application/x-www-form-urlencoded
Content-Length: 25

field1=asfd&field2=a3f3f3
// ^-this

나는 전체적으로 수익을 검색하고 매번 작동하는지 확인하는 실질적인 방법을 찾지 못합니다.나는 하드코딩을 별로 좋아하지 않는다.

도움이 되었습니까?

해결책

newline newline 또는 더 구체적으로 을 검색하여 이름/값 쌍을 검색할 수 있습니다(이 후에 메시지 본문이 시작됩니다).

그런 다음 목록을 &로 간단히 분할한 다음 반환된 각 문자열을 이름/값 쌍의 = 사이에서 분할할 수 있습니다.

참조 HTTP 1.1 RFC.

다른 팁

헤더에 Content-Length가 있으면 빈 줄 바로 뒤에서 읽어야 할 바이트 양을 알 수 있습니다.어떤 이유로(GET 또는 POST) Content-Length가 헤더에 없으면 빈 줄(crlf) 뒤에 읽을 내용이 없다는 의미입니다.

빈 줄이 보일 때까지 스트림을 헤더로 계속 구문 분석해야 합니다.나머지는 POST 데이터입니다.

게시물 데이터에 대한 작은 파서를 작성해야 합니다.C 라이브러리 루틴을 사용하여 index, strtok 및 sscanf와 같은 빠르고 복잡한 작업을 수행할 수 있습니다."작은" 정의에 여유가 있다면 정규식 라이브러리나 flex 및 bison을 사용하여 더 정교한 작업을 수행할 수 있습니다.

적어도 나는 이것이 당신의 질문에 대한 대답이라고 생각합니다.

IETF RFC에도 불구하고 여기에 더 중요한 답변이 있습니다.항상 추가 사항이 있다는 것을 알고 있다고 가정하면 /r/nContent-Length 헤더에 있는 행을 하나의 헤더로 분리하는 작업을 수행할 수 있어야 합니다. char* 명명된 변수 data.이것이 우리가 시작하는 곳입니다.

char *data = "f1=asfd&f2=a3f3f3";
char f1[100], 
char f2[100];
sscanf(data, "%s&%s", &f1, &f2); // get the field tuples

char f1_name[50];
char f1_data[50];
sscanf(f1, "%s=%s", f1_name, f1_data);  

char f2_name[50];
char f2_data[50];
sscanf(f2, "%s=%s", f2_name, f2_data);  
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top