SVNチェックアウトで E120104 エラーが発生したときの対処方法

先日 某社内ネットワークからインターネット上にある 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 の圧縮機能は有効です

この記事を共有しませんか?