🆙

Goa v3.12.4 更新情報

2023/08/20に公開

概要

Goa の更新情報メモです。

Goa v3.12.4

v3.12.4 の更新情報です。

主な変更内容

Fix returning correct status code on not hijacked streaming endpoints by @cubic3d in #3322

タイトル通りなのですが、エラーがあったときに下記のようなチェックをおこなって、haijack されているか/いないか、を分岐するようなコードを生成していたのですが、w.Write(nil) してしまうと、hijack されていないときに、これが status 200 OK を返してしまって問題になっていた、ということのようです。

	if _, werr := w.Write(nil); werr == http.ErrHijacked {
		// Response writer has been hijacked, do not encode the error
		errhandler(ctx, w, err)
		return
	}

分岐の方法を conn があるかないかで判定するように修正してバグが直されました。

	conn := v.Stream.(*RetrieveServerStream).conn
	if conn != nil {
		// Response writer has been hijacked, do not encode the error
		errhandler(ctx, w, err)
		return
	}

Handle reader errors in SkipResponseBodyEncodeDecode by @MichaelUrman in #3319

SkipResponseBodyEncodeDecde を利用しているとき、Goa はレスポンスをエンコードするコードを生成せず、ストリーミングの元となる reader を返すようになります。これにより、レスポンス全体をメモリに載せずに、ストリーミングで処理できるようになります。

ところで、レスポンスをストリーミングで処理している途中でエラーが生じた場合、どうしたらいいでしょうか?このエラー処理は、即時におこなわれなければならなく、panic(http.ErrAbortHandler) を発生させる必要があります。

・・・ということのよう。いまいち分かってないけど、このへん https://github.com/golang/go/issues/17790 の議論のようです。

レスポンスが途中で途切れてしまうようなエラーが発生した場合にも対応するようになった、という理解でいいだろうか?

こまやかな調整がおこなわれているな、とおもいました。

Happy hacking!

Discussion