LoginSignup
2
2

More than 5 years have passed since last update.

caddy-cgi に機能追加したくてフォーラムで質問してみたらそのまま作者の方が実装してくれてしまった話

Last updated at Posted at 2019-03-17

CaddyでCGIを使うためのプラグイン、caddy-cgiを読んでみた。

そもそもなにがやりたかったのかというと、Caddyfileの中で、

cgi {
  match /hello
  exec {.}/app/cgi/hello.sh
  env WORKDIR={.}/app/cgi
}

みたいな感じでCGIのルートディレクトリを環境変数WORKDIRでCGIスクリプトに渡してCGIスクリプト側でcd ${WORKDIR}しているところを、

cgi {
  match /hello
  exec {.}/app/cgi/hello.sh
  workdir {.}/app/cgi
}

のような感じでCaddyfileでワーキングディレクトリを設定して、cdした状態でCGIスクリプトを実行するようにさせたかった。
(systemd.execだとWorkingDirectoryというディレクティブがある)
caddy-cgiではいまのところ、このようなことはできないっぽいので、プラグインに修正を加えてできるようにしたい。

まず、caddy-cgiがどこでCGIスクリプトをexecしているのかを探す。
CGIなんだから、このプラグインの中でプロセスをexecしてるに違いない、と思ってcmdだとかexecだとかforkだとかのキーワードでgrepしてみたのだが、それっぽい箇所が見当たらず。

そこで、Caddyのフォーラムで質問してみたら、なんとcaddy-cgiの作者のjungさんが直々に答えてくれた。
(アイコン画像から察するに、jungさんは馬を連れているイケおじである)

jungさんによると、

caddy-cgi lets the Go standard library handle this part. See host.go

とのことだった。

これを頭において、もういちど読んでみる。

https://github.com/jung-kurt/caddy-cgi/blob/master/cgi.go#L154 が実際にCGIを実行している箇所っぽい。

cgiHndの出処を探す。
https://github.com/jung-kurt/caddy-cgi/blob/master/cgi.go#L103 の関数定義から、cgiHndの型はcgi.Handlerだとわかる。

cgi.Handlerの仕様を見てみる。
https://golang.org/src/net/http/cgi/host.go?s=1282:2432#L51

// Dir specifies the CGI executable's working directory.
// If Dir is empty, the base directory of Path is used.
// If Path has no base directory, the current working
// directory is used.
Dir string

とあるので、

https://github.com/jung-kurt/caddy-cgi/blob/master/cgi.go#L106 でCGIのワーキングディレクトリを設定していることになる。

そしたら、あとはCaddyfileのcgiディレクティブにサブディレクティブworkdirを追加して、cgi.go#L106 でドキュメントルートを渡すかわりに、workdirサブディレクティブで設定した値を渡すようにcaddy-cgiを修正すればよさそう。

と、ここまでわかったところで、jungさんから「dirってサブディレクティブ追加したるよ!できたら知らせるよ!」との返信があった。。。

超ありがたいが、プルリク送れるチャンスでわ!?と思ってたので、世の中そんなに甘くはなかった。
うーん、まあ、自分の学習のために自分でもやってみよっと・・・。

2019-03-19 追記:
https://caddyserver.com/download から落とせるビルド済みバイナリで、caddy-cgiのdirオプションが動作していることを確認できました。
Caddyfileは以下のような感じになります。

cgi {
  match /dirtest
  exec {.}/app/cgi/dirtest.sh
  #dir /Users/miminashi  # 絶対パスも指定できる
  dir ./app/cgi          # 相対パス指定の場合は、caddyのワーキングディレクトリが起点になる
  #dir {.}/app/cgi       # これはダメ
}

ちなみに、diffはこんな感じだった。
メインの修正は思ってた通りの感じだったけど、テスト書いたりとか、ドキュメント修正したりもあるし、いきなりこれをやるのは自分にはちょっと難しかったかもしれない。
でも、このdiffを見たら、caddy-cgiに機能追加してプルリク投げるには何をしたらいいかがわかったし、今度なにか追加したくなったときの参考にしようと思う。

jungさん、本当にありがとうございました。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2