github.com/Files-com/files-sdk-go/v2@v2.1.2/requestresponseoption.go (about) 1 package files_sdk 2 3 import ( 4 "context" 5 "io" 6 "net/http" 7 ) 8 9 type requestResponseOption struct { 10 *http.Request 11 *http.Response 12 context.Context 13 } 14 15 type RequestResponseOption func(*requestResponseOption) error 16 17 func RequestOption(call func(req *http.Request) error) RequestResponseOption { 18 return func(opt *requestResponseOption) error { 19 if opt.Request != nil { 20 return call(opt.Request) 21 } 22 return nil 23 } 24 } 25 26 func ResponseOption(call func(req *http.Response) error) RequestResponseOption { 27 return func(opt *requestResponseOption) error { 28 if opt.Response != nil { 29 return call(opt.Response) 30 } 31 return nil 32 } 33 } 34 35 func RequestHeadersOption(headers *http.Header) RequestResponseOption { 36 return RequestOption(func(req *http.Request) error { 37 for k, v := range *headers { 38 req.Header.Set(k, v[0]) 39 } 40 return nil 41 }) 42 } 43 44 func WithContext(ctx context.Context) RequestResponseOption { 45 return func(opt *requestResponseOption) error { 46 if opt.Request != nil && ctx != nil { 47 opt.Request.WithContext(ctx) 48 } else { 49 opt.Context = ctx 50 } 51 return nil 52 } 53 } 54 55 func ResponseBodyOption(opt func(io.ReadCloser) error) RequestResponseOption { 56 return ResponseOption(func(res *http.Response) error { 57 return opt(res.Body) 58 }) 59 } 60 61 func WrapRequestOptions(client HttpClient, request *http.Request, opts ...RequestResponseOption) (*http.Response, error) { 62 for _, opt := range opts { 63 err := opt(&requestResponseOption{Request: request}) 64 if err != nil { 65 return &http.Response{}, err 66 } 67 } 68 69 resp, err := client.Do(request) 70 if err != nil { 71 return resp, err 72 } 73 74 for _, opt := range opts { 75 err := opt(&requestResponseOption{Response: resp}) 76 if err != nil { 77 return resp, err 78 } 79 } 80 81 return resp, nil 82 } 83 84 func ContextOption(opts []RequestResponseOption) context.Context { 85 params := &requestResponseOption{} 86 for _, opt := range opts { 87 opt(params) 88 } 89 if params.Context == nil { 90 params.Context = context.Background() 91 } 92 return params.Context 93 }