2011-08-27 3 views
1

저는 Twisted 기반 WebDAV 서버 인 AkaDAV으로 작업 중이며 전체 litmus 테스트 슈트를 지원하려고합니다. 나는 현재 http 하위 제품군에 머물러있다.Twisted Web에서 "Expect : 100-continue"헤더를 어떻게 사용할 수 있습니까?

특히

, 내가 실행할 수 있습니다

$ TESTS=http litmus http://localhost:8080/steder/ 
-> running `http': 
0. init.................. pass 
1. begin................. pass 
2. expect100............. FAIL (timeout waiting for interim response) 
3. finish................ pass 

이 테스트는 기본적으로는 다음을 수행

  1. 열고 WebDAV 서버
  2. 문제 다음 PUT에 대한 소켓 :

    PUT/steder/litmus/expect100 HTTP/1.1 호스트 : localhost : 8080 Content-Length : 100 기대 : 100 연속

  3. 응답을 기다리는 응답은 HTTP/1.1 100 Continue입니다. 여기

  4. 업로드 100 바이트의 컨텐츠 페이로드

혼란스러운 것은이 PUT 요청이 트위스트로하지 않으며 결코처럼 보이는 것입니다. 온전한 체크로서, 을 통해 발행 된 PUT 요청이 작동하므로이 테스트 케이스에 대해 특별한 것이있는 것처럼 보였습니다.

내가 잘못 생각한 아이디어가 있습니까? 도움이된다면 sourcecode를 공유하게되어 기쁩니다.

편집 : http://twistedmatrix.com/trac/ticket/4673

사람이 해결 방법을 알고 있나요 :

조금 더 주위 검토 한 결과이 알려진 twisted.web 문제가 있음을 나타 납니까?

+0

트위스트 된 문제이기 때문에 Twisted 특정 포럼에서이 문제에 대한 응답 속도가 훨씬 빨라질 것입니다. stackoverflow.com이 채워지는 "일반 프로그래머"는 아닌 것으로 보입니다. –

답변

1

이 유스 케이스를 지원하기 위해 HTTP 프로토콜 구현을 수정하는 방법에 대해 좀 더 조사가 끝나면 분명합니다. 공식적인 픽스가 곧 Twisted 될 것으로 보이지만 그 동안 나는 이것을 해결 방법으로 사용하고 있습니다. 인스턴스화하기 전에

그냥이 코드를 포함하여 Site (또는 t.w.http.HTTPFactory) :

from twisted.web import http 


class HTTPChannelWithExpectContinue(http.HTTPChannel): 
    def headerReceived(self, line): 
     """Just extract the header and handle Expect 100-continue: 
     """ 
     header, data = line.split(':', 1) 
     header = header.lower() 
     data = data.strip() 
     if (self._version=="HTTP/1.1" and 
      header == 'expect' and data.lower() == '100-continue'): 
      self.transport.write("HTTP/1.1 100 Continue\r\n\r\n") 
     return http.HTTPChannel.headerReceived(self, line) 


http.HTTPFactory.protocol = HTTPChannelWithExpectContinue 

당신이뿐만 아니라 그들을 패치이 같은 방법을 사용할 수있는 프로토콜 레벨에서 다른 수정이 필요하면 내가 상상. 그것은 반드시 예쁜 것은 아니지만 그것은 나를 위해 작동합니다.

+1

이것은이 문제를 해결하는 매우 조잡한 방법입니다. 'expect continue'의 목적은 클라이언트가 그것을 보내기 시작하기 전에 큰 요청을 거절 할 기회를 서버에 제공하여 양쪽 파티를위한 대역폭을 절약하는 것입니다. 훨씬 더 좋은 해결책은 요청을 받아 들여야 함을 나타 내기 위해 true 또는 false를 반환 할 수있는 프로토콜의 메소드를 호출하는 것입니다 (기본값은 항상 true를 반환) – SingleNegationElimination

관련 문제