認証の必要なPROXY越しのportsnapをしようとしても、必ず失敗する。
最初はportsnapサーバの調子が悪いだけかと思っていたのだが、自宅からだと認証は必要ないものの100%成功する。これは明らかにおかしいと調べたところ、何とか解決した。
先に結論:
portsnapで認証要のPROXYを突破するときは、下記環境変数を設定すること。
HTTP_PROXY="http://URL:port/"
HTTP_PROXY_AUTH="basic:*:username:pass"
以下、顛末
このFreeBSDマシンは認証の必要なPROXYの内側にあるわけだが、もともと俺はfetchおよびwget用に環境変数HTTP_PROXYを"http://username:pass@URL:port/"という書式で設定しており、fetchとwgetの動作に特に問題は無かった。
が、portsnapだけが失敗するので今回調べてみた。
portsnapはファイルの取得にfetch等を使用せず、独自のphttpgetというプログラムを使用している。
詳しくは[Pipelined HTTP GET utility](http://www.daemonology.net/phttpget/)を参照。
ここを見ると、作者はphttpgetに自信を持っているようだが、使う側の率直な意見として、好きなのを使わせてくれてもと思う。
phttpgetはportsnapとともにFreeBSDに取り込まれているので、ソースは下記の場所にある。
/usr/src/usr/sbin/portsnap/phttpget/phttpget.c
中をのぞいて見ると、環境変数HTTP_PROXY内にユーザネーム、パスワードを入れる方法は受け付けない事が分かる。
HTTP_PROXY_AUTHに書かないといけない。また、"basic:*:username:pass"という書式を想定しているようだ。こういった環境変数の一覧どっかにないものか。
下記が該当部分
/usr/src/usr/sbin/portsnap/phttpget/phttpget.c
__FBSDID("$FreeBSD: /repoman/r/ncvs/src/usr.sbin/portsnap/phttpget/phttpget.c,v 1.4.2.5 2006/03/09 17:08:41 ume Exp $");
<snip>
env_HTTP_PROXY_AUTH = getenv("HTTP_PROXY_AUTH");
if ((env_HTTP_PROXY != NULL) &&
(env_HTTP_PROXY_AUTH != NULL) &&
(strncasecmp(env_HTTP_PROXY_AUTH, "basic:" , 6) == 0)) {
/* Ignore authentication scheme */
(void) strsep(&env_HTTP_PROXY_AUTH, ":");
/* Ignore realm */
(void) strsep(&env_HTTP_PROXY_AUTH, ":");
/* Obtain username and password */
proxy_auth_user = strsep(&env_HTTP_PROXY_AUTH, ":");
proxy_auth_pass = env_HTTP_PROXY_AUTH;
}