protocol.dataReceived , который вы переопределяете, слишком низкоуровневый, чтобы служить цели без умной буферизации, которую вы не делаете - согласно документам, которые я только что процитировал,
Вызывается при получении данных.
Используйте этот метод для перевода в сообщение более высокого уровня.Обычно, некоторый обратный вызов будет сделан после получения каждого полного сообщения протокола.
Параметры
data
строка неопределенной длины.Помните, что вам, вероятно, потребуется буферизовать некоторые данные, так как могут быть получены частичные (или множественные) сообщения протокола!Я рекомендую, чтобы модульные тесты для протоколов вызывали этот метод с разными размерами чанков, вплоть до одного байта за раз.
Вы, похоже, полностью игнорируете эту важную часть документов.
Вместо этого вы могли бы использовать LineReceiver.lineReceived (конечно, наследуя от protocols.basic.LineReceiver
), чтобы использовать тот факт, что HTTP-запросы поступают в виде «строк» - вам все равно нужно присоединитьсязаголовки, которые отправляются в несколько строк, так как в этом руководстве говорит:
Строки заголовка, начинающиеся с пробела или табуляции, фактически являются частью предыдущей строки заголовка, сложенной в несколько строкдля легкого чтения.
Как только у вас получится хорошо отформатированный / проанализированный ответ (рассмотрите возможность изучения источников twisted.web , посмотрите, как это можно сделать),
получить имя домена, субдомена, значения порта из этого?
теперь заголовок Host
(cfr RFC раздел 14.23) содержит заголовоко.