dezz
Март 26, 2011 16:58:42
def get(host, path):
header = "GET " + path + " HTTP/1.1\r\n"
header += "Host: " + host + "\r\n"
header += "Connection: Close\r\n\r\n"
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, 80))
s.send(header)
return s.recv(1024)
С помощью s.recv получаю 1024 байт ответа. Вопрос: как узнать полный размер ответа, для его полного получения?
regall
Март 26, 2011 17:00:55
dezz
С помощью s.recv получаю 1024 байт ответа. Вопрос: как узнать полный размер ответа, для его полного получения?
Если сервер не устанавливает заголовок “Content-Length” - никак.
o7412369815963
Март 26, 2011 17:13:19
dezz
С помощью s.recv получаю 1024 байт ответа. Вопрос: как узнать полный размер ответа, для его полного получения?
для получения всех данных не обязательно знать объем, можно в цикле вызывать recv пока не получим все данные.
dezz
Март 26, 2011 17:35:22
Спасибо за ответы :)
Собственно оба варианта подходят, но лучше циклом пройтись.
dezz
Март 26, 2011 19:08:12
Всё оказалось не так просто.
Как оказалось сервер отправляет ответ чанками и в ответе нет заголовка “Content-Length”.
Если вызывать recv циклом, то программа подвисает, как мне сказали, наверно из-за того, что сервер не подчинается заголовку “Connection: Close”
Какие ещё есть идеи?
urllib не предлогать :)
o7412369815963
Март 26, 2011 19:21:41
dezz
Всё оказалось не так просто.
Как оказалось сервер отправляет ответ чанками и в ответе нет заголовка “Content-Length”.
Если вызывать recv циклом, то программа подвисает, как мне сказали, наверно из-за того, что сервер не подчинается заголовку “Connection: Close”
используйте таймаут.
asilyator
Март 29, 2011 05:21:15
Если серв не посылает Content-Length, то определить, передался ли полностью файл, невозможно. Алсо какой смысл не разрывать соединение? Keep-alive? Если послать следующий запрос, как отделить первый файл от второго?