LoginSignup
8
8

More than 5 years have passed since last update.

gojiを使ってUNIXドメインソケットとかで起動したい

Last updated at Posted at 2015-09-23

この前GoのWebアプリケーションフレームワークのgojiのソースコードを見ていてなるほど!と思ったので紹介します。

GoでtcpやUNIXドメインソケットやファイルディスクリプタをbindしたサーバーを立てたくなることはよくあります。そういう時は標準ライブラリのnet/httpnet.Listerを作るところだけ分岐すれば後は共通的に扱えます。
なので適当にflagで指定して、tcpなら-tcpで、UNIXドメインソケットなら-sockでみたいな感じで指定するのが普通だと思いますが、gojiはちょっと違います。

gojiではtcpでもUNIXドメインソケットでも-bindでbind先を指定します。そのときの判定処理が以下のようになっています。

goji/bind.go at master · zenazn/goji

func listenTo(bind string) (net.Listener, error) {
    if strings.Contains(bind, ":") {
        return net.Listen("tcp", bind)
    } else if strings.HasPrefix(bind, ".") || strings.HasPrefix(bind, "/") {
        return net.Listen("unix", bind)
    } else if strings.HasPrefix(bind, "fd@") {
        fd, err := strconv.Atoi(bind[3:])
        if err != nil {
            return nil, fmt.Errorf("error while parsing fd %v: %v",
                bind, err)
        }
        f := os.NewFile(uintptr(fd), bind)
        defer f.Close()
        return net.FileListener(f)
    } else if strings.HasPrefix(bind, "einhorn@") {
        fd, err := strconv.Atoi(bind[8:])
        if err != nil {
            return nil, fmt.Errorf(
                "error while parsing einhorn %v: %v", bind, err)
        }
        return einhornBind(fd)
    }

    return nil, fmt.Errorf("error while parsing bind arg %v", bind)
}
  • :が含まれていたらtcp
    • :8080とか127.0.0.1:8080とか
  • 先頭が./ならUNIXドメインソケット
    • ./tmp/server.sockとか/tmp/server.sockとか
  • fd@から始まっていたらファイルディスクリプタで4文字目にファイルディスクリプタを続ける
    • fd@8みたいな指定でファイルディスクリプタを使える
  • einhorn@から始まっていたらEinhorn
    • こういうのもあるらしい

他にもやられている手法なのか知らないのですが、うまい指定方法だなーと思ったので参考になれば

8
8
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
8
8