🆙
Goa v3.12.4 更新情報
概要
Goa の更新情報メモです。
Goa v3.12.4
v3.12.4 の更新情報です。
主な変更内容
#3322
Fix returning correct status code on not hijacked streaming endpoints by @cubic3d inタイトル通りなのですが、エラーがあったときに下記のようなチェックをおこなって、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
}
#3319
Handle reader errors in SkipResponseBodyEncodeDecode by @MichaelUrman inSkipResponseBodyEncodeDecde を利用しているとき、Goa はレスポンスをエンコードするコードを生成せず、ストリーミングの元となる reader を返すようになります。これにより、レスポンス全体をメモリに載せずに、ストリーミングで処理できるようになります。
ところで、レスポンスをストリーミングで処理している途中でエラーが生じた場合、どうしたらいいでしょうか?このエラー処理は、即時におこなわれなければならなく、panic(http.ErrAbortHandler)
を発生させる必要があります。
・・・ということのよう。いまいち分かってないけど、このへん https://github.com/golang/go/issues/17790 の議論のようです。
レスポンスが途中で途切れてしまうようなエラーが発生した場合にも対応するようになった、という理解でいいだろうか?
こまやかな調整がおこなわれているな、とおもいました。
Happy hacking!
Discussion