package httputil import ( "bytes" "io" "io/ioutil" "net/http" "github.com/diamondburned/arikawa/internal/json" ) type RequestOption func(*http.Request) error func JSONRequest(r *http.Request) error { r.Header.Set("Content-Type", "application/json") return nil } func MultipartRequest(r *http.Request) error { r.Header.Set("Content-Type", "multipart/form-data") return nil } func WithSchema(schema SchemaEncoder, v interface{}) RequestOption { return func(r *http.Request) error { params, err := schema.Encode(v) if err != nil { return err } var qs = r.URL.Query() for k, v := range params { qs[k] = append(qs[k], v...) } r.URL.RawQuery = qs.Encode() return nil } } func WithBody(body io.ReadCloser) RequestOption { return func(r *http.Request) error { // tee := io.TeeReader(body, os.Stderr) // r.Body = ioutil.NopCloser(tee) r.Body = body r.ContentLength = -1 return nil } } func WithJSONBody(json json.Driver, v interface{}) RequestOption { if v == nil { return func(*http.Request) error { return nil } } var buf bytes.Buffer var err error go func() { err = json.EncodeStream(&buf, v) }() return func(r *http.Request) error { if err != nil { return err } r.Header.Set("Content-Type", "application/json") r.Body = ioutil.NopCloser(&buf) return nil } }