У меня есть длина содержимого длина заголовка, а также заголовок
Вы не. В receive_http_response_header
вы проверяете HTTP_HEADER_DELIMITER
всегда только самый последний байт (chunk
вместо header
), что означает, что вы никогда не совпадете с концом заголовка:
while HTTP_HEADER_DELIMITER not in chunk:
chunk = sock.recv(ONE_BYTE_LENGTH)
if not chunk:
break
else:
header += chunk
Тогда вы просто предположите, что вы прочитали полный заголовок, в то время как на самом деле вы прочитали полный ответ. Это означает, что другой recv
, который вы делаете при попытке прочитать тело ответа, вернет только 0, поскольку данных больше нет, т. Е. Тело уже было включено в то, что вы считаете заголовком HTTP.
Помимо что receive_body
также неверно, так как вы делаете аналогичную ошибку в receive_http_response_header
: цель не состоит в том, чтобы снова и снова читать recv
content_length
байт, пока больше не будет доступных байтов, как вы делаете в настоящее время, но цель состоит в том, чтобы вернитесь, когда length(body)
соответствует content_length
, и продолжайте чтение оставшихся данных, пока тело не будет полностью прочитано.