github.com/hxx258456/ccgo@v0.0.5-0.20230213014102-48b35f46f66f/net/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 "github.com/hxx258456/ccgo/net/context/ctxhttp"
     7  
     8  import (
     9  	"context"
    10  	"io"
    11  	"net/url"
    12  	"strings"
    13  
    14  	http "github.com/hxx258456/ccgo/gmhttp"
    15  )
    16  
    17  // Do sends an HTTP request with the provided http.Client and returns
    18  // an HTTP response.
    19  //
    20  // If the client is nil, http.DefaultClient is used.
    21  //
    22  // The provided ctx must be non-nil. If it is canceled or times out,
    23  // ctx.Err() will be returned.
    24  func Do(ctx context.Context, client *http.Client, req *http.Request) (*http.Response, error) {
    25  	if client == nil {
    26  		client = http.DefaultClient
    27  	}
    28  	resp, err := client.Do(req.WithContext(ctx))
    29  	// If we got an error, and the context has been canceled,
    30  	// the context's error is probably more useful.
    31  	if err != nil {
    32  		select {
    33  		case <-ctx.Done():
    34  			err = ctx.Err()
    35  		default:
    36  		}
    37  	}
    38  	return resp, err
    39  }
    40  
    41  // Get issues a GET request via the Do function.
    42  func Get(ctx context.Context, client *http.Client, url string) (*http.Response, error) {
    43  	req, err := http.NewRequest("GET", url, nil)
    44  	if err != nil {
    45  		return nil, err
    46  	}
    47  	return Do(ctx, client, req)
    48  }
    49  
    50  // Head issues a HEAD request via the Do function.
    51  func Head(ctx context.Context, client *http.Client, url string) (*http.Response, error) {
    52  	req, err := http.NewRequest("HEAD", url, nil)
    53  	if err != nil {
    54  		return nil, err
    55  	}
    56  	return Do(ctx, client, req)
    57  }
    58  
    59  // Post issues a POST request via the Do function.
    60  func Post(ctx context.Context, client *http.Client, url string, bodyType string, body io.Reader) (*http.Response, error) {
    61  	req, err := http.NewRequest("POST", url, body)
    62  	if err != nil {
    63  		return nil, err
    64  	}
    65  	req.Header.Set("Content-Type", bodyType)
    66  	return Do(ctx, client, req)
    67  }
    68  
    69  // PostForm issues a POST request via the Do function.
    70  func PostForm(ctx context.Context, client *http.Client, url string, data url.Values) (*http.Response, error) {
    71  	return Post(ctx, client, url, "application/x-www-form-urlencoded", strings.NewReader(data.Encode()))
    72  }