hack のためのネタ帳, etc,,,

Web サイトのミラーを構築しようとした場合に、再起して取得するコンテンツの URL に含まれる ~ が %E2%80%BE (U+203E: OVERLINE) 扱いされて、ローカルのフォルダが変になることがある。
具体的には、以下のような感じ。
$ wget -m -np http://foo.bar/~hoge/index.html
--2014-02-15 14:33:18--  https://foo.bar/~hoge/index.html
foo.bar (foo.bar) をDNSに問いあわせています... 127.0.0.1
foo.bar (foo.bar)|127.0.0.1|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 40673 (40K) [text/html]
`foo.bar/~hoge/index.html' に保存中

100%[======================================>] 40,673      --.-K/s 時間 0.08s

2014-02-15 14:33:19 (513 KB/s) - `foo.bar/~hoge/index.html' へ保存完了 [40673/40673]

--2014-02-15 14:33:27--  https://foo.bar/%E2%80%BEhoge/screen.css
foo.bar:443 への接続を再利用します。
HTTP による接続要求を送信しました、応答を待っています... 404 Not Found
2014-02-15 14:33:28 エラー 404: Not Found。

--2014-02-15 14:33:28--  https://foo.bar/~hoge/screen.css
foo.bar:443 への接続を再利用します。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 11886 (12K) [text/css]
`foo.bar/\342%80\276hoge/screen.css' に保存中

100%[======================================>] 11,886      --.-K/s 時間 0.001s

2014-02-15 14:33:28 (22.0 MB/s) - `foo.bar/\342%80\276hoge/screen.css' へ保存完了 [11886/11886]
以下の2つのディレクトリが掘られている。
  • foo.bar/~hoge
  • foo.bar/%80hoge
見て分かるように、コマンドラインで直接与えたコンテンツは素直に取得しに行っており問題は生じていない。
ところが再起して取得するコンテンツは、一旦 ~ を %E2%80%BE 扱いして失敗した後、再度 ~ にトライし、成功した場合でも、前者ではなく後者のディレクトリに格納するという動作をしている。

まず、--restrict-file-names オプションでもどうに出来ないか試してみたが、
IRI 対応で %E2%80%BE, ~ の順に試行する動作は変わらないため、
--restrict-file-names=nocontrol オプションを使うと、
  • foo.bar/~hoge
  • foo.bar/‾hoge
--restrict-file-names=ascii オプションを使うと、
  • foo.bar/~hoge
  • foo.bar/%E2%80%BEhoge
のように2つのディレクトリが生成されてしまい全く問題の解決にならなかった。

次に、--local-encoding, --remote-encoding オプションを試してみたところ改善が見られた。
どうもこれは Internationalized Resource Identifier (IRI) 周りの対応で妙な事になってる雰囲気。
少なくとも、以下の条件で、ミラーを構築させようとした場合には発生する模様。
  • サーバー側のファイル名エンコーディングは EUC-JP
  • http response header は Content-Type: text/html
  • html は <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
  • ローカルの環境変数は LANG=ja_JP.UTF-8

対策としては、以下の3つの対応のうちいずれか1つを行なえば回避出来ることを確認した。
  • --remote-encoding オプションに ASCII, EUC-JP, UTF-8 のいずれかを与える
  • --no-iri オプションを与える
  • 環境変数を LANG=C にする

以上の症状等は、以下の2つの環境で確認した。
$ uname -a
CYGWIN_NT-5.1 baraduke 1.7.27(0.271/5/3) 2013-12-09 11:57 i686 Cygwin

$ wget --version
GNU Wget 1.13.4 built on cygwin.

+digest +https +ipv6 +iri +large-file +nls -ntlm +opie +ssl/gnutls

Wgetrc:
    /etc/wgetrc (system)
ロケール: /usr/share/locale
コンパイル: gcc-4 -DHAVE_CONFIG_H -DSYSTEM_WGETRC="/etc/wgetrc"
    -DLOCALEDIR="/usr/share/locale" -I.
    -I/usr/src/wget-1.13.4-1/src/wget-1.13.4/src -I../lib
    -I/usr/src/wget-1.13.4-1/src/wget-1.13.4/lib -g -O2 -pipe
リンク: gcc-4 -g -O2 -pipe -liconv -lintl /usr/lib/libgnutls.dll.a
    /usr/lib/libtasn1.dll.a /usr/lib/libz.dll.a
    /usr/lib/libgcrypt.dll.a /usr/lib/libgpg-error.dll.a
    /usr/lib/libintl.dll.a -L/usr/lib/ncursesw /usr/lib/libiconv.dll.a
    -lgcrypt -lgpg-error -lz -lidn ftp-opie.o gnutls.o ../lib/libgnu.a

Copyright (C) 2009 Free Software Foundation, Inc.
ライセンス GPLv3+: GNU GPL バージョン 3 あるいはそれ以降のバージョン
<http://www.gnu.org/licenses/gpl.html>.
このソフトウェアはフリーソフトウェアです。自由に変更、再配布ができます。
法律が許すかぎり、全くの無保証です。

Hrvoje Niksic <hniksic@xemacs.org> によって書かれました。
バグ報告や質問は<bug-wget@gnu.org>へ
$ uname -a
Linux ubuntu-server-v1 3.2.0-58-virtual #88-Ubuntu SMP Tue Dec 3 17:58:13 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

$ wget --version
GNU Wget 1.13.4 built on linux-gnu.

+digest +https +ipv6 +iri +large-file +nls +ntlm +opie +ssl/openssl

Wgetrc:
    /etc/wgetrc (system)
ロケール: /usr/share/locale
コンパイル: gcc -DHAVE_CONFIG_H -DSYSTEM_WGETRC="/etc/wgetrc"
    -DLOCALEDIR="/usr/share/locale" -I. -I../../src -I../lib
    -I../../lib -D_FORTIFY_SOURCE=2 -Iyes/include -g -O2
    -fstack-protector --param=ssp-buffer-size=4 -Wformat
    -Wformat-security -Werror=format-security -DNO_SSLv2
    -D_FILE_OFFSET_BITS=64 -g -Wall
リンク: gcc -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat
    -Wformat-security -Werror=format-security -DNO_SSLv2
    -D_FILE_OFFSET_BITS=64 -g -Wall -Wl,-Bsymbolic-functions
    -Wl,-z,relro -Lyes/lib -lssl -lcrypto -lz -ldl -lz -lidn -lrt
    ftp-opie.o openssl.o http-ntlm.o ../lib/libgnu.a

Copyright (C) 2009 Free Software Foundation, Inc.
ライセンス GPLv3+: GNU GPL バージョン 3 あるいはそれ以降のバージョン
<http://www.gnu.org/licenses/gpl.html>.
このソフトウェアはフリーソフトウェアです。自由に変更、再配布ができます。
法律が許すかぎり、全くの無保証です。

Hrvoje Niksic <hniksic@xemacs.org> によって書かれました。
バグ報告や質問は<bug-wget@gnu.org>へ

関連:

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Wiki内検索

フリーエリア

管理人/副管理人のみ編集できます