Permalink
Cannot retrieve contributors at this time
Fetching contributors…
| // Copyright © 2016 Alan A. A. Donovan & Brian W. Kernighan. | |
| // License: https://creativecommons.org/licenses/by-nc-sa/4.0/ | |
| // See page 148. | |
| // Fetch saves the contents of a URL into a local file. | |
| package main | |
| import ( | |
| "fmt" | |
| "io" | |
| "net/http" | |
| "os" | |
| "path" | |
| ) | |
| //!+ | |
| // Fetch downloads the URL and returns the | |
| // name and length of the local file. | |
| func fetch(url string) (filename string, n int64, err error) { | |
| resp, err := http.Get(url) | |
| if err != nil { | |
| return "", 0, err | |
| } | |
| defer resp.Body.Close() | |
| local := path.Base(resp.Request.URL.Path) | |
| if local == "/" { | |
| local = "index.html" | |
| } | |
| f, err := os.Create(local) | |
| if err != nil { | |
| return "", 0, err | |
| } | |
| n, err = io.Copy(f, resp.Body) | |
| // Close file, but prefer error from Copy, if any. | |
| if closeErr := f.Close(); err == nil { | |
| err = closeErr | |
| } | |
| return local, n, err | |
| } | |
| //!- | |
| func main() { | |
| for _, url := range os.Args[1:] { | |
| local, n, err := fetch(url) | |
| if err != nil { | |
| fmt.Fprintf(os.Stderr, "fetch %s: %v\n", url, err) | |
| continue | |
| } | |
| fmt.Fprintf(os.Stderr, "%s => %s (%d bytes).\n", url, local, n) | |
| } | |
| } |