@@ -8,26 +8,68 @@ import (
8
8
"log"
9
9
"net/http"
10
10
"net/url"
11
+ "os"
11
12
"strings"
12
13
)
13
14
15
+ type httpHeader struct {
16
+ key string
17
+ value string
18
+ }
19
+
20
+ type httpHeaderSlice []httpHeader
21
+
22
+ func (s * httpHeaderSlice ) String () string {
23
+ ret := ""
24
+ for i , kv := range * s {
25
+ ret = ret + kv .key + ":" + kv .value
26
+ if i < len (* s )- 1 {
27
+ ret = ret + ","
28
+ }
29
+ }
30
+ return ret
31
+ }
32
+
33
+ func (s * httpHeaderSlice ) Set (value string ) error {
34
+ parts := strings .SplitN (value , ":" , 2 )
35
+ if len (parts ) != 2 {
36
+ return fmt .Errorf ("invalid header should be in `key:value` format" )
37
+ }
38
+ if len (parts [0 ]) == 0 {
39
+ return fmt .Errorf ("invalid header, key is empty" )
40
+ }
41
+ * s = append (* s , httpHeader {
42
+ key : parts [0 ],
43
+ value : parts [1 ],
44
+ })
45
+ return nil
46
+ }
47
+
14
48
func main () {
15
49
var targetURL string
16
50
var body string
51
+ var bodyFile string
17
52
var contentType string
18
53
var accessKey string
19
54
var secretKey string
20
55
var method string
21
56
var verbose bool
57
+ var headers httpHeaderSlice
22
58
flag .StringVar (& method , "X" , "GET" , "http request method" )
59
+ flag .Var (& headers , "H" , "HTTP headers" )
23
60
flag .StringVar (& targetURL , "u" , "" , "URL" )
24
- flag .StringVar (& body , "d" , "" , "request body" )
61
+ flag .StringVar (& body , "d" , "" , "request body, cannot be used with -f" )
62
+ flag .StringVar (& bodyFile , "f" , "" , "filename to load body from, cannot be used with -d" )
25
63
flag .StringVar (& contentType , "t" , "application/json" , "content type" )
26
64
flag .StringVar (& accessKey , "ak" , "" , "QINIU access key" )
27
65
flag .StringVar (& secretKey , "sk" , "" , "QINIU secret key" )
28
66
flag .BoolVar (& verbose , "v" , false , "show verbose (HTTP headers)" )
29
67
flag .Parse ()
30
68
69
+ if body != "" && bodyFile != "" {
70
+ log .Fatalf ("cannot specify both body content and body file" )
71
+ }
72
+
31
73
client := & http.Client {}
32
74
client .Transport = & qiniuMacTransport {
33
75
AccessKey : accessKey ,
@@ -43,7 +85,17 @@ func main() {
43
85
if reqURL .Scheme == "" {
44
86
reqURL .Scheme = "http"
45
87
}
46
- req , err := http .NewRequest (method , reqURL .String (), bytes .NewReader ([]byte (body )))
88
+ var req * http.Request
89
+ if body != "" || bodyFile == "" {
90
+ req , err = http .NewRequest (method , reqURL .String (), bytes .NewReader ([]byte (body )))
91
+ } else {
92
+ file , errOpen := os .Open (bodyFile )
93
+ if errOpen != nil {
94
+ log .Fatalf ("failed to open file %s, error %v" , bodyFile , err )
95
+ }
96
+ req , err = http .NewRequest (method , reqURL .String (), file )
97
+ }
98
+
47
99
if err != nil {
48
100
log .Fatalf ("failed to create request: %v" , err )
49
101
}
@@ -53,6 +105,11 @@ func main() {
53
105
if body != "" {
54
106
req .Header .Set ("Content-Type" , contentType )
55
107
}
108
+ if len (headers ) > 0 {
109
+ for _ , h := range headers {
110
+ req .Header .Set (h .key , h .value )
111
+ }
112
+ }
56
113
57
114
resp , err := client .Do (req )
58
115
if err != nil {
0 commit comments