Почему Rebol Raw Http Head Request для получения размера удаленного файла очень медленно по сравнению с info? функция

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

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

С HTTP-запросом на заголовок это занимает, может быть, в 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"

person Rebol Tutorial    schedule 05.12.2010    source источник


Ответы (1)


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

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

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

Что то читал и инфа? сделать для вас.

в то время как [данные: копировать порт] [добавить данные]

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

Кроме того, ваш запрос кажется ошибочным ...

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

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:"

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

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

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

person moliad    schedule 09.12.2010