分散SCM Mercurialのレポジトリをxreaに置いて、HTTPSでのアクセスに挑戦してみた。
まず、HTTPでアクセスできるようにする。これはググればすぐに情報がでてくる。
基本は
Mercurial で手軽な共有レポジトリをつくろう
これ。さらに、うちのアカウントでは、SSHで接続したときにどうやってもrbashになってしまい、なにもできないので
XREA FREE で Mercurial を
を参考に、準備する。
ここまでで、HTTPでMercurial付属のhgweb.cgiを叩いてレポジトリを参照したりすることは可能になった。次にHTTPS。
xreaでHTTPSをつかう場合、共有SSLサーバ(ssN.xrea.com)を通してなんちゃってSSLアクセスになる。すなわち、http://example.com/hg/ とかであれば、https://ssN.xrea.com/example.com/hg/ みたいな。
CLIでアクセスしたときは、特に気にすることなく hg clone https://ssN.xrea.com/example.com/hg/ hoge でclone成功。
このとき注意点がある。https://ssN.xrea.com/example.com/hg (最後にスラッシュがあるか無いかに注目)としないこと。これをやると、Apache が http://example.com/hg/ に リダイレクトして、hg が real URL is http://... とか言って、HTTPでアクセスしちゃうので。
問題はブラウザでアクセスしたとき。クライアントからのURLは https://ssN.xrea.com/example.com/hg/ なのに、ssN.xrea.com が example.com に HTTP GET する仕組みなものだから、スクリプト内で自身のパスを取得したときに、example.comでのパスしかとれず、出力されたHTMLのAタグのパス指定がおかしくなる。 つまり、サーバ名の抜けた https://ssN.xrea.com/hg/... を指すことになって崩壊する。
利用者の多いCGIスクリプトとかにはこの問題の逃げ道が用意されていることが多いので、Mercurial側にも何かあるかと思って調べたけど、なさげ。仕方ないので、スクリプトを修正した。
ファイルは、Mercurialをインストールしたディレクトリの lib/python/mercurial/hgweb/hgweb_mod.py。
これの、URL生成部分を修正する。1.0だと行169。
req.url = '/example.com' + req.env['SCRIPT_NAME']
追記
上述の通り、レポジトリのあるサーバからみるとHTTPでのアクセスなので、hgrcには相変わらずpush_ssl = false がないと、push したときに ssl required と怒られる。