render.Render() writes to writer unexpected data of aliased type
評価
調査の方向性
リンク先の69行目にある render.go から始め、提供されているエイリアス型と httptest の例を使って問題を再現します。render.Render がカスタム Render メソッドとデフォルトの responder をどのように処理するかを追跡し、完了した動作によって意図した response body と status だけが生成され、重複した出力がないことを確認します。
索引モデルが issue の本文から書いたものです。
説明
Hello,
During my work I faced unexpected behaviour on calling render.Render() when I was implemented Renderer interface on struct, which occured to be alias. Honestly, I have no clue why it's happening.
But it appears that render calls implicitly some default renderer IN ADDITION to my implementation.
It seems like it should exit here but it does not.
package main
import (
"fmt"
"io"
"net/http"
"net/http/httptest"
"github.com/go-chi/render"
)
type (
PublicProfile Profile
Profile struct {
Name string
Age int
}
ProfileResponse struct {
Name string `json:"name"`
}
)
func (p PublicProfile) Render(w http.ResponseWriter, rq *http.Request) error {
render.Status(rq, http.StatusNoContent)
render.JSON(w, rq, ProfileResponse{Name: p.Name})
return nil
}
func main() {
w := httptest.NewRecorder()
rq := httptest.NewRequest(http.MethodGet, "/", nil)
someProfile := Profile{Name: "John", Age: 42}
wrappedProfile := PublicProfile(someProfile)
render.Render(w, rq, wrappedProfile)
responseBody, _ := io.ReadAll(w.Body)
fmt.Println(w.Code, string(responseBody))
}
Output:
204 {"name":"John"}
{"Name":"John","Age":42}
The only way around I have found is setting default responder to empty func. Is this expected way to it?
render.Respond = func(w http.ResponseWriter, rq *http.Request, v interface{}) {}
- 主要言語
- Go
- スター
- 340
- フォーク
- 69
- PR マージ指標
- 30日以内にマージされた PR はありません
環境構築
このプロジェクトには開発コンテナ、Dockerfile、コントリビューションガイドがありません。まず README を読み、一般的な手順ははじめてのコントリビューションガイドを参照してください。
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
go-chi/render のほかの issue
-
Render and Bind panic on unexported nested interface fields対応中かも @duongynhi000005-oss が 1 日前に担当しました。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
-
Channel response appends JSON null after context timeout対応中かも @awais-ur-rehman が 2 日前に担当しました。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
-
難易度 5/5 1週間以上 初心者へのやさしさ 25/100
-
難易度 5/5 1週間以上 初心者へのやさしさ 10/100
-
Any concern render.JSON() can leak internal errors to outside?対応中かも @team-humaki が 51 日前に担当しました。 オープン
難易度 4/5 3〜5日 初心者へのやさしさ 30/100
似ている issue
-
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
-
[FEATURE]: Set fieldPath and reason on the CEL validation rules対応中かも @bjosv が今日担当しました。 オープンenhancement needs-triage
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
valkey-io/valkey-operator#618 ·
メンテナーはふだん 3 日以内に返信
-
agent-butler-finding bug
難易度 2/5 1〜3時間 初心者へのやさしさ 82/100
jordansmall/spindrift#6414 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
Icinga/icinga-kubernetes#294 ·
メンテナーはふだん 4 日以内に返信
-
Cluster details: the Control Plane version field has a different border color than its icon boxオープンkind/design sig/ui
難易度 1/5 1時間未満 初心者へのやさしさ 92/100
kubermatic/dashboard#8449 ·
メンテナーはふだん 1 日以内に返信