mirror of https://github.com/gin-gonic/gin.git
57 lines
876 B
Go
57 lines
876 B
Go
|
package binding
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"io"
|
||
|
"net/http"
|
||
|
"reflect"
|
||
|
|
||
|
"github.com/gin-gonic/gin/internal/bytesconv"
|
||
|
)
|
||
|
|
||
|
type plainBinding struct{}
|
||
|
|
||
|
func (plainBinding) Name() string {
|
||
|
return "plain"
|
||
|
}
|
||
|
|
||
|
func (plainBinding) Bind(req *http.Request, obj interface{}) error {
|
||
|
all, err := io.ReadAll(req.Body)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
return decodePlain(all, obj)
|
||
|
}
|
||
|
|
||
|
func (plainBinding) BindBody(body []byte, obj any) error {
|
||
|
return decodePlain(body, obj)
|
||
|
}
|
||
|
|
||
|
func decodePlain(data []byte, obj any) error {
|
||
|
if obj == nil {
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
v := reflect.ValueOf(obj)
|
||
|
|
||
|
for v.Kind() == reflect.Ptr {
|
||
|
if v.IsNil() {
|
||
|
return nil
|
||
|
}
|
||
|
v = v.Elem()
|
||
|
}
|
||
|
|
||
|
if v.Kind() == reflect.String {
|
||
|
v.SetString(bytesconv.BytesToString(data))
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
if _, ok := v.Interface().([]byte); ok {
|
||
|
v.SetBytes(data)
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
return fmt.Errorf("type (%T) unknown type", v)
|
||
|
}
|