認証の必要な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;



  }