プロキシ認証環境下でのrbenvからrubyのインストールしたらcrulコマンドが邪魔してきた話

# 今回の困りごと
社内プロキシ傘下にあるUbuntu環境の中で、rbenvでrubyをインストールしようとしたところ、こんな具合のエラーが出ました。
というわけで、今回はこのエラーをやっつけます。

```
 $ rbenv install 3.22
 ==> Downloading ruby-3.2.2.tar.gz...
 -> curl -q -fL -o ruby-3.2.2.tar.gz https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.2.tar.gz
   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                  Dload  Upload   Total   Spent    Left  Speed
   0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
 curl: (35) OpenSSL SSL_connect: 接続が相手からリセットされました in connection to cache.ruby-lang.org:443
 error: failed to download ruby-3.2.2.tar.gz
 
 BUILD FAILED (Ubuntu 20.04 on x86_64 using ruby-build 20231114-4-gd312f5a)
```

# 環境
* Ubuntu20.04
* プロキシ認証

最近はWSL2上のUbuntuをいじってましたが、今回はUbuntu端末単体の話となります。

# 原因はcrulコマンドのプロキシ認証
「またプロキシなのか！？」「なんだこれは！？」「プロキシか！？」って疑ったら[^1]、エラー文の中に`curl: (35) OpenSSL SSL_connect: 接続が相手からリセットされました`とあるので、やっぱりまたプロキシですね。
といわけで`curl`コマンドのプロキシ認証やっていきましょう。

# curlコマンドのプロキシ認証
`curl`のプロキシは
```
curl -U "ユーザー名":"パスワード" -x "プロキシのアドレス":"ポート番号" -L -o "ファイル名" URL
```
といった具合で認証させられますが、毎度毎度こんな長ったらしいコマンドライン作るのも面倒なので、別に設定ファイルを作ります。
今回はユーザーのホームディレクトリ直下に`.curlrc`と設定ファイルを作成します。

```
 $ vim ~/.curlrc
 proxy = "http://proxy address:port"
 proxy-user = "username:password"
```
Bashに干渉しているので、パスワードに記号があったらエスケープさせるのも忘れずに。
これでインストールできるでしょう。

# と思いきや
```
code:linux
  $ rbenv install 3.2.2
  ==> Downloading ruby-3.2.2.tar.gz...
  -> curl -q -fL -o ruby-3.2.2.tar.gz https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.2.tar.gz
    % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                   Dload  Upload   Total   Spent    Left  Speed
    0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
  curl: (35) OpenSSL SSL_connect: 接続が相手からリセットされました in connection to cache.ruby-lang.org:443
  error: failed to download ruby-3.2.2.tar.gz
```
状況は変わらず。
ここまで来て駄目だったら、己の日頃の行いを疑いますが残念ながら心当たりは無いです。[^2]
となると、`rbenv`の中で`ruby`の構築を行ってる箇所に原因があります。
`rbenv`の中で`ruby`の構築は`~/rbenv/plugins/ruby-build/bin/ruby-build`で行ってます。
その中に以下のような`curl`の記述がありました。この当たりが怪しいですね。

```
 http_head_curl() {
   # shellcheck disable=SC2086
   curl -q -sILf $CURL_OPTS "$1" >/dev/null
 }
 
 http_get_curl() {
   # shellcheck disable=SC2086
   log_command curl -q -fL $CURL_OPTS -o "$2" "$1" 2>&3
 }
```

この`curl`のオプションに`-q`がありますが、これが`Disable .curlrc`という挙動をとります。つまりせっかく設定した`.curlrc`を無視するようになってしまいます。
というわけで以下のような具合で`-q`を除外しましょう。
念の為、バックアップもとっておきます。

```
$ cd ~/rbenv/plugins/ruby-build/bin/
$ cp ruby-build ruby-build_org
```

```
 http_head_curl() {
   # shellcheck disable=SC2086
   curl -sILf $CURL_OPTS "$1" >/dev/null
 }
 
 http_get_curl() {
   # shellcheck disable=SC2086
   log_command curl -fL $CURL_OPTS -o "$2" "$1" 2>&3
```

# 再度インストール
```
 $ rbenv install 3.2.2
 ==> Downloading ruby-3.2.2.tar.gz...
 -> curl -q -fL -o ruby-3.2.2.tar.gz https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.2.tar.gz
   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                  Dload  Upload   Total   Spent    Left  Speed
 100 21.0M  100 21.0M    0     0  4641k      0  0:00:04  0:00:04 --:--:-- 4812k
 ==> Installing ruby-3.2.2...
 -> ./configure "--prefix=$HOME/.rbenv/versions/3.2.2" --enable-shared --with-ext=openssl,psych,+
 -> make -j 12
 -> make install
 ==> Installed ruby-3.2.2 to /home/s220125/.rbenv/versions/3.2.2
```

バージョンも確認しておきましょう。
```
 $ ruby --version
 ruby-3.2.2
 ```
 できましたー。

[^1]:蒸気暴威……！
[^2]:先日は献血に行ってきて功徳を積んでいます。