github.com/simpleiot/simpleiot@v0.18.3/cmd/fetch/main.go (about) 1 // test download program 2 package main 3 4 import ( 5 "flag" 6 "fmt" 7 "io" 8 "log" 9 "net/http" 10 "net/url" 11 "os" 12 "path" 13 "time" 14 15 "github.com/cavaliercoder/grab" 16 ) 17 18 // test app to evaluate the grab http client for downloading OS updates 19 // we've had trouble downloading over Cat-M connections where the download 20 // will stall, so the this app is used to debug these downloads. 21 22 func httpDownload(url, fn string) { 23 24 file, err := os.Create(fn) 25 if err != nil { 26 log.Println("App update: error creating file:", err) 27 return 28 } 29 30 defer file.Close() 31 32 var netClient = &http.Client{ 33 Timeout: 30 * time.Minute, 34 } 35 36 // Get the data 37 resp, err := netClient.Get(url) 38 if err != nil { 39 log.Println("App update: error getting update file:", err) 40 return 41 } 42 defer resp.Body.Close() 43 44 // copy to file 45 _, err = io.Copy(file, resp.Body) 46 47 if err != nil { 48 log.Println("App update: error downloading update file:", err) 49 return 50 } 51 52 log.Println("Download finished") 53 54 } 55 56 func grabDownload(url, fn string) { 57 file, err := os.Create(fn) 58 if err != nil { 59 log.Println("App update: error creating file:", err) 60 return 61 } 62 63 defer file.Close() 64 65 client := grab.NewClient() 66 req, _ := grab.NewRequest(fn, url) 67 // ... 68 resp := client.Do(req) 69 70 t := time.NewTicker(time.Second) 71 defer t.Stop() 72 73 for { 74 select { 75 case <-t.C: 76 fmt.Printf("%.02f%% complete, %.02f B/sec\n", 77 resp.Progress()*100, 78 resp.BytesPerSecond()) 79 80 case <-resp.Done: 81 if err := resp.Err(); err != nil { 82 log.Println("Error downloading:", err) 83 } 84 return 85 } 86 } 87 } 88 89 func usage() { 90 fmt.Println("Usage: ") 91 flag.PrintDefaults() 92 os.Exit(-1) 93 } 94 95 func main() { 96 97 flagGohttp := flag.Bool("gohttp", false, "use Go http client") 98 flagGrab := flag.Bool("grab", false, "use grab http client") 99 flagURL := flag.String("url", "", "URL of file to download") 100 101 flag.Parse() 102 103 if *flagURL == "" { 104 log.Println("Must set URL") 105 } 106 107 if !*flagGohttp && !*flagGrab { 108 log.Println("Must set -gohttp or -grab option", *flagGohttp, *flagGrab) 109 usage() 110 } 111 112 url, err := url.Parse(*flagURL) 113 114 if err != nil { 115 log.Println("Error parsing url:", err) 116 os.Exit(-1) 117 } 118 119 urlPath := url.EscapedPath() 120 _, fn := path.Split(urlPath) 121 122 if *flagGohttp { 123 httpDownload(url.String(), fn) 124 } 125 126 if *flagGrab { 127 grabDownload(url.String(), fn) 128 } 129 }