mirror of
https://github.com/gin-gonic/gin.git
synced 2025-10-14 12:12:12 +08:00
adjusted negotiation logic so that it is possible to add or overwrite render logic for sepcific content-types and added/referenced a default protobuf renderer.
This commit is contained in:
parent
cf4775283e
commit
ac765410d3
62
context.go
62
context.go
@ -1264,32 +1264,66 @@ type Negotiate struct {
|
|||||||
TOMLData any
|
TOMLData any
|
||||||
}
|
}
|
||||||
|
|
||||||
// Negotiate calls different Render according to acceptable Accept format.
|
func NewNegotiate(offered []string) Negotiate {
|
||||||
func (c *Context) Negotiate(code int, config Negotiate) {
|
return Negotiate{Offered: offered}
|
||||||
switch c.NegotiateFormat(config.Offered...) {
|
}
|
||||||
case binding.MIMEJSON:
|
func (receiver Negotiate) WithData(data any) Negotiate {
|
||||||
|
receiver.Data = data
|
||||||
|
return receiver
|
||||||
|
}
|
||||||
|
|
||||||
|
// NegotiationRenderFunc is responsible for rendering data in a specific format.
|
||||||
|
type NegotiationRenderFunc func(status int, config Negotiate, c *Context)
|
||||||
|
|
||||||
|
func AddNegotiationRenderMapping(mimeType string, binding NegotiationRenderFunc) {
|
||||||
|
negotiationRenderMappings[mimeType] = binding
|
||||||
|
}
|
||||||
|
|
||||||
|
// All predefined negotiationRenderMappings - associate a content type
|
||||||
|
// with a NegotiationRenderFunc, which is responsible for rendering
|
||||||
|
// data in a specific format.
|
||||||
|
var negotiationRenderMappings = map[string]NegotiationRenderFunc{
|
||||||
|
binding.MIMEJSON: func(code int, config Negotiate, c *Context) {
|
||||||
data := chooseData(config.JSONData, config.Data)
|
data := chooseData(config.JSONData, config.Data)
|
||||||
c.JSON(code, data)
|
c.JSON(code, data)
|
||||||
|
},
|
||||||
case binding.MIMEHTML:
|
binding.MIMEHTML: func(code int, config Negotiate, c *Context) {
|
||||||
data := chooseData(config.HTMLData, config.Data)
|
data := chooseData(config.HTMLData, config.Data)
|
||||||
c.HTML(code, config.HTMLName, data)
|
c.HTML(code, config.HTMLName, data)
|
||||||
|
},
|
||||||
case binding.MIMEXML:
|
binding.MIMEXML: func(code int, config Negotiate, c *Context) {
|
||||||
data := chooseData(config.XMLData, config.Data)
|
data := chooseData(config.XMLData, config.Data)
|
||||||
c.XML(code, data)
|
c.XML(code, data)
|
||||||
|
},
|
||||||
case binding.MIMEYAML, binding.MIMEYAML2:
|
binding.MIMEYAML: func(code int, config Negotiate, c *Context) {
|
||||||
data := chooseData(config.YAMLData, config.Data)
|
data := chooseData(config.YAMLData, config.Data)
|
||||||
c.YAML(code, data)
|
c.YAML(code, data)
|
||||||
|
},
|
||||||
case binding.MIMETOML:
|
binding.MIMEYAML2: func(code int, config Negotiate, c *Context) {
|
||||||
|
data := chooseData(config.YAMLData, config.Data)
|
||||||
|
c.YAML(code, data)
|
||||||
|
},
|
||||||
|
binding.MIMETOML: func(code int, config Negotiate, c *Context) {
|
||||||
data := chooseData(config.TOMLData, config.Data)
|
data := chooseData(config.TOMLData, config.Data)
|
||||||
c.TOML(code, data)
|
c.TOML(code, data)
|
||||||
|
},
|
||||||
|
binding.MIMEPROTOBUF: func(code int, config Negotiate, c *Context) {
|
||||||
|
c.ProtoBuf(code, config.Data)
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
default:
|
// Negotiate calls different Render according to acceptable Accept format.
|
||||||
c.AbortWithError(http.StatusNotAcceptable, errors.New("the accepted formats are not offered by the server")) //nolint: errcheck
|
func (c *Context) Negotiate(code int, config Negotiate) {
|
||||||
|
|
||||||
|
accepted := c.NegotiateFormat(config.Offered...)
|
||||||
|
for bind, fn := range negotiationRenderMappings {
|
||||||
|
if bind == accepted {
|
||||||
|
fn(code, config, c)
|
||||||
|
return
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
c.AbortWithError(http.StatusNotAcceptable, errors.New("the accepted formats are not offered by the server")) //nolint: errcheck
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// NegotiateFormat returns an acceptable Accept format.
|
// NegotiateFormat returns an acceptable Accept format.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user