⛓️

GoでHTTPミドルウェアをチェインするライブラリを書いた

2022/11/06に公開

GoでHTTPサーバを書くとき、ミドルウェアを利用することがある。
関数を入れ子にすることで数珠つなぎにできるが記述が長くなってしまう。

go-chiなどのHTTPフレームワークにはミドルウェアをチェインするメソッドが生えていることがある。
しかし、このメソッドはフレームワークに強く依存していて使い回しにくいのでライブラリとして切り出した。

https://github.com/mokmok-dev/middlechain

どうやって使うの

このライブラリは以下のようにして使うことができる。

mux := http.NewServeMux()

handler := middlechain.Chain(mux,
  someMiddleware1,
  someMiddleware2,
  someMiddleware3,
)

// handle http request...

http.ListenAndServe(":8080", handler)

実装

http.ServeMuxなどのハンドラとミドルウェアを受け取って、内部で入れ子にして返すようにしている。

func Chain(h http.Handler, m ...func(http.Handler) http.Handler) http.Handler {
	if len(m) == 0 {
		return h
	}

	return m[0](Chain(h, m[1:cap(m)]...))
}
mokmok Tech Blog

Discussion