github.com/bytedance/go-tagexpr/v2@v2.9.8/binding/request.go (about) 1 package binding 2 3 import ( 4 "bytes" 5 "io" 6 "mime/multipart" 7 "net/http" 8 "net/url" 9 ) 10 11 type requestWithFileHeader interface { 12 Request 13 GetFileHeaders() (map[string][]*multipart.FileHeader, error) 14 } 15 16 type Request interface { 17 GetMethod() string 18 GetQuery() url.Values 19 GetContentType() string 20 GetHeader() http.Header 21 GetCookies() []*http.Cookie 22 GetBody() ([]byte, error) 23 GetPostForm() (url.Values, error) 24 GetForm() (url.Values, error) 25 } 26 27 func wrapRequest(req *http.Request) Request { 28 r := &httpRequest{ 29 Request: req, 30 } 31 if getBodyCodec(r) == bodyForm && req.PostForm == nil { 32 b, _ := r.GetBody() 33 if b != nil { 34 req.ParseMultipartForm(defaultMaxMemory) 35 } 36 } 37 return r 38 } 39 40 type httpRequest struct { 41 *http.Request 42 } 43 44 func (r *httpRequest) GetMethod() string { 45 return r.Method 46 } 47 func (r *httpRequest) GetQuery() url.Values { 48 return r.URL.Query() 49 } 50 51 func (r *httpRequest) GetContentType() string { 52 return r.GetHeader().Get("Content-Type") 53 } 54 55 func (r *httpRequest) GetHeader() http.Header { 56 return r.Header 57 } 58 59 func (r *httpRequest) GetCookies() []*http.Cookie { 60 return r.Cookies() 61 } 62 63 func (r *httpRequest) GetBody() ([]byte, error) { 64 body, _ := r.Body.(*Body) 65 if body != nil { 66 body.Reset() 67 return body.bodyBytes, nil 68 } 69 switch r.Method { 70 case "POST", "PUT", "PATCH", "DELETE": 71 var buf bytes.Buffer 72 _, err := io.Copy(&buf, r.Body) 73 r.Body.Close() 74 if err != nil { 75 return nil, err 76 } 77 body = &Body{ 78 Buffer: &buf, 79 bodyBytes: buf.Bytes(), 80 } 81 r.Body = body 82 return body.bodyBytes, nil 83 default: 84 return nil, nil 85 } 86 } 87 88 func (r *httpRequest) GetPostForm() (url.Values, error) { 89 return r.PostForm, nil 90 } 91 92 func (r *httpRequest) GetForm() (url.Values, error) { 93 return r.Form, nil 94 } 95 96 func (r *httpRequest) GetFileHeaders() (map[string][]*multipart.FileHeader, error) { 97 if r.MultipartForm == nil { 98 return nil, nil 99 } 100 return r.MultipartForm.File, nil 101 }