wget 1.12 for windows

執筆 2010/11/17

今日のお題
wget 1.12 と wget 1.11.x for windows
を検証してみましょう

ダウンロード
    ソース: gnuのサイトにあります。
    バイナリ: 配布サイトまたは、自分で構築
    wget-1.12-win32.zip

1.11.4から1.12への主なポイント
  • ソースレベルで前版とかなり違う
  • CSSがサポートされました
  • Internationalized Resource Identifiers (IRIs, RFC3987)のサポート
    libidn と libiconvが必用らしい。
  • windows : 1.11.4までは、wopenではなくfopenで書き込みのためutf8のurlは保存時に壊れていました。
    1.11.4: url.cのurl_file_name関数のfnameの修正で対応できます。
    ※unix環境では、1.11.4でも問題はないようです。 
  • そのままでは、Visual C++でコンパイルできなくなっています。
    wget-1.12/windows/READMEを参照

  その他詳しくは、wget-1.12/NEWSを参照

【構築へのヒント】
未改善点
・不完全なアトリビュートタグで失敗する 例<img src="a.gif" alt=>
  パッチ:  src/html-parse.c @@ -944,7
           /* <foo bar=> */
     -    goto backout_tag;
     +    continue;
・htmlコンバートオプションで失敗するらしい
  パッチ:  src/retr.c  @@ -828,7
    -    if (redirection_count && 0 != strcmp (origurl, u->url))
    +    if (0 != strcmp (origurl, u->url))

【msvcrtのdllが邪魔という場合】 埋め込みで構築します
  windows\Makefile.src
  +LDFLAGS    = $(LDFLAGS) /NODEFAULTLIB:msvcrt
 このオプションになっていないこと自体 タコ仕様。

【opennsslを内蔵したい】 埋め込みで構築します
  環境変数:LIBにopennsslのライブラリ(.lib)へのパスを加えれるとよい
  opennsslの欠陥のたびに構築しないでいいように
  通常は、動的ライブラリへのパスを設定し、動的リンク(dll)をお勧めします
  静的リンクもできます。

【考察】
  • このプロジェクトの特徴 安定版の修正版がなかなかない。
    マルチOSに対応した手軽な代用品があればいいのですけどね。

  • Unix?から派生したプロジェクトなのでwindowsサポートが弱い
    Unix環境を持っていれば、そちらの方がgetに失敗しない可能性が高い。
    しかしUnix環境はウイルスチェックが甘いので気をつけましょう。

  • その他見つけた欠陥
    • 特殊ファイル名を拒否しない
      DOS の予約語 (nul、aux、con、com1-9、lpt1-9, prn など)
      吹っ飛ぶ例:http://localhost/nul
      アドレスによっては、周辺機器に悪影響がでる可能性があります。
      「Naming a File」(http://go.microsoft.com/fwlink/?LinkId=76838) を参照してください。
      要点は信用できないサイトをwgetでgetしないこと ということ です。
      問題箇所は、url.cのurl_file_name関数あたりでしょうか。
      ※unixやcygwin版は普通に動くようです

  • FATシステムへの書き込み(NTFSしか使っていないので検証不能)
    1.11系では、FATシステムでは、@関係で失敗していましたが1.12系はどうなんでしょう。
    命名規則が同じなら落ちるでしょう。

  • wgetからサイトを守る方法
    • useragentで拒否
    • useragentを偽装した場合
    • robots.txt
    • ipやhostで遮断
  • 保存ファイル名を安全に
    1.11系までにあったファイル名の文字化け類が直ったといっても安全ではない。
    はやりのutf8だろうとか決めつけは厳禁です。
    %16進数のurlは、欧文、sjis、euc、utf8なのかはっきり言って短いとコードページの区別がつきません。
    パッチをあてて 1文字につき2バイト+数バイトかかってしまうが、総パス名の制限260を減らしてでも、
    一部のファイル名 及び 英数字と一部の記号以外は、16進数文字に強制変換してしまうほうが安全かもしれない。
    utf8の命名フォーマットから外れ+上記の条件で強制変換というルールもいいと思います。
    url.cのurl_file_name関数のfnameの修正で対応できます。
【結論】
 中途半端な実装のツール。
   とりあえず、windowsなら簡単に構築できるパッチをあてた 1.11.4でもいいと思う。