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  }