2012-02-23 2 views
3

웹 페이지를 다운로드해야하는 브라우저/프록시 지향 프로젝트에서 작업하고 있습니다. 웹 서버에 사용자 정의 HTTP 요청을 보내면 서버 응답을 듣기 시작합니다.HTTP 서버에서 데이터 전송 완료 시점 알아보기

응답을 읽을 때 응답 헤더에서 Content-Length : -row를 확인합니다. 그 중 하나를 얻으면, 내가받은 데이터의 바이트 수를 항상 알고 있기 때문에 서버가 언제 데이터를 전송했는지를 판단하기가 쉽습니다.

서버에 Content-Length 헤더가 없으며 추가 요청을 위해 연결을 유지하는 경우 문제가 발생합니다. 예를 들어 Google 서버는 gzipped-content로 응답하지만 콘텐츠 길이는 포함하지 않습니다. 더 많은 데이터 대기를 중단하고 연결을 닫을 때 어떻게 알 수 있습니까?

잠시 동안 데이터를받지 못했을 때 연결을 닫는 데 시간 초과 값을 사용하는 것을 고려해 보았지만, 잘못된 방법으로 보입니다. 예를 들어 Chrome은 나와 같은 페이지를 다운로드 할 수 있으며 언제 연결을 닫아야하는지 정확하게 알고있는 것 같습니다.

답변

2

IETF RfC 2616에서 청크 인코딩 및 Content-Range를 검색하십시오.

HTTP가 같이 알 수없는 길이의 내용을 반환하도록 설계되었습니다 대답에 대한

HTTP/1.1 200 OK 
Content-Type: text/plain 
Transfer-Encoding: chunked 

25 
This is the data in the first chunk 

1C 
and this is the second one 

3 
con 
8 
sequence 
0 

source Wikipedia

+0

이것이 압축 된 데이터에도 적용되는 경우이를 해결하는 올바른 방법 인 것으로 보입니다. (Content-Length가없는 일부 요청에서 Transfer-Encoding : 헤더를 본 이후로 가정합니다). 감사! – Accatyyc

1

Connection: close 헤더를 강제로 설정하여 Content-length이 설정되어 있는지 여부와 상관없이 서버가 출력이 완료된 후에 서버가 연결을 닫을 것을 확신하도록 할 것입니다. 1. 소켓 가까운 보통 소켓이 종료됩니다 2 소켓 타임 아웃

, 그것은 또한 소켓을 선언하는 의미가 : 성능은 부분적으로 이가지 경우가 예상 할 수있다이

+0

감사합니다. 이것은 내가 이미 시도한 것이지만 많은 서버가이를 무시하므로 바보가 아닙니다. 또한 Chrome에서 보내는 요청을 살펴보면 항상 연결 : 연결 유지를 사용하고 있지만 연결이 완료된 시점을 알 수 있습니다. 그러므로 나는 이것이 문제를 해결하는 잘못된 방법이라고 생각한다. – Accatyyc

+0

서버가 연결을 무시하는 경우 : 닫기를 수행하면 큰 문제가 발생하며 매우 짧은 시간 제한 (예 : 2 초)을 사용해야합니다. 연결 : 닫기를 사용하면 서버가 연결을 닫아야합니다. 연결을 닫지 않는 것은 프로토콜 위반입니다. 또한 Chrome에서 태그가 "완료되었습니다"라고 판단 할 것으로 의심됩니다. –

+0

압축 해제 될 때까지 압축 된 문서의 HTML 태그를 읽는 것이 좋지 않기 때문에 그렇게 생각하지 않습니다. bew의 대답을보세요. Chrome은 청크 크기를 읽음으로써 해결합니다. – Accatyyc

0

에 의해 영향을받을 것이다 시간 초과. 소켓 가깝거나 소켓 타임 아웃 (또는 크기 인수에 도달)까지 읽은 인수의 사이즈 -

int stream.read(byte[],size); 

은 [] 바이트의 실제 크기를 반환 기억하십시오.

감사합니다.