@@ -208,6 +208,9 @@ type RequestConfig struct {
208
208
Context context.Context
209
209
Request * http.Request
210
210
BaseURL * url.URL
211
+ // DefaultBaseURL will be used if BaseURL is not explicitly overridden using
212
+ // WithBaseURL.
213
+ DefaultBaseURL * url.URL
211
214
CustomHTTPDoer HTTPDoer
212
215
HTTPClient * http.Client
213
216
Middlewares []middleware
@@ -374,7 +377,11 @@ func retryDelay(res *http.Response, retryCount int) time.Duration {
374
377
375
378
func (cfg * RequestConfig ) Execute () (err error ) {
376
379
if cfg .BaseURL == nil {
377
- return fmt .Errorf ("requestconfig: base url is not set" )
380
+ if cfg .DefaultBaseURL != nil {
381
+ cfg .BaseURL = cfg .DefaultBaseURL
382
+ } else {
383
+ return fmt .Errorf ("requestconfig: base url is not set" )
384
+ }
378
385
}
379
386
380
387
cfg .Request .URL , err = cfg .BaseURL .Parse (strings .TrimLeft (cfg .Request .URL .String (), "/" ))
@@ -508,6 +515,7 @@ func (cfg *RequestConfig) Execute() (err error) {
508
515
}
509
516
510
517
contents , err := io .ReadAll (res .Body )
518
+ res .Body .Close ()
511
519
if err != nil {
512
520
return fmt .Errorf ("error reading response body: %w" , err )
513
521
}
@@ -607,3 +615,17 @@ func PreRequestOptions(opts ...RequestOption) (RequestConfig, error) {
607
615
}
608
616
return cfg , nil
609
617
}
618
+
619
+ // WithDefaultBaseURL returns a RequestOption that sets the client's default Base URL.
620
+ // This is always overridden by setting a base URL with WithBaseURL.
621
+ // WithBaseURL should be used instead of WithDefaultBaseURL except in internal code.
622
+ func WithDefaultBaseURL (baseURL string ) RequestOption {
623
+ u , err := url .Parse (baseURL )
624
+ return RequestOptionFunc (func (r * RequestConfig ) error {
625
+ if err != nil {
626
+ return err
627
+ }
628
+ r .DefaultBaseURL = u
629
+ return nil
630
+ })
631
+ }
0 commit comments