web-dev-qa-db-ja.com

Axelを介してURLリダイレクトで添付ファイルをダウンロードする

Axel は、ファイルが添付ファイルとして含まれている別のURLにリダイレクトするURLを解決していません。ご覧のとおり、このURLをダウンロードしようとすると404が返されます。 (元のサイトはexample.comに置き換えられます)

~  ▶ axel https://eusa.example.com/zipstream/1581777.zip?tunnel=1&token=b7385bb62e3111e3ace1002481265109&storage=s09
[2] 767
[3] 768
Initializing download: https://eusa.example.com/zipstream/1581777.zip?tunnel=1
[1]   Exit 1                  axel https://eusa.example.com/zipstream/1581777.zip?tunnel=1
[3]+  Done                    token=b7385bb62e3111e3ace1002481265109
~  ▶ HTTP/1.1 404 Not Found

Webサイトのドキュメントでは、URLリダイレクトについて次のように説明しています。

最初の応答は常にリダイレクトです。ファイルの場所は「Location」ヘッダーにあります。クライアントは、新しいGET要求を新しい場所に送信する必要があります。ヘッダーのみが表示されます。

HTTP/1.1 302 FOUND
Server: nginx
Date: Thu, 09 Feb 2012 15:58:53 GMT
Content-Type: text/html; charset=utf-8
Connection: keep-alive
Keep-Alive: timeout=60
Content-Length: 385
Location: http://s01.example.com/v2/files/26205116/download?oauth_token=4a63387841ce11e1a047001018321b64

に行く:

HTTP/1.1 200 OK
Server: nginx
Date: Thu, 09 Feb 2012 15:58:53 GMT
Content-Type: application/x-rar
Content-Length: 3190802
Last-Modified: Fri, 16 Sep 2011 11:42:13 GMT
Connection: keep-alive
Keep-Alive: timeout=60
Content-Disposition: attachment; filename="file.rar"
Accept-Ranges: bytes

curlはURLをダウンロードできます。しかし、axelは私に404を与えます。Axelのマルチ接続機能が欲しいです。 curlを使用してURLを解決し、ダウンロードタスクをaxelに渡すにはどうすればよいですか?

2
Mohsen

引用の問題?

URLをaxelに一重引用符で囲んでみてください。 Bashは、コマンドをバックグラウンドで実行するように指示するときに、URLのparam引数の&を解析しようとしています。

$ axel 'https://eusa.example.com/zipstream/1581777.zip?tunnel=1&token=b7385bb62e3111e3ace1002481265109&storage=s09'

アクセルバグトラッカー

Axelの未解決のバグのリストを調べると、この問題は以前に特定されているようであり、作成者はこの問題に対応していないようです。

これらを参照してください 詳細については問題

これらの問題について何の動きもなく経過した時間の長さを考えると、私はこのプロジェクトが死んだと思います。それでも使用できるかもしれませんが、それを運転している人は誰もいません。

これはオープンソースの世界ではそれほど珍しいことではなく、この状態のプロジェクトでソースコードを取得し、それを引き続き使用して自分で保守できるという意味で、このライセンスモデルをユニークなものにしているのです。

このプロジェクトのソースコードは、svnから簡単にダウンロードできます。プロジェクトのコードリポジトリ:

ダウンロードとコンパイル

次のようにリポジトリのコピーをダウンロードできます。

$ svn co svn://svn.debian.org/svn/axel/

私のFedora19ボックスでは、コードが完全に構成およびコンパイルされるため、コードベースを変更することを選択した場合、このプロジェクトは実際には良好な状態になります。

configure

$ ./configure
Configuration done:
  Internationalization enabled.
  Debugging disabled.
  Binary stripping enabled.

make

$ make
msgfmt -vo nl.mo nl.po
40 translated messages, 6 fuzzy translations, 4 untranslated messages.
msgfmt -vo de.mo de.po
46 translated messages, 4 fuzzy translations.
msgfmt -vo ru.mo ru.po
46 translated messages, 2 fuzzy translations, 2 untranslated messages.
msgfmt -vo zh_CN.mo zh_CN.po
42 translated messages, 6 fuzzy translations, 2 untranslated messages.
gcc -c axel.c -o axel.o -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -Os  -Wall
gcc -c conf.c -o conf.o -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -Os  -Wall
gcc -c conn.c -o conn.o -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -Os  -Wall
gcc -c ftp.c -o ftp.o -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -Os  -Wall
gcc -c http.c -o http.o -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -Os  -Wall
gcc -c search.c -o search.o -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -Os  -Wall
gcc -c tcp.c -o tcp.o -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -Os  -Wall
gcc -c text.c -o text.o -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -Os  -Wall
gcc *.o -o axel -pthread
strip axel

私はそれをコンパイルすることができ、axelの完全に使用可能なバイナリを取得しました。

$ ls -l | grep "axel$"
-rwxrwxr-x. 1 saml saml 35816 Dec 14 21:56 axel

コードベースを変更しますか?

焦点を当てたいと思うコードのセクションは、ファイルconn.cにあります。

                conn_exec( conn );
                conn_disconnect( conn );
                /* Code 3xx == redirect                         */
                if( conn->http->status / 100 != 3 )
                        break;
                if( ( t = http_header( conn->http, "location:" ) ) == NULL )
                        return( 0 );
                sscanf( t, "%255s", s );
                if( strstr( s, "://" ) == NULL)
                {
                        sprintf( conn->http->headers, "%s%s",
                                conn_url( conn ), s );
                        strncpy( s, conn->http->headers, MAX_STRING );
                }

C/C++は私の母国語ではないので、このコードをgdb(別名GNUデバッガー)で実行するか、printfステートメントは、axelが問題のあるURLにアクセスしたときに何が起こっているかを確認します。

4
slm