2013-07-04 2 views
1

HTTP 요청을 이해해야하는 간단한 HTTP 서버를 만듭니다.HTTP 패킷을 구문 분석하는 올바른 방법은 무엇입니까?

크롬과 같은 브라우저는 HTTP 연결을 사용하여 여러 개의 HTTP 요청을 보낼 수 있다는 HTTP Pipelining 기술을 사용합니다.

이제 여러 HTTP 요청 사이의 경계를 말하기가 어렵습니다. 한 가지 명백한 예는 GET 요청과 무작위 데이터의 양식 업로드입니다.

내가 지금 어떻게 생각하는지, 내가 \r\n과 함께 제공된 모든 데이터를 분할, 다음은 HTTP 요청과 같은 있는지, 모든 회선을 점검, 예를 들어 ^(GET|PUT|HEAD|POST|MOVE|TRACE) /[^ ]+ HTTP/[0-9]+\.[0-9]+$

하지만 여전히 어떤 아이디어가 불법이 될 수 ? (기존 HTTP 서버 라이브러리를 사용하라고 말하지 마십시오.)

답변

6

HTTP 프로토콜 사양 인 RFC 2616을 잘 읽으십시오. HTTP 요청은이 부분으로 구성 :

  1. 시작 라인
  2. 0 개 이상의 헤더 행
  3. 빈 라인

당신은 포함 출발 선을, 구문 분석하는 것으로 시작 요청 본문 첫 번째 줄 바꿈 (캐리지 리턴 및 줄 바꿈, CRLF)까지 읽습니다. 그런 다음 빈 줄 (두 개의 연속 된 CRLF 쌍)을 읽을 때까지 줄을 읽음으로써 헤더를 읽습니다.

헤더를 읽은 후 Content-Length 및/또는 Transfer-Encoding 헤더가 있는지 확인하여 요청 본문이 있는지 여부를 확인할 수 있습니다. 그 중 하나를 얻은 경우 요청 본문의 길이를 알려주고 그런 많은 양의 데이터를 읽습니다 (이 경우 여러 번 읽어야 할 수도 있습니다 (예 : chunked 전송 인코딩).

요청 본문을 읽은 후에는 완료되었습니다! 그러면 다음 요청을 읽을 준비가 된 것입니다.

+0

파이프 라이닝과 관련하여, 거기에 있어야하는 몸체의 양 (0 이상)을 읽었을 때 연결이 끊어 졌음을 의미하는 EOF를 얻거나 아무 것도하지 않습니다. 당신은 더 많은 것을 얻을지도 모른다. 그렇지 않으면 당신이하지 않을지도 모른다). 그렇지 않으면 당신이 더 많이 보는, 그것은 또 다른 요청이다. 그래서 단지 당신이했던 것을해라. – xaxxon

+0

Adam보다 훨씬 나은 대답입니다. –

1

기존 라이브러리를 사용하지 않으려는 경우 HTTP 요청을 구문 분석하는 방법은 지정된 RFC HTTP 요청의 형식을 정의한 다음 해당 형식으로 데이터를 구문 분석하는 코드를 작성하십시오.

단일 연결을 통해 여러 개의 요청을 제출할 수있는 HTTP 파이프 라이닝 기능은 HTTP 1.1 기능입니다. 사용자는 을 허용하지 않습니다. 서버는 단일 요청을 읽고 HTTP/1.0 응답을 보내고 연결을 닫을 수 있습니다. 모든 웹 브라우저는이를 정상적으로 받아 들일 것으로 예상됩니다.

관련 문제