-
Notifications
You must be signed in to change notification settings - Fork 27
/
Copy pathget.go
116 lines (98 loc) · 2.15 KB
/
get.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
package httpclient
import (
"encoding/json"
"errors"
"github.com/lmorg/murex/lang/proc"
"github.com/lmorg/murex/utils"
"io"
"io/ioutil"
"net/http"
"os"
"strconv"
"time"
)
func cmdGet(p *proc.Process) (err error) {
if p.Parameters.Len() == 0 {
return errors.New("URL required.")
}
var jhttp jsonHttp
url, err := p.Parameters.String(0)
if err != nil {
return err
}
if !rxHttpProto.MatchString(url) {
url = "http://" + url
}
resp, err := http.Get(url)
if err != nil {
return err
}
jhttp.Status.Code, _ = strconv.Atoi(resp.Status[:3])
jhttp.Status.Message = resp.Status[4:]
jhttp.Headers = resp.Header
b, err := ioutil.ReadAll(resp.Body)
jhttp.Body = string(b)
resp.Body.Close()
if err != nil {
return err
}
b, err = json.MarshalIndent(jhttp, "", "\t")
if err != nil {
return err
}
p.Stdout.Write(b)
return nil
}
func cmdGetFile(p *proc.Process) (err error) {
if p.Parameters.Len() == 0 {
return errors.New("URL required.")
}
url, err := p.Parameters.String(0)
if err != nil {
return err
}
if !rxHttpProto.MatchString(url) {
url = "http://" + url
}
resp, err := http.Get(url)
if err != nil {
return err
}
quit := false
cl := resp.Header.Get("Content-Length")
//var length float64
if cl == "" {
cl = "{unknown}"
} else {
i, _ := strconv.Atoi(cl)
cl = utils.HumanBytes(uint64(i))
//length = float64(i)
}
defer func() {
quit = true
resp.Body.Close()
written, _ := p.Stdout.Stats()
os.Stderr.WriteString("Downloaded " + utils.HumanBytes(written) + ".\n")
}()
go func() {
//gauge := render.NewGaugeBar("Downloading....")
var last uint64
for !quit {
time.Sleep(1 * time.Second)
if quit {
return
}
written, _ := p.Stdout.Stats()
speed := written - last
last = written
//percent := int((float64(written) / length) * 100)
os.Stderr.WriteString("Downloaded " + utils.HumanBytes(written) + " of " + cl + " @ " + utils.HumanBytes(speed) + "/s....\n")
//render.UpdateGaugeBar(gauge, percent, "Downloaded "+utils.HumanBytes(written)+" of "+cl+" @ "+utils.HumanBytes(speed)+"/s....")
}
}()
_, err = io.Copy(p.Stdout, resp.Body)
if err != nil {
return err
}
return nil
}