@@ -2,11 +2,14 @@ package http
22
33import (
44 "bytes"
5+ "compress/gzip"
56 "context"
67 "crypto/tls"
78 "encoding/json"
89 "github.com/vlorc/lua-vm/base"
910 vmnet "github.com/vlorc/lua-vm/net"
11+ "golang.org/x/text/encoding/simplifiedchinese"
12+ "golang.org/x/text/transform"
1013 "io"
1114 "io/ioutil"
1215 "net"
@@ -52,54 +55,53 @@ func __client(driver vmnet.NetDriver, config *tls.Config) *http.Client {
5255 }
5356}
5457
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
7061}
7162
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
7468}
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 )
7871}
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
8475 }
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 ())
9791 }
98- return f .client .Post (rawurl , contentType , strings .NewReader (values .Encode ()))
92+ resp .Body = reader
93+ return resp , nil
9994}
10095
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 ))
103105}
104106
105107func (f * HTTPFactory ) Do (r * Request ) (* http.Response , error ) {
@@ -127,8 +129,57 @@ func (f *HTTPFactory) Do(r *Request) (*http.Response, error) {
127129 req .AddCookie (cookie )
128130 }
129131 }
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+ }
130176
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 ))
132183}
133184
134185func (f * HTTPFactory ) GetString (rawurl string ) (string , error ) {
@@ -140,7 +191,7 @@ func (f *HTTPFactory) GetString(rawurl string) (string, error) {
140191}
141192
142193func (f * HTTPFactory ) GetBuffer (rawurl string ) (base.Buffer , error ) {
143- resp , err := f .client . Get (rawurl )
194+ resp , err := f .Get (rawurl )
144195 if nil != err {
145196 return nil , err
146197 }
@@ -152,19 +203,3 @@ func (f *HTTPFactory) GetBuffer(rawurl string) (base.Buffer, error) {
152203 }
153204 return base .Buffer (buf ), nil
154205}
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