Skip to content

Commit

Permalink
gbk
Browse files Browse the repository at this point in the history
  • Loading branch information
vlorc committed Sep 14, 2018
1 parent e3e54b7 commit 4b6b093
Show file tree
Hide file tree
Showing 5 changed files with 123 additions and 66 deletions.
11 changes: 9 additions & 2 deletions base/buffer.go
Expand Up @@ -2,6 +2,7 @@ package base

import (
"bytes"
"unicode/utf8"
"unsafe"
)

Expand Down Expand Up @@ -121,6 +122,12 @@ func (b Buffer) ToString(args ...string) string {
return ""
}

func (b Buffer) ToRune(args ...int) rune {
n := b.Slice(args...)
v, _ := utf8.DecodeRune(n)
return v
}

func (b Buffer) ToNumber(args ...int) (v int64) {
n := b.Slice(args...)
for i := len(n) - 1; i >= 0; i-- {
Expand All @@ -136,7 +143,7 @@ func (b Buffer) ToLine(args ...int) string {
}
pos := bytes.IndexByte(n, byte('\n'))
if pos > 0 {
return __rawString(n[:pos])
n = n[:pos]
}
return ""
return __rawString(n)
}
24 changes: 18 additions & 6 deletions base/encode.go
Expand Up @@ -2,23 +2,29 @@ package base

import (
"encoding/base64"
"golang.org/x/text/encoding/simplifiedchinese"
"golang.org/x/text/transform"
"unsafe"
)

var EncodeTable = map[string]func(Buffer) string{
"raw": __rawString,
"HEX": __hexUpperString,
"hex": __hexLowerString,
"base64": __base64String,
"gbk": __gbkString,
"raw": __rawString,
"utf8": __rawString,
"HEX": __hexUpperString,
"hex": __hexLowerString,
"base64": __base64String,
"gbk": __gbkString,
"gb18030": __gb18030String,
}

func __hexUpperString(src Buffer) string {
return __hexString(src, "0123456789ABCDEF")
}

func __hexLowerString(src Buffer) string {
return __hexString(src, "0123456789abcdef")
}

func __hexString(src Buffer, tab string) string {
dst := make([]byte, len(src)*2)
for i, v := range src {
Expand All @@ -36,6 +42,12 @@ func __rawString(src Buffer) string {
return *(*string)(unsafe.Pointer(&src))
}

func __gb18030String(src Buffer) string {
dst, _, _ := transform.Bytes(simplifiedchinese.GB18030.NewDecoder(), src)
return *(*string)(unsafe.Pointer(&dst))
}

func __gbkString(src Buffer) string {
return ""
dst, _, _ := transform.Bytes(simplifiedchinese.GBK.NewDecoder(), src)
return *(*string)(unsafe.Pointer(&dst))
}
1 change: 1 addition & 0 deletions go.mod
Expand Up @@ -3,5 +3,6 @@ module github.com/vlorc/lua-vm
require (
github.com/yuin/gopher-lua v0.0.0-20180827083657-b942cacc89fe
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd
golang.org/x/text v0.3.0
layeh.com/gopher-luar v1.0.4
)
2 changes: 2 additions & 0 deletions go.sum
Expand Up @@ -2,5 +2,7 @@ github.com/yuin/gopher-lua v0.0.0-20180827083657-b942cacc89fe h1:5Zfs+TirasJUUDU
github.com/yuin/gopher-lua v0.0.0-20180827083657-b942cacc89fe/go.mod h1:aEV29XrmTYFr3CiRxZeGHpkvbwq+prZduBqMaascyCU=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd h1:nTDtHvHSdCn1m6ITfMRqtOd/9+7a3s8RBNOZ3eYZzJA=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
layeh.com/gopher-luar v1.0.4 h1:BFgt94J/CXh4HkDcE2b7A7pBaVeQKEVfHEBRKL/K/Tc=
layeh.com/gopher-luar v1.0.4/go.mod h1:N3rev/ttQd8yVluXaYsa0M/eknzRYWe+pxZ35ZFmaaI=
151 changes: 93 additions & 58 deletions net/http/http.go
Expand Up @@ -2,11 +2,14 @@ package http

import (
"bytes"
"compress/gzip"
"context"
"crypto/tls"
"encoding/json"
"github.com/vlorc/lua-vm/base"
vmnet "github.com/vlorc/lua-vm/net"
"golang.org/x/text/encoding/simplifiedchinese"
"golang.org/x/text/transform"
"io"
"io/ioutil"
"net"
Expand Down Expand Up @@ -52,54 +55,53 @@ func __client(driver vmnet.NetDriver, config *tls.Config) *http.Client {
}
}

func (f *HTTPFactory) __do(method, rawurl string, body io.Reader) (*http.Response, error) {
req, err := http.NewRequest(method, rawurl, body)
if err != nil {
return nil, err
}
return f.client.Do(req)
}

func (f *HTTPFactory) Delete(rawurl string) (*http.Response, error) {
return f.__do("DELETE", rawurl, nil)
}

func (f *HTTPFactory) Put(rawurl string) (*http.Response, error) {

return f.__do("PUT", rawurl, nil)
type Body struct {
io.Reader
closer []io.Closer
}

func (f *HTTPFactory) Get(rawurl string) (*http.Response, error) {
return f.client.Get(rawurl)
func (b *Body) Close() error {
for i := len(b.closer) - 1; i >= 0; i-- {
b.closer[i].Close()
}
return nil
}

func (f *HTTPFactory) Post(rawurl, contentType string, body io.Reader) (*http.Response, error) {
return f.client.Post(rawurl, contentType, body)
func (b *Body) Append(c io.Closer) {
b.closer = append(b.closer, c)
}

func (f *HTTPFactory) PostJson(rawurl string, values interface{}, args ...string) (*http.Response, error) {
contentType := "application/json"
if len(args) > 0 {
contentType = args[0]
func __response(resp *http.Response, err error) (*http.Response, error) {
if nil != err {
return nil, err
}
r, w := io.Pipe()
go func() {
json.NewEncoder(w).Encode(values)
w.Close()
}()
return f.client.Post(rawurl, contentType, r)
}

func (f *HTTPFactory) PostForm(rawurl string, values url.Values, args ...string) (*http.Response, error) {
contentType := "application/x-www-form-urlencoded"
if len(args) > 0 {
contentType = args[0]
reader := &Body{
Reader: resp.Body,
closer: []io.Closer{resp.Body},
}
if resp.Header.Get("Content-Encoding") == "gzip" {
ungzip, err := gzip.NewReader(reader.Reader)
if nil != err {
return resp, err
}
defer ungzip.Close()
reader.Reader = ungzip
reader.Append(ungzip)
}
if strings.Contains(resp.Header.Get("Content-Type"), "charset=GBK") {
reader.Reader = transform.NewReader(reader.Reader, simplifiedchinese.GBK.NewDecoder())
}
return f.client.Post(rawurl, contentType, strings.NewReader(values.Encode()))
resp.Body = reader
return resp, nil
}

func (f *HTTPFactory) Head(rawurl string) (*http.Response, error) {
return f.__do("HEAD", rawurl, nil)
func (f *HTTPFactory) __do(method, rawurl string, body io.Reader, header ...string) (*http.Response, error) {
req, err := http.NewRequest(method, rawurl, body)
if err != nil {
return nil, err
}
for i, l := 0, len(header); i < l; i += 2 {
req.Header.Set(header[i*2+0], header[i*2+1])
}
return __response(f.client.Do(req))
}

func (f *HTTPFactory) Do(r *Request) (*http.Response, error) {
Expand Down Expand Up @@ -127,8 +129,57 @@ func (f *HTTPFactory) Do(r *Request) (*http.Response, error) {
req.AddCookie(cookie)
}
}
return __response(f.client.Do(req))
}

func (f *HTTPFactory) Delete(rawurl string) (*http.Response, error) {
return f.__do("DELETE", rawurl, nil)
}
func (f *HTTPFactory) Put(rawurl string) (*http.Response, error) {
return f.__do("PUT", rawurl, nil)
}
func (f *HTTPFactory) Get(rawurl string) (*http.Response, error) {
return f.__do("GET", rawurl, nil)
}
func (f *HTTPFactory) Post(rawurl, contentType string, body io.Reader) (*http.Response, error) {
return f.__do("POST", rawurl, body, "Content-Type", contentType)
}
func (f *HTTPFactory) Head(rawurl string) (*http.Response, error) {
return f.__do("HEAD", rawurl, nil)
}
func (f *HTTPFactory) PostJson(rawurl string, values interface{}, args ...string) (*http.Response, error) {
contentType := "application/json"
if len(args) > 0 {
contentType = args[0]
}
r, w := io.Pipe()
go func() {
json.NewEncoder(w).Encode(values)
w.Close()
}()
return f.Post(rawurl, contentType, r)
}
func (f *HTTPFactory) PostForm(rawurl string, values url.Values, args ...string) (*http.Response, error) {
contentType := "application/x-www-form-urlencoded"
if len(args) > 0 {
contentType = args[0]
}
return f.Post(rawurl, contentType, strings.NewReader(values.Encode()))
}
func (f *HTTPFactory) PostString(rawurl string, values string, args ...string) (*http.Response, error) {
contentType := "text/plain"
if len(args) > 0 {
contentType = args[0]
}
return f.Post(rawurl, contentType, strings.NewReader(values))
}

return f.client.Do(req)
func (f *HTTPFactory) PostBuffer(rawurl string, values base.Buffer, args ...string) (*http.Response, error) {
contentType := "application/octet-stream"
if len(args) > 0 {
contentType = args[0]
}
return f.Post(rawurl, contentType, bytes.NewReader(values))
}

func (f *HTTPFactory) GetString(rawurl string) (string, error) {
Expand All @@ -140,7 +191,7 @@ func (f *HTTPFactory) GetString(rawurl string) (string, error) {
}

func (f *HTTPFactory) GetBuffer(rawurl string) (base.Buffer, error) {
resp, err := f.client.Get(rawurl)
resp, err := f.Get(rawurl)
if nil != err {
return nil, err
}
Expand All @@ -152,19 +203,3 @@ func (f *HTTPFactory) GetBuffer(rawurl string) (base.Buffer, error) {
}
return base.Buffer(buf), nil
}

func (f *HTTPFactory) PostString(rawurl string, values string, args ...string) (*http.Response, error) {
contentType := "text/plain"
if len(args) > 0 {
contentType = args[0]
}
return f.client.Post(rawurl, contentType, strings.NewReader(values))
}

func (f *HTTPFactory) PostBuffer(rawurl string, values base.Buffer, args ...string) (*http.Response, error) {
contentType := "application/octet-stream"
if len(args) > 0 {
contentType = args[0]
}
return f.client.Post(rawurl, contentType, bytes.NewReader(values))
}

0 comments on commit 4b6b093

Please sign in to comment.