Как использовать заголовок «Expect: 100-continue» в Twisted Web? - PullRequest
1 голос
/ 27 августа 2011

Я работал с AkaDAV , сервером WebDAV на основе Twisted, и я пытаюсь поддерживать полный набор тестов лакмус . В настоящее время я застрял в http-сьюте.

В частности, я могу запустить:

$ 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 / стедер / лакмус / ожидание100 HTTP / 1.1 Хост: localhost: 8080 Длина контента: 100 Ожидайте: 100-продолжение

  3. ожидает ответа HTTP/1.1 100 Continue ответа.

  4. загрузка 100-байтового содержимого

Смущает то, что этот запрос PUT никогда не попадает в Twisted. В качестве проверки работоспособности я подтвердил, что запросы PUT, отправленные через curl -X PUT ..., работают, поэтому кажется, что в этом тестовом примере есть что-то особенное.

Есть идеи, что я могу делать не так? Я рад поделиться исходным кодом, если это поможет.

EDIT:

После небольшого осмотра кажется, что это известная twisted.web проблема: http://twistedmatrix.com/trac/ticket/4673

Кто-нибудь знает обходной путь?

1 Ответ

1 голос
/ 29 августа 2011

После еще нескольких исследований довольно ясно, как изменить реализацию протокола 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

Полагаю, если вам потребуются другие модификации на уровне протокола, вы можете использовать этот же метод для их исправления. Это не обязательно красиво, но это работает для меня.

...