簡易ダウンローダー

>(っ´∀`)っ ゃー » Blog Archive » Rubyで簡易ダウンローダを作ってみた にインスパイヤされてテキストのみですが簡易ダウンローダーを作成してみます。

Unix のコマンドでローカルのファイルと Web サーバー上のファイルを同じように扱える日が来ることを期待しているのですが、なかなかやってきません。 クラウドが全盛とはいえ、マウントしていなければ、扱いが分かれてしまうのは残念です。

そこで、以下のようなものを考えてみました。

  • http: で始まれば、Socket 通信で取得する
  • プロトコルが何もなければ、ローカルのファイルとして取得する

実際のコードは以下のようなものです。

#! /usr/local/bin/gawk -f
# print_file.awk

BEGIN {
    for (i = 1;i < ARGC; i++) {
        # "http://" で始まる場合は Socket で取得
        if (ARGV[i] ~ /^http:/) {
            port     = 80;
            base_url = gensub(/^http:\/\/([^/]+).*$/,   "\\1", 1, ARGV[i]);
            query    = gensub(/^http:\/\/([^/]+)(.*)$/, "\\2", 1, ARGV[i]);

            http_service    = "/inet/tcp/0/" base_url "/" port;
            http_request    = "GET " query " HTTP/1.0";

            print http_request  |& http_service;
            print ""            |& http_service;

            while ((http_service |& getline) > 0) {
                print $0;
            }
            close(http_service);

        # それ以外はローカルファイルとみなす
        } else {
            while (getline < ARGV[i] > 0) {
                print $0;
            }
            close(ARGV[i]);
        }
    }
}

実行結果は割愛しますが、以下のようにして実行します。

$ gawk -f print_file.awk 'http://gauc.no-ip.org/awk-users-jp/' ~/.zshrc

特にエラー処理もしていませんし、現在の gawk にはタイムアウト処理がないため、サーバーからの反応があるまで待ち続けてしまいます。 そうした場合には、timeout コマンドと併用すると良いかもしれません。

$ timeout -s 9 10 gawk -f print_file.awk 'http://gauc.no-ip.org/awk-users-jp/' ~/.zshrc

こうしたシームレスな扱いとしては file: という名前を付けて通常ファイルと明示する場合もありますが、あくまでローカル主体ということで、通常ファイルは今までどおり扱えるようにしています。

tag_gawk.png