From 196f51ef252ec9c79e89e420107e72c844bb8255 Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Tue, 8 Dec 2015 19:54:46 +0100 Subject: automatic protocol detection for curl based fetcher diff --git a/fetcher.go b/fetcher.go index 26077b8..45bbce4 100644 --- a/fetcher.go +++ b/fetcher.go @@ -26,14 +26,44 @@ package rhimport import ( "fmt" + "github.com/golang-basic/go-curl" "net/url" "path" + "time" ) -func FetchFileHttp(ctx *ImportContext, uri *url.URL) (err error) { - rhl.Printf("HTTP/HTTPS fetcher called for '%s'", ctx.SourceUri) - ctx.SourceFile = ctx.Config.TempDir + "/" + path.Base(uri.Path) - ctx.DeleteSourceFile = true +func FetchFileCurl(ctx *ImportContext, uri *url.URL) (err error) { + rhl.Printf("curl-based fetcher called for '%s'", ctx.SourceUri) + + easy := curl.EasyInit() + defer easy.Cleanup() + + if easy != nil { + ctx.SourceFile = ctx.Config.TempDir + "/" + path.Base(uri.Path) + + easy.Setopt(curl.OPT_URL, ctx.SourceUri) + easy.Setopt(curl.OPT_WRITEFUNCTION, func(ptr []byte, userdata interface{}) bool { + // TODO: actually store data to ctx.SourceFile + return true + }) + + easy.Setopt(curl.OPT_NOPROGRESS, false) + started := int64(0) + easy.Setopt(curl.OPT_PROGRESSFUNCTION, func(dltotal, dlnow, ultotal, ulnow float64, userdata interface{}) bool { + if started == 0 { + started = time.Now().Unix() + } + fmt.Printf("Downloaded: %3.2f%%, Speed: %.1fKiB/s \r", dlnow/dltotal*100, dlnow/1000/float64((time.Now().Unix()-started))) + return true + }) + + if err = easy.Perform(); err != nil { + return + } + fmt.Printf("\n") + + ctx.DeleteSourceFile = true + } return } @@ -48,12 +78,35 @@ type FetchFunc func(*ImportContext, *url.URL) (err error) var ( fetchers = map[string]FetchFunc{ - "http": FetchFileHttp, - "https": FetchFileHttp, "local": FetchFileLocal, } + curl_protos = map[string]bool{ + "http": false, "https": false, + "ftp": false, "ftps": false, + } ) +func init() { + curl.GlobalInit(curl.GLOBAL_ALL) + + info := curl.VersionInfo(curl.VERSION_FIRST) + protos := info.Protocols + for _, proto := range protos { + if _, ok := curl_protos[proto]; ok { + rhdl.Printf("curl: enabling protocol %s", proto) + fetchers[proto] = FetchFileCurl + curl_protos[proto] = true + } else { + rhdl.Printf("curl: ignoring protocol %s", proto) + } + } + for proto, enabled := range curl_protos { + if !enabled { + rhl.Printf("curl: protocol %s is disabled because the installed library version doesn't support it!", proto) + } + } +} + func FetchFile(ctx *ImportContext) (err error) { var uri *url.URL -- cgit v0.10.2