golang.org/x/net@v0.25.1-0.20240516223405-c87a5b62e243/context/ctxhttp/ctxhttp.go (about) 1 // Copyright 2016 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // Package ctxhttp provides helper functions for performing context-aware HTTP requests. 6 package ctxhttp // import "golang.org/x/net/context/ctxhttp" 7 8 import ( 9 "context" 10 "io" 11 "net/http" 12 "net/url" 13 "strings" 14 ) 15 16 // Do sends an HTTP request with the provided http.Client and returns 17 // an HTTP response. 18 // 19 // If the client is nil, http.DefaultClient is used. 20 // 21 // The provided ctx must be non-nil. If it is canceled or times out, 22 // ctx.Err() will be returned. 23 func Do(ctx context.Context, client *http.Client, req *http.Request) (*http.Response, error) { 24 if client == nil { 25 client = http.DefaultClient 26 } 27 resp, err := client.Do(req.WithContext(ctx)) 28 // If we got an error, and the context has been canceled, 29 // the context's error is probably more useful. 30 if err != nil { 31 select { 32 case <-ctx.Done(): 33 err = ctx.Err() 34 default: 35 } 36 } 37 return resp, err 38 } 39 40 // Get issues a GET request via the Do function. 41 func Get(ctx context.Context, client *http.Client, url string) (*http.Response, error) { 42 req, err := http.NewRequest("GET", url, nil) 43 if err != nil { 44 return nil, err 45 } 46 return Do(ctx, client, req) 47 } 48 49 // Head issues a HEAD request via the Do function. 50 func Head(ctx context.Context, client *http.Client, url string) (*http.Response, error) { 51 req, err := http.NewRequest("HEAD", url, nil) 52 if err != nil { 53 return nil, err 54 } 55 return Do(ctx, client, req) 56 } 57 58 // Post issues a POST request via the Do function. 59 func Post(ctx context.Context, client *http.Client, url string, bodyType string, body io.Reader) (*http.Response, error) { 60 req, err := http.NewRequest("POST", url, body) 61 if err != nil { 62 return nil, err 63 } 64 req.Header.Set("Content-Type", bodyType) 65 return Do(ctx, client, req) 66 } 67 68 // PostForm issues a POST request via the Do function. 69 func PostForm(ctx context.Context, client *http.Client, url string, data url.Values) (*http.Response, error) { 70 return Post(ctx, client, url, "application/x-www-form-urlencoded", strings.NewReader(data.Encode())) 71 }