@@ -70,31 +70,31 @@ func SetHeader(r Req, key headers.Header, value string) {
70
70
// Read and parse request body as JSON.
71
71
//
72
72
// Accepts the expected value of "type" field and Req.Body.
73
- func Read [T any ](t string , r io.Reader ) (T , error ) {
74
- // TODO: improve based on this blog post:
75
- // https://www.alexedwards.net/blog/how-to-properly-parse-a-json-request-body
73
+ func Read [T any ](t string , r io.Reader ) (Data [T ], error ) {
76
74
if r == nil {
77
- return * new ( T ) , errors .New ("request body is empty" )
75
+ return Data [ T ]{} , errors .New ("request body is empty" )
78
76
}
79
77
var v struct {
80
78
Data * Data [T ] `json:"data"`
81
79
}
80
+ r = io .LimitReader (r , 1024 * 1024 )
82
81
decoder := json .NewDecoder (r )
83
82
decoder .DisallowUnknownFields ()
84
83
err := decoder .Decode (& v )
85
84
if err != nil {
86
- return * new ( T ) , err
85
+ return Data [ T ]{} , err
87
86
}
88
87
if v .Data == nil {
89
- return * new ( T ) , errors .New ("data field not found in request body" )
88
+ return Data [ T ]{} , errors .New ("data field not found in request body" )
90
89
}
91
- if v .Data .Type != t {
92
- return * new ( T ) , fmt .Errorf ("unexpected request type: expected %s, got %s" , t , v .Data .Type )
90
+ if t != "" && v .Data .Type != t {
91
+ return * v . Data , fmt .Errorf ("unexpected request type: expected %s, got %s" , t , v .Data .Type )
93
92
}
94
- if v .Data .ID != "" {
95
- return * new (T ), errors .New ("requests cannot contain id" )
93
+ err = decoder .Decode (& struct {}{})
94
+ if ! errors .Is (err , io .EOF ) {
95
+ return Data [T ]{}, errors .New ("request body contains more than one JSON object" )
96
96
}
97
- return v .Data . Attributes , nil
97
+ return * v .Data , nil
98
98
}
99
99
100
100
// Resp is a response type.
0 commit comments