認証の必要なPROXY越しのportsnap

sourceはあまり見ないのだけど



認証の必要な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を参照。
ここを見ると、作者は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 $");

env_HTTP_PROXY_AUTH = getenv("HTTP_PROXY_AUTH");
if *1 {

/* 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;
}

*1:env_HTTP_PROXY != NULL) && (env_HTTP_PROXY_AUTH != NULL) && (strncasecmp(env_HTTP_PROXY_AUTH, "basic:" , 6) == 0