先日、 某社内ネットワークからインターネット上にある Subversion リポジトリのチェックアウトを試みたところ下記のエラーが発生してしまいました。(サーバーは Subversion 1.9.5、 クライアントは Subversion 1.12.2 でした。)
svn: E120104: ra_serf: An error occurred during decompression
エラーメッセージに含まれる ra_serf
というのは Subversion で使われている HTTP クライアントライブラリです。この HTTP クライアントライブラリが Subversion サーバーから転送されてきた圧縮データを展開するときにエラーが発生したということです。
ウェブで ra_serf
を検索してみると、 上記のエラーのほか E120106: ra_serf: The server sent a truncated HTTP response body.
が発生したという報告も多数見つかります。
チェックアウトを試みたのは OSDN のリポジトリです。
- OSDN
- OSDN (Open Source Development Network) はソースコードリポジトリからウェブサイトのホスティングまで無料で提供してくれるオープンソース開発者の強い味方です。オープンソースの開発や配布方法で迷っている方はぜひ OSDN を試してみてくださいね。
いつもは HTTPS で接続するのですが、 このときは HTTP で接続しました。ソースコードを確認するのが目的で変更内容をコミットする予定はなかったからです。
コマンドプロンプトC:¥temp>svn co http://svn.osdn.net/svnroot/********/ A ******** A ********¥trunk A ********¥trunk¥src A ********¥trunk¥src¥main A ********¥trunk¥src¥main¥java A ********¥trunk¥build.gradle A ********¥branches A ********¥tags A ********¥trunk¥lib¥********.dll svn: E120104: ra_serf: An error occurred during decompression
すると、 このようなエラーが出てチェックアウトに失敗してしまいました。ra_serf
を検索して出てくる事例の多くはエラーコード E120106 に関するもので、 svn cleanup
や svn update
を実行すると改善するといった内容でした。
でも、 今はワーキングディレクトリの無いまっさらな環境にチェックアウトしようとしていますから svn cleanup
も svn update
も実行できません。きっと無関係でしょう。
エラーメッセージに decompression
(展開) と出ていますので、 まずは圧縮機能を無効にしてみます。Subversion の http-compression
パラメーターに no
を設定すると圧縮機能を無効になります。このパラメーターはコマンドラインオプションまたは設定ファイルで変更できます。
コマンドラインでHTTP圧縮を無効にする
コマンドラインで指定する場合は、 svn
コマンドの引数に --config-option servers:global:http-compression=no
を追加します。
コマンドプロンプトC:¥temp>svn --config-option servers:global:http-compression=no co http://svn.osdn.net/svnroot/********/ A ******** A ********¥trunk A ********¥trunk¥src A ********¥trunk¥src¥main A ********¥trunk¥src¥main¥java A ********¥trunk¥build.gradle A ********¥branches A ********¥tags A ********¥trunk¥lib¥********.dll Checked out revision 28.
HTTP 圧縮を無効にしたらチェックアウトが成功しました。
設定ファイルでHTTP圧縮を無効にする
servers
ファイルにオプションを設定しておくこともできます。svn
コマンドを実行したことがあれば、 %APPDATA%\Subversion
フォルダーが作成され、 その中に servers
ファイルがあるはずです。(Windows の場合)
通常、 %APPDATA%\Subversion
はC:\Users\username\AppData\Roaming\Subversion
のようなパスに展開されます。展開されるパスを気にしなくてもエクスプローラーのパス欄に %APPDATA%\Subversion
を貼り付けて Enter キーを押せば目的のフォルダーが開きます。
テキストエディターで servers
ファイルを開くと、 あらかじめ主要なパラメーターがコメントアウトされた状態で記載されていると思います。
servers[global] # http-proxy-exceptions = *.exception.com, www.internal-site.org # http-proxy-host = defaultproxy.whatever.com # http-proxy-port = 7000 # http-proxy-username = defaultusername # http-proxy-password = defaultpassword http-compression = no # No http-timeout, so just use the builtin default. # No neon-debug-mask, so neon debugging is disabled. # ssl-authority-files = /path/to/CAcert.pem;/path/to/CAcert2.pem # # Password / passphrase caching parameters: # store-passwords = no # store-ssl-client-cert-pp = no # store-plaintext-passwords = no # store-ssl-client-cert-pp-plaintext = no
http-compression
を検索して、 行頭の #
を削除すると http-compression
の設定が有効になります。値が no
や off
になっていることを確認してください。
もしも http-compression
が検索で見つからない場合は、 [global]
セクションに http-compression = no
という行を自分で追加します。
HTTPSでもエラーが解消しました
http-compression=no
を設定する方法のほか、 HTTP の代わりに HTTPS を使うことでも問題を回避することができました。
コマンドプロンプトC:¥temp>svn co https://svn.osdn.net/svnroot/********/ A ******** A ********¥trunk A ********¥trunk¥src A ********¥trunk¥src¥main A ********¥trunk¥src¥main¥java A ********¥trunk¥build.gradle A ********¥branches A ********¥tags A ********¥trunk¥lib¥********.dll Checked out revision 28.
某社内ネットワークの透過プロキシーが影響してエラーが発生していたのかもしれません。HTTPS の場合、 プロキシーは (トンネリングするだけで) 通信に介入できないので、 問題なくチェックアウトがしたのだと思います。(HTTPS でも ra_serf
の圧縮機能は有効です。)