2011-02-26 1 views
2

예스 웹 프레임 워크를 사용하여 하스켈에서 웹 응용 프로그램을 개발 중입니다. (이 문제는 하스켈 및/또는 예 단지 완전성을 위해 이것을 언급합니다.) 요청을 처리하기 위해 Warp 서버를 사용하고 있으며 GZIP 압축과 관련된 Chromium/Firefox (Opera가 아닌)를 사용하여 사이트에 액세스 할 때 이상한 문제가 발생합니다.GZIP 압축 (브라우저에서만 가능)을 사용하여 HTTP 요청에서 내용이 잘림

Hello world!을 반환하는 사이트를 설정했습니다. 내가 netcat를 사용하여 사이트를 가져올 내가 gzipAccept-Encoding을 설정하면

  • , 내가 올바른 결과를 얻을. 즉, 내가받은 데이터의 압축을 풀 수 있고 올바르게 압축을 해제하면 Hello world!이됩니다.
  • Chromium 또는 Firefox를 사용하여 사이트를보고 싶다면 H (나머지 콘텐츠는 잘림)입니다. Content-LengthContent-Encoding 헤더가 서버에 의해 올바르게 설정되었는지 확인했습니다.

    withWebApp $ Warp.run 3000 
    

    이 난 요청입니다 :

    getRootR = return $ RepPlain $ toContent ("Hello world!" :: ByteString) 
    

    내가 표준 run 기능 워프를 호출하고 있습니다 : 여기

내가 Hello world! 문자열을 보낼 때 사용하는 코드입니다 netcat과 함께 보내면 작동합니다.

GET/HTTP/1.0 
Accept-Encoding: gzip,  

그리고 netcat을의 출력을 압축 해제의 결과 :

$ nc --idle-timeout=1 localhost 3000 < test | tail -n1 | gunzip 
nc: using stream socket 
Hello world! 

그리고 한 가지 더 : 내가 Wireshark에서 패킷을 사용하여 트래픽을 도청 HTTP 트래픽으로 표시하지만, 와이어 샤크 나에게 (text/plain)Continuation or non-HTTP traffic 것을 요구하면. 그 패킷은 나에게 힘들어 보인다.

그래서 Chromium이나 Firefox에서는 작동하지 않으며 그 이유를 알 수 없습니다. 아무도 이걸로 나를 도와주지 않거나 올바른 방향으로 나를 가리킬 수 있습니까?

+0

맹목적인 순간, 'http://foo.bar/ HTTP/1.1'을 (를) 얻으면 어떻게됩니까? – barsoap

+0

netcat을 통해 HTTP 1.0 대신 HTTP 1.1을 사용하면 어떻게됩니까? 나는 같은 결과를 얻는다. – Cedric

+0

워프 gzip 레이어 문제입니다. 이 모든 것들은 매우 새롭고 개발 중입니다. 난 warp들 (특히 msnoyman)에게 직접 연락을하고, 그때까지 gzip 압축을 끄십시오. – sclv

답변

3

대부분의 이유는 Content-Length가 올바르게 설정되지 않았기 때문입니다. 즉, 서버가 압축 된 데이터의 크기가 아니라 원본 콘텐츠의 크기를보고합니다. 위의 sclv는 웹 서버의 버그 여야합니다.

+0

고마워, 그 말이 맞았다! Content-Length는 압축 된 내용이 아닌 원래 내용과 일치합니다. 분명히 서버가 보낸 어떤 것이라도 gunzip을 먹었 기 때문에 netcat과 함께 작동했습니다. 이제 나는 이것을보고해야합니다. – Cedric

+1

그냥 명확히하기 : 이것은 워프의 버그가 아니라 wai-extra의 버그입니다.이 문제로 어려움을 겪고 있다면 wai-extra를 업그레이드해야합니다. Warp의 새로운 버전은 전혀 영향을 미치지 않습니다. –

1

나는 이것이 wai-extra에서 버그임을 확인했습니다. 올바른 동작은 gzip을 사용할 때 Content-Length 헤더를 제거해야하므로 Warp가 자동으로 청크 분할 전송 인코딩을 제공하는 것입니다. 나는 오늘 나중에 패치를 공개 할 것이다.