Memoize |
BasicWerk
EC Support
Technique
Facebook
|
20140614111235_factor_http_download_recover |
|
factor_http_download_recover
例えば複数の画像URLが含まれているリストを元にダウンロードしようとしたとき、リスト中のいずれかがエラー(404 Not Found など)になると、HTTP request failed エラーが throw されてそこで止まってしまう。
IN: scratchpad auto-use USE: http.client
! include Bad request
! "http://basicwerk.com/image/bw_SSxxxxx.png" is not exist.
IN: scratchpad auto-use { "http://basicwerk.com/image/bw_SSxxxxx.png" "http://basicwerk.com/image/bw_SS.png" }
IN: scratchpad auto-use [ >url download ] each
HTTP request failed:
T{ response
{ version "1.1" }
{ code 404 }
{ message "Not Found" }
...
}
Type :help for debugging help.
--- Data stack:
{ "http://basicwerk.com/image/bw_SSxxxxx.png"...
recover で囲ってみると、 IN: scratchpad auto-use [ >url [ download ] [ ] recover ] each --- Data stack: URL" http://basicwerk.com/image/bw_SSxxxxx.png" T{ download-failed f ~response~ }
ダウンロードが失敗すると download-failed という Tuple が返されていることが分かる。 download-failed? というエラーチェックワードがあるのでこれを利用しよう。 それと、いきなり download だと、失敗している場合でも同名のファイルがローカルに作られてしまう。 これを回避するために、以下の手順にしてみる。
コードに直すとこんな感じ。
! list
IN: scratchpad auto-use { "http://basicwerk.com/image/bw_SSxxxxx.png" "http://basicwerk.com/image/bw_SS.png" }
--- Data stack:
{ "http://basicwerk.com/image/bw_SSxxxxx.png"...
IN: scratchpad auto-use
[ >url dup
[ http-head ] [ download-failed? not ] recover
[ drop download ] [ 2drop ] if
] each
これで実際には 404 になる画像はスルーされて each が続行し、200 の画像はちゃんとダウンロードされる。
http://docs.factorcode.org/content/word-recover%2Ccontinuations.html http://docs.factorcode.org/content/vocab-http.client.html http://docs.factorcode.org/content/word-download-failed__que__%2Chttp.client.html
|
| © Shin Nakamura/BasicWerk 2014 |