@@ -2,11 +2,14 @@ package http
2
2
3
3
import (
4
4
"bytes"
5
+ "compress/gzip"
5
6
"context"
6
7
"crypto/tls"
7
8
"encoding/json"
8
9
"github.com/vlorc/lua-vm/base"
9
10
vmnet "github.com/vlorc/lua-vm/net"
11
+ "golang.org/x/text/encoding/simplifiedchinese"
12
+ "golang.org/x/text/transform"
10
13
"io"
11
14
"io/ioutil"
12
15
"net"
@@ -52,54 +55,53 @@ func __client(driver vmnet.NetDriver, config *tls.Config) *http.Client {
52
55
}
53
56
}
54
57
55
- func (f * HTTPFactory ) __do (method , rawurl string , body io.Reader ) (* http.Response , error ) {
56
- req , err := http .NewRequest (method , rawurl , body )
57
- if err != nil {
58
- return nil , err
59
- }
60
- return f .client .Do (req )
61
- }
62
-
63
- func (f * HTTPFactory ) Delete (rawurl string ) (* http.Response , error ) {
64
- return f .__do ("DELETE" , rawurl , nil )
65
- }
66
-
67
- func (f * HTTPFactory ) Put (rawurl string ) (* http.Response , error ) {
68
-
69
- return f .__do ("PUT" , rawurl , nil )
58
+ type Body struct {
59
+ io.Reader
60
+ closer []io.Closer
70
61
}
71
62
72
- func (f * HTTPFactory ) Get (rawurl string ) (* http.Response , error ) {
73
- return f .client .Get (rawurl )
63
+ func (b * Body ) Close () error {
64
+ for i := len (b .closer ) - 1 ; i >= 0 ; i -- {
65
+ b .closer [i ].Close ()
66
+ }
67
+ return nil
74
68
}
75
-
76
- func (f * HTTPFactory ) Post (rawurl , contentType string , body io.Reader ) (* http.Response , error ) {
77
- return f .client .Post (rawurl , contentType , body )
69
+ func (b * Body ) Append (c io.Closer ) {
70
+ b .closer = append (b .closer , c )
78
71
}
79
-
80
- func (f * HTTPFactory ) PostJson (rawurl string , values interface {}, args ... string ) (* http.Response , error ) {
81
- contentType := "application/json"
82
- if len (args ) > 0 {
83
- contentType = args [0 ]
72
+ func __response (resp * http.Response , err error ) (* http.Response , error ) {
73
+ if nil != err {
74
+ return nil , err
84
75
}
85
- r , w := io .Pipe ()
86
- go func () {
87
- json .NewEncoder (w ).Encode (values )
88
- w .Close ()
89
- }()
90
- return f .client .Post (rawurl , contentType , r )
91
- }
92
-
93
- func (f * HTTPFactory ) PostForm (rawurl string , values url.Values , args ... string ) (* http.Response , error ) {
94
- contentType := "application/x-www-form-urlencoded"
95
- if len (args ) > 0 {
96
- contentType = args [0 ]
76
+ reader := & Body {
77
+ Reader : resp .Body ,
78
+ closer : []io.Closer {resp .Body },
79
+ }
80
+ if resp .Header .Get ("Content-Encoding" ) == "gzip" {
81
+ ungzip , err := gzip .NewReader (reader .Reader )
82
+ if nil != err {
83
+ return resp , err
84
+ }
85
+ defer ungzip .Close ()
86
+ reader .Reader = ungzip
87
+ reader .Append (ungzip )
88
+ }
89
+ if strings .Contains (resp .Header .Get ("Content-Type" ), "charset=GBK" ) {
90
+ reader .Reader = transform .NewReader (reader .Reader , simplifiedchinese .GBK .NewDecoder ())
97
91
}
98
- return f .client .Post (rawurl , contentType , strings .NewReader (values .Encode ()))
92
+ resp .Body = reader
93
+ return resp , nil
99
94
}
100
95
101
- func (f * HTTPFactory ) Head (rawurl string ) (* http.Response , error ) {
102
- return f .__do ("HEAD" , rawurl , nil )
96
+ func (f * HTTPFactory ) __do (method , rawurl string , body io.Reader , header ... string ) (* http.Response , error ) {
97
+ req , err := http .NewRequest (method , rawurl , body )
98
+ if err != nil {
99
+ return nil , err
100
+ }
101
+ for i , l := 0 , len (header ); i < l ; i += 2 {
102
+ req .Header .Set (header [i * 2 + 0 ], header [i * 2 + 1 ])
103
+ }
104
+ return __response (f .client .Do (req ))
103
105
}
104
106
105
107
func (f * HTTPFactory ) Do (r * Request ) (* http.Response , error ) {
@@ -127,8 +129,57 @@ func (f *HTTPFactory) Do(r *Request) (*http.Response, error) {
127
129
req .AddCookie (cookie )
128
130
}
129
131
}
132
+ return __response (f .client .Do (req ))
133
+ }
134
+
135
+ func (f * HTTPFactory ) Delete (rawurl string ) (* http.Response , error ) {
136
+ return f .__do ("DELETE" , rawurl , nil )
137
+ }
138
+ func (f * HTTPFactory ) Put (rawurl string ) (* http.Response , error ) {
139
+ return f .__do ("PUT" , rawurl , nil )
140
+ }
141
+ func (f * HTTPFactory ) Get (rawurl string ) (* http.Response , error ) {
142
+ return f .__do ("GET" , rawurl , nil )
143
+ }
144
+ func (f * HTTPFactory ) Post (rawurl , contentType string , body io.Reader ) (* http.Response , error ) {
145
+ return f .__do ("POST" , rawurl , body , "Content-Type" , contentType )
146
+ }
147
+ func (f * HTTPFactory ) Head (rawurl string ) (* http.Response , error ) {
148
+ return f .__do ("HEAD" , rawurl , nil )
149
+ }
150
+ func (f * HTTPFactory ) PostJson (rawurl string , values interface {}, args ... string ) (* http.Response , error ) {
151
+ contentType := "application/json"
152
+ if len (args ) > 0 {
153
+ contentType = args [0 ]
154
+ }
155
+ r , w := io .Pipe ()
156
+ go func () {
157
+ json .NewEncoder (w ).Encode (values )
158
+ w .Close ()
159
+ }()
160
+ return f .Post (rawurl , contentType , r )
161
+ }
162
+ func (f * HTTPFactory ) PostForm (rawurl string , values url.Values , args ... string ) (* http.Response , error ) {
163
+ contentType := "application/x-www-form-urlencoded"
164
+ if len (args ) > 0 {
165
+ contentType = args [0 ]
166
+ }
167
+ return f .Post (rawurl , contentType , strings .NewReader (values .Encode ()))
168
+ }
169
+ func (f * HTTPFactory ) PostString (rawurl string , values string , args ... string ) (* http.Response , error ) {
170
+ contentType := "text/plain"
171
+ if len (args ) > 0 {
172
+ contentType = args [0 ]
173
+ }
174
+ return f .Post (rawurl , contentType , strings .NewReader (values ))
175
+ }
130
176
131
- return f .client .Do (req )
177
+ func (f * HTTPFactory ) PostBuffer (rawurl string , values base.Buffer , args ... string ) (* http.Response , error ) {
178
+ contentType := "application/octet-stream"
179
+ if len (args ) > 0 {
180
+ contentType = args [0 ]
181
+ }
182
+ return f .Post (rawurl , contentType , bytes .NewReader (values ))
132
183
}
133
184
134
185
func (f * HTTPFactory ) GetString (rawurl string ) (string , error ) {
@@ -140,7 +191,7 @@ func (f *HTTPFactory) GetString(rawurl string) (string, error) {
140
191
}
141
192
142
193
func (f * HTTPFactory ) GetBuffer (rawurl string ) (base.Buffer , error ) {
143
- resp , err := f .client . Get (rawurl )
194
+ resp , err := f .Get (rawurl )
144
195
if nil != err {
145
196
return nil , err
146
197
}
@@ -152,19 +203,3 @@ func (f *HTTPFactory) GetBuffer(rawurl string) (base.Buffer, error) {
152
203
}
153
204
return base .Buffer (buf ), nil
154
205
}
155
-
156
- func (f * HTTPFactory ) PostString (rawurl string , values string , args ... string ) (* http.Response , error ) {
157
- contentType := "text/plain"
158
- if len (args ) > 0 {
159
- contentType = args [0 ]
160
- }
161
- return f .client .Post (rawurl , contentType , strings .NewReader (values ))
162
- }
163
-
164
- func (f * HTTPFactory ) PostBuffer (rawurl string , values base.Buffer , args ... string ) (* http.Response , error ) {
165
- contentType := "application/octet-stream"
166
- if len (args ) > 0 {
167
- contentType = args [0 ]
168
- }
169
- return f .client .Post (rawurl , contentType , bytes .NewReader (values ))
170
- }
0 commit comments