@@ -179,6 +179,8 @@ func (ctx *Context) SetCookies(c ...*http.Cookie) {
179
179
// func()(body any, err error)
180
180
//
181
181
// 如果返回 body 的是 []byte 类型,会原样输出,其它类型则按照 [Context.Marshal] 进行转换成 []byte 之后输出。
182
+ // body 可能参与了 etag 的计算,为了防止重复生成 body,所以此函数允许 body 直接为 []byte 类型,
183
+ // 在不需要 body 参与计算 etag 的情况下,应该返回非 []byte 类型的 body。
182
184
func NotModified (etag func () (string , bool ), body func () (any , error )) Responser {
183
185
return ResponserFunc (func (ctx * Context ) {
184
186
if ctx .Request ().Method == http .MethodGet {
@@ -194,19 +196,18 @@ func NotModified(etag func() (string, bool), body func() (any, error)) Responser
194
196
return
195
197
}
196
198
197
- var data []byte
198
- if d , ok := b .([]byte ); ok {
199
- data = d
200
- } else {
201
- if data , err = ctx .Marshal (b ); err != nil {
202
- ctx .Error (err , ProblemNotAcceptable ).Apply (ctx )
203
- return
199
+ if data , ok := b .([]byte ); ok {
200
+ ctx .Header ().Set (header .ContentType , qheader .BuildContentType (ctx .Mimetype (false ), ctx .Charset ()))
201
+ if id := ctx .LanguageTag ().String (); id != "" {
202
+ ctx .Header ().Set (header .ContentLanguage , id )
204
203
}
205
- }
206
204
207
- ctx .WriteHeader (http .StatusOK )
208
- if _ , err := ctx .Write (data ); err != nil {
209
- ctx .Logs ().ERROR ().Error (err )
205
+ ctx .WriteHeader (http .StatusOK )
206
+ if _ , err := ctx .Write (data ); err != nil {
207
+ ctx .Logs ().ERROR ().Error (err )
208
+ }
209
+ } else {
210
+ ctx .Render (http .StatusOK , b )
210
211
}
211
212
})
212
213
}
0 commit comments