github.com/cavaliergopher/grab/v3@v3.0.1/example_client_test.go (about)

     1  package grab
     2  
     3  import (
     4  	"fmt"
     5  	"sync"
     6  )
     7  
     8  func ExampleClient_Do() {
     9  	client := NewClient()
    10  	req, err := NewRequest("/tmp", "http://example.com/example.zip")
    11  	if err != nil {
    12  		panic(err)
    13  	}
    14  
    15  	resp := client.Do(req)
    16  	if err := resp.Err(); err != nil {
    17  		panic(err)
    18  	}
    19  
    20  	fmt.Println("Download saved to", resp.Filename)
    21  }
    22  
    23  // This example uses DoChannel to create a Producer/Consumer model for
    24  // downloading multiple files concurrently. This is similar to how DoBatch uses
    25  // DoChannel under the hood except that it allows the caller to continually send
    26  // new requests until they wish to close the request channel.
    27  func ExampleClient_DoChannel() {
    28  	// create a request and a buffered response channel
    29  	reqch := make(chan *Request)
    30  	respch := make(chan *Response, 10)
    31  
    32  	// start 4 workers
    33  	client := NewClient()
    34  	wg := sync.WaitGroup{}
    35  	for i := 0; i < 4; i++ {
    36  		wg.Add(1)
    37  		go func() {
    38  			client.DoChannel(reqch, respch)
    39  			wg.Done()
    40  		}()
    41  	}
    42  
    43  	go func() {
    44  		// send requests
    45  		for i := 0; i < 10; i++ {
    46  			url := fmt.Sprintf("http://example.com/example%d.zip", i+1)
    47  			req, err := NewRequest("/tmp", url)
    48  			if err != nil {
    49  				panic(err)
    50  			}
    51  			reqch <- req
    52  		}
    53  		close(reqch)
    54  
    55  		// wait for workers to finish
    56  		wg.Wait()
    57  		close(respch)
    58  	}()
    59  
    60  	// check each response
    61  	for resp := range respch {
    62  		// block until complete
    63  		if err := resp.Err(); err != nil {
    64  			panic(err)
    65  		}
    66  
    67  		fmt.Printf("Downloaded %s to %s\n", resp.Request.URL(), resp.Filename)
    68  	}
    69  }
    70  
    71  func ExampleClient_DoBatch() {
    72  	// create multiple download requests
    73  	reqs := make([]*Request, 0)
    74  	for i := 0; i < 10; i++ {
    75  		url := fmt.Sprintf("http://example.com/example%d.zip", i+1)
    76  		req, err := NewRequest("/tmp", url)
    77  		if err != nil {
    78  			panic(err)
    79  		}
    80  		reqs = append(reqs, req)
    81  	}
    82  
    83  	// start downloads with 4 workers
    84  	client := NewClient()
    85  	respch := client.DoBatch(4, reqs...)
    86  
    87  	// check each response
    88  	for resp := range respch {
    89  		if err := resp.Err(); err != nil {
    90  			panic(err)
    91  		}
    92  
    93  		fmt.Printf("Downloaded %s to %s\n", resp.Request.URL(), resp.Filename)
    94  	}
    95  }