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