1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- package internal
- import (
- "bytes"
- "encoding/json"
- "net/http"
- "github.com/fullstorydev/grpcurl"
- "github.com/golang/protobuf/jsonpb"
- "github.com/zeromicro/go-zero/rest/httpx"
- "github.com/zeromicro/go-zero/rest/pathvar"
- )
- // NewRequestParser creates a new request parser from the given http.Request and resolver.
- func NewRequestParser(r *http.Request, resolver jsonpb.AnyResolver) (grpcurl.RequestParser, error) {
- vars := pathvar.Vars(r)
- params, err := httpx.GetFormValues(r)
- if err != nil {
- return nil, err
- }
- for k, v := range vars {
- params[k] = v
- }
- if len(params) == 0 {
- return grpcurl.NewJSONRequestParser(r.Body, resolver), nil
- }
- if r.ContentLength == 0 {
- return buildJsonRequestParser(params, resolver)
- }
- m := make(map[string]interface{})
- if err := json.NewDecoder(r.Body).Decode(&m); err != nil {
- return nil, err
- }
- for k, v := range params {
- m[k] = v
- }
- return buildJsonRequestParser(m, resolver)
- }
- func buildJsonRequestParser(m map[string]interface{}, resolver jsonpb.AnyResolver) (
- grpcurl.RequestParser, error) {
- var buf bytes.Buffer
- if err := json.NewEncoder(&buf).Encode(m); err != nil {
- return nil, err
- }
- return grpcurl.NewJSONRequestParser(&buf, resolver), nil
- }
|