Mercurial > mercurial > hgweb_golang.cgi
changeset 36:a2e33e922a54
ver up gf.go.
author | pyon@macmini |
---|---|
date | Thu, 21 Nov 2019 02:12:18 +0900 |
parents | a4a54931b6fa |
children | 43adde439537 |
files | src/gf/gf.go |
diffstat | 1 files changed, 97 insertions(+), 30 deletions(-) [+] |
line wrap: on
line diff
--- a/src/gf/gf.go Wed Nov 20 06:19:13 2019 +0900 +++ b/src/gf/gf.go Thu Nov 21 02:12:18 2019 +0900 @@ -1,13 +1,13 @@ /* -Last Change: 2019-11-20 Wed 05:44:47. +Last Change: 2019-11-21 Thu 02:11:35. - gf.go: Get Files (ver.0.3) + gf.go: Get Files (ver.0.6) ./gf.json: server & file list e.g. { "Server": { - "Address": "sdm.sakura.ne.jp", + "Address": "hoge.com", "Port": "80" }, "Files": [ @@ -18,9 +18,8 @@ } TODO: - * goroutine - * make dir option [-r] - * json file option [-j] + + reserve dirtree option [-r] + + gunzip/untar option */ package main @@ -32,11 +31,22 @@ "log" "os" "path" + "path/filepath" "net/http" ) -const version = "0.3" +const version = "0.6" const defaultjson = "gf.json" +const samplejson = `{ + "Server": { + "Address": "hoge.com", + "Port": "80" + }, + "Files": [ + "mahjong.html", + "gammon/backgammon.html" + ] +}` type SV struct { Address string @@ -52,16 +62,29 @@ Files []string } +type HO struct { // html object + Status string + StatusCode int + Content []byte +} + +// option valiables var ( ver bool quiet bool jsonfile string + sample bool + somefile string + tdir string ) func init() { flag.BoolVar(&ver, "v", false, "version.") flag.BoolVar(&quiet, "s", false, "silence.") flag.StringVar(&jsonfile, "j", defaultjson, "specify json file.") + flag.BoolVar(&sample, "p", false, "print json sample.") + flag.StringVar(&somefile, "o", "", "get specity file.") + flag.StringVar(&tdir, "d", "", "specity save directory.") } func main() { @@ -69,9 +92,24 @@ if ver { fmt.Println("gf", version) + flag.PrintDefaults() os.Exit(0) } + if sample { + fmt.Println(samplejson) + os.Exit(0) + } + + if somefile != "" { + ho, err := http_get(somefile) + if err != nil { + log.Fatal(err) + } + fmt.Print(string(ho.Content)) + os.Exit(0) + } + content, err := ioutil.ReadFile(jsonfile) if err != nil { log.Fatal(err) @@ -83,48 +121,77 @@ if err != nil { log.Fatal(err) } + + if tdir != "" { + if err := os.Mkdir(tdir, 0755); err != nil { + log.Fatal(err) + } + } + n := len(gf.Files) if n > 1 { - print_msg(fmt.Sprintf("%d files downloading\n", n), quiet) + print_msg(fmt.Sprintf("%d files downloading", n)) } + ch := make(chan string) for _, f := range gf.Files { - print_msg(" getting " + f + "...", quiet) - status, err := http_get(gf.Server.String(), f) - if err != nil { - print_msg(fmt.Sprintf(" [ERROR] %s\n", err), quiet) - } else { - print_msg(" [" + status + "]\n", quiet) - } + go http_gets(gf.Server.String(), f, ch) } + + for range gf.Files { + print_msg(<-ch) + } } -func http_get(server, file string) (string, error) { - url := "http://" + server + "/" + file +func http_get(url string) (HO, error) { + var ho HO + res, err := http.Get(url) if err != nil { - return "", err + return ho, err } content, err := ioutil.ReadAll(res.Body) res.Body.Close() if err != nil { - return "", err - } - if res.StatusCode != http.StatusOK { - return res.Status, nil + return ho, err } - err = ioutil.WriteFile(path.Base(file), content, 0644) - if err != nil { - return "", err - } - return res.Status, nil + ho.Status = res.Status + ho.StatusCode = res.StatusCode + ho.Content = content + + return ho, nil } -func print_msg(msg string, q bool) { - if !q { - fmt.Print(msg) +func http_gets(server, file string, ch chan<- string) { + msg := " getting " + file + "... " + + url := "http://" + server + "/" + file + + ho, err := http_get(url) + if err != nil { + ch <- msg + fmt.Sprint(err) + return + } + + if ho.StatusCode == http.StatusOK { + file = path.Base(file) + if tdir != "" { + file = filepath.Join(tdir, file) + } + if err := ioutil.WriteFile(file, ho.Content, 0644); err != nil { + ch <- msg + fmt.Sprint(err) + return + } + } + + ch <- msg + "[" + ho.Status + "]" +} + +func print_msg(msg string) { + if !quiet { + fmt.Println(msg) } }