github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/lib/url/urlutil/watchUrl.go (about) 1 package urlutil 2 3 import ( 4 "errors" 5 "io" 6 "net/http" 7 "net/url" 8 "time" 9 10 "github.com/Cloud-Foundations/Dominator/lib/fsutil" 11 "github.com/Cloud-Foundations/Dominator/lib/log" 12 ) 13 14 func watchUrl(rawurl string, checkInterval time.Duration, 15 logger log.Logger) (<-chan io.ReadCloser, error) { 16 u, err := url.Parse(rawurl) 17 if err != nil { 18 return nil, err 19 } 20 if u.Scheme == "file" { 21 return fsutil.WatchFile(u.Path, logger), nil 22 } 23 if u.Scheme == "http" || u.Scheme == "https" { 24 ch := make(chan io.ReadCloser, 1) 25 go watchUrlLoop(rawurl, checkInterval, ch, logger) 26 return ch, nil 27 } 28 return nil, errors.New("unknown scheme: " + u.Scheme) 29 } 30 31 func watchUrlLoop(rawurl string, checkInterval time.Duration, 32 ch chan<- io.ReadCloser, logger log.Logger) { 33 for ; ; time.Sleep(checkInterval) { 34 watchUrlOnce(rawurl, ch, logger) 35 if checkInterval <= 0 { 36 return 37 } 38 } 39 } 40 41 func watchUrlOnce(rawurl string, ch chan<- io.ReadCloser, logger log.Logger) { 42 resp, err := http.Get(rawurl) 43 if err != nil { 44 logger.Println(err) 45 return 46 } 47 if resp.StatusCode != http.StatusOK { 48 logger.Println(resp.Status) 49 return 50 } 51 ch <- resp.Body 52 }