package main import ( "http" "os" "log" "time" ) type State int const ( StatePaused = iota StateDownloading StateComplete StateError ) func (state State) String() string { switch state { case StatePaused: return "Paused" case StateDownloading: return "Downloading" case StateComplete: return "Complete" case StateError: return "Error" } return "#Unknown" } func download(url string, sic, soc chan State) { req, err := http.NewRequest("GET", url, nil) if err != nil { log.Print("Error: NewRequest() : " + err.String()) soc <- StateError return } // Disable keep-alive req.Close = true rsp, err := http.DefaultClient.Do(req) if err != nil { log.Print("Error: Get() : " + err.String()) soc <- StateError return } defer rsp.Body.Close() buf := make([]byte, 4096) for { select { case state := <-sic: if state != StateDownloading { log.Print("State: " + state.String()) soc <- state return } default: } n, err := rsp.Body.Read(buf) if err != nil { if err == os.EOF { log.Print("State: Complete") soc <- StateComplete break } log.Print("Error: Read() : " + err.String()) soc <- StateError break } if n > 0 { // Write data here } } } func main() { // if t, ok := http.DefaultTransport.(*http.Transport); ok { // log.Print("Keep-Alive Disabled") // t.DisableKeepAlives = true // } sic := make(chan State) soc := make(chan State) // Pause download after 5 seconds go func() { time.Sleep(5e9) log.Print("Pausing download...") sic <- StatePaused }() go download("http://mir.archlinux.fr/iso/latest/archlinux-2010.05-core-dual.iso", sic, soc) state := <-soc log.Print("State Change: " + state.String()) // Wait to check for open connections time.Sleep(20e9) }