HTTP_PROXY
環境変数だけでなんとかしたい。
背景
認証付きのProxyサーバー越しに、MelpaなどのPackage Repositoryにアクセスする場合、下記のリンクのような方法をとるのがよく見られるような気がする。
しかし、他の多くのソフトウェア(例えば、gitやyumなど)は、環境変数HTTP_PROXY
を参照して、アクセスしてくれるのに、なんとなくemacsだけこのような方法を取るのが、気になってきた。
因みに、認証なしの場合は、HTTP_PROXY
の設定だけでアクセスが可能である。
正確には、認証付きの場合でも、認証情報を含めないURLをHTTP_PROXY
に設定しておいて(username:passwordの部分を含めないで)おけば都度(起動ごと?)にユーザーIDとパスワードを聞かれるので入力すれば可能である。
やったこと
というわけで、やったこととしては、起動時にHTTP_PROXY
の設定の有無を確認して、URLをパースして設定するようにしました。
;; Proxy setting
(cond ((getenv "HTTP_PROXY")
(let* ((url_ (url-generic-parse-url (getenv "HTTP_PROXY")))
(auth_ (if (and (url-user url_) (url-password url_) )
(base64-encode-string
(format "%s:%s" (url-user url_) (url-password url_)))
nil))
(host_ (format "%s:%s" (url-host url_) (url-portspec url_))))
(defvar url-proxy-services
(list (cons "no_proxy" "^\\(localhost\\|10.*\\)")
(cons "http" host_)))
(if auth_
(defvar url-http-proxy-basic-auth-storage
(list (list host_ (cons "Proxy" auth_)))))
)))
一応これで、動いているっぽい。
書いていて、迷ったというか妥協したところ。
- 認証なしのURLがHTTP_PROXYがに設定されている場合、ちゃんと動くかわからないが、手元にそういう環境がないため、気にしないことにする
- 参考リンクだと、
url-proxy-services
への設定はsetq
でおこなっているのだが、flycheckを使っていると"assignment to free variable `url-proxy-services'"というWarningがでる。そういう場合はdefvar
にしろと書いてあったので、そうしたが、正しい対処法だろうか?- もしかして:
setq-default
- もしかして:
別解答
CNTLMなどを使って、ローカルに認証を回避するProxyサーバーを立てるという解も考えられるかと思います。前述の通り、認証がなければもともとHTTP_PROXYだけで行けるはずなので。
環境変数設定だけでできる方がポータブルかな?と思ったのですが、URLにパスワードの平文を埋め込む方式だと.zshrcなどに記述すると、社外のリポジトリなどに置くのがためらわれるという難点もあるため、この方法も良さそう。