Разобраться с прерываниями загрузки в Tcl - PullRequest
0 голосов
/ 21 июля 2010

Я загружаю список файлов, используя http-пакет tcl, и мне было интересно, как лучше всего обрабатывать прерывания.Прямо сейчас схема моей процедуры загрузки выглядит следующим образом:

proc downloadFiles {url_list folder_location} {
    foreach {i} $url_list {
        regsub {.*/(.*)$} $i {\1} $name
        set out [open $folder_location/$name w+] //not worried about errors here
        if {[catch {set token [http::geturl $i -channel $out]}]} {
            puts "Could not download $i"
        } else {
            http::cleanup $token
            puts "Downloaded $i"
        }
        close $out
    }
}

Строка, в которой у меня возникают проблемы, - это выражение catch:

catch {set token [http::geturl $i -channel $out]}

Очевидно, несмотря на то, что я отключил свой интернет иостановка загрузки на полпути оператор catch все равно возвращает 0 для ошибок.Есть ли способ поймать это?

1 Ответ

1 голос
/ 23 июля 2010

Трудно обнаружить, что сеть временно исчезла (намеренно так; именно так работает TCP / IP, а HTTP просто находится поверх этого). Что вы можете сделать, это попытаться получить ожидаемую длину данных из заголовков HTTP и сравнить ее с длиной фактически полученных данных (для этого вы захотите включить двоичный режим, но в любом случае вы, вероятно, имеете дело с двоичными данными) .

Чтобы получить ожидаемую длину данных и загружаемую в данный момент длину, вам нужно немного волшебства с upvar (имя внутреннего псевдонима, state, произвольно):

upvar #0 $token state
puts "Content-Length was $state(totalsize), downloaded $state(currentsize)"

Обратите внимание, что многие страницы не предоставляют длину контента, поэтому поле totalsize равно нулю. Пакет http знает только в тех случаях, что у него есть конец, когда он доходит до конца.

При возобновлении загрузки вы захотите отправить заголовок Range. Это не поддерживается в явном виде, поэтому вам нужно указать его с помощью опции -headers для geturl.

http::geturl $url -headers [list Range bytes=$whereYouGotTo-]

Да, формат действительно такой прикольный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...