Почему Rebol Raw Http Head запрашивает очень медленный размер удаленного файла по сравнению с информацией?функция - PullRequest
0 голосов
/ 06 декабря 2010

Ответ с информацией? очень быстро:

i: info? http://cdimage.ubuntu.com/daily/current/natty-alternate-i386.iso
i/size

При запросе http head это может занять в 10 раз больше времени, почему?

port: open tcp://cdimage.ubuntu.com:80
insert port "HEAD /daily/current/natty-alternate-i386.iso HTTP/1.1 ^/"
insert port "Host: cdimage.ubuntu.com ^/^/"
out: copy ""
while [data: copy port][append out data]
block: parse out rejoin [": " newline]
select block "Content-Length"

1 Ответ

2 голосов
/ 09 декабря 2010

режимы порта ответственны в этом случае.Если вы используете буферизованный ввод-вывод в режиме ожидания (который включен по умолчанию).

в http, клиент отвечает за закрытие порта, когда вы прочитали все байты сервера.

так как вы в основном используете tcp напрямую, используя порт вставки, вы также ответственны за обнаружение конца запроса и закрытие порта, когда поступило достаточное количество байтов.это может быть сделано только в / lines или / no-wait при выполнении низкоуровневого tcp fun.

Что-то, что читает и информация?сделать для вас.

, пока [data: copy port] [append out data]

не завершается, пока не истечет время ожидания (которое по умолчанию составляет 30 секунд в REBOL).

также, ваш запрос, похоже, содержит ошибку ...

попробуйте это:

port: open/lines tcp://cdimage.ubuntu.com:80
insert port {HEAD /daily/current/natty-alternate-i386.iso HTTP/1.0
Accept: */*
Connection: close
User-Agent: REBOL View 2.7.7.3.1
Host: cdimage.ubuntu.com
}
out: form copy port
block: parse out none ;rejoin [": ^/"]
probe select block "Content-Length:"

здесь кажется, что добавление / строк предотвратит ожидание.Вероятно, это связано с тем, как http-схема обрабатывает линейный режим при открытии.

поищите режимы портов REBOL в документации, а в сети это хорошо объяснено повсюду.

Если вы использовали трассировку / сеть, вы поняли, что все пакеты были получены, и что переводчик все еще ждет.Кстати, ваш код на самом деле вернул ошибку 400 в моих тестах.

...