add queue support
This commit is contained in:
parent
ff45eecd69
commit
d9e5206ba9
56
archive.go
Normal file
56
archive.go
Normal file
@ -0,0 +1,56 @@
|
||||
package starainrt
|
||||
|
||||
import (
|
||||
"archive/zip"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
)
|
||||
|
||||
func Unzip(src, dst string, shell func(string)) error {
|
||||
if !IsFile(src) {
|
||||
return errors.New(src + " Not Exists")
|
||||
}
|
||||
if Exists(dst) && !IsFolder(dst) {
|
||||
return errors.New(dst + " Exists And Not A Folder")
|
||||
}
|
||||
if !Exists(dst) {
|
||||
err := os.MkdirAll(dst, 0644)
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
zipreader, err := zip.OpenReader(src)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer zipreader.Close()
|
||||
for _, v := range zipreader.File {
|
||||
if v.FileInfo().IsDir() {
|
||||
err := os.MkdirAll(dst+string(os.PathSeparator)+v.Name, 0644)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
}
|
||||
continue
|
||||
}
|
||||
fp, err := v.Open()
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
continue
|
||||
}
|
||||
go shell(v.Name)
|
||||
fpdst, err := os.Create(dst + string(os.PathSeparator) + v.Name)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
continue
|
||||
}
|
||||
_, err = io.Copy(fpdst, fp)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
}
|
||||
fp.Close()
|
||||
fpdst.Close()
|
||||
}
|
||||
return nil
|
||||
}
|
10
archive_test.go
Normal file
10
archive_test.go
Normal file
@ -0,0 +1,10 @@
|
||||
package starainrt
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func Test_Unzip(t *testing.T) {
|
||||
Unzip(`C:\Users\Starainrt\Desktop\o\BK.ZIP`, `C:\Users\Starainrt\Desktop\o\lalala`, func(i string) { fmt.Println(i) })
|
||||
}
|
71
crypto.go
71
crypto.go
@ -30,6 +30,13 @@ import (
|
||||
)
|
||||
|
||||
type StarCrypto struct {
|
||||
Sha1 []byte
|
||||
Sha224 []byte
|
||||
Sha256 []byte
|
||||
Sha386 []byte
|
||||
Sha512 []byte
|
||||
Crc32 []byte
|
||||
Md5 []byte
|
||||
}
|
||||
|
||||
/*
|
||||
@ -49,41 +56,51 @@ func (this StarCrypto) Base64Decode(str string) ([]byte, error) {
|
||||
/*
|
||||
输出MD5校验值
|
||||
*/
|
||||
func (this StarCrypto) MD5(bstr []byte) string {
|
||||
func (this *StarCrypto) MD5(bstr []byte) string {
|
||||
md5sum := md5.New()
|
||||
return hex.EncodeToString(md5sum.Sum(bstr))
|
||||
md5sum.Write(bstr)
|
||||
this.Md5 = md5sum.Sum(nil)
|
||||
return hex.EncodeToString(this.Md5)
|
||||
}
|
||||
|
||||
/*
|
||||
输出CRC32校验值
|
||||
*/
|
||||
func (this StarCrypto) CRC32(bstr []byte) string {
|
||||
func (this *StarCrypto) CRC32(bstr []byte) string {
|
||||
crcsum := crc32.NewIEEE()
|
||||
return hex.EncodeToString(crcsum.Sum(bstr))
|
||||
crcsum.Write(bstr)
|
||||
this.Crc32 = crcsum.Sum(nil)
|
||||
return hex.EncodeToString(this.Crc32)
|
||||
}
|
||||
|
||||
/*
|
||||
输出SHA512校验值
|
||||
*/
|
||||
func (this StarCrypto) Sha512(bstr []byte) string {
|
||||
func (this *StarCrypto) SHA512(bstr []byte) string {
|
||||
shasum := sha512.New()
|
||||
return hex.EncodeToString(shasum.Sum(bstr))
|
||||
shasum.Write(bstr)
|
||||
this.Sha512 = shasum.Sum(nil)
|
||||
return hex.EncodeToString(this.Sha512)
|
||||
}
|
||||
|
||||
/*
|
||||
输出SHA256校验值
|
||||
*/
|
||||
func (this StarCrypto) SHA256(bstr []byte) string {
|
||||
func (this *StarCrypto) SHA256(bstr []byte) string {
|
||||
shasum := sha256.New()
|
||||
return hex.EncodeToString(shasum.Sum(bstr))
|
||||
shasum.Write(bstr)
|
||||
this.Sha256 = shasum.Sum(nil)
|
||||
return hex.EncodeToString(this.Sha256)
|
||||
}
|
||||
|
||||
/*
|
||||
输出SHA1校验值
|
||||
*/
|
||||
func (this StarCrypto) SHA1(bstr []byte) string {
|
||||
func (this *StarCrypto) SHA1(bstr []byte) string {
|
||||
shasum := sha1.New()
|
||||
return hex.EncodeToString(shasum.Sum(bstr))
|
||||
shasum.Write(bstr)
|
||||
this.Sha1 = shasum.Sum(nil)
|
||||
return hex.EncodeToString(this.Sha1)
|
||||
}
|
||||
|
||||
/*
|
||||
@ -570,6 +587,7 @@ func (this StarCrypto) RSAEncrypt(data, public []byte) ([]byte, error) {
|
||||
func (this StarCrypto) RSADecrypt(data, private []byte, password string) ([]byte, error) {
|
||||
var prikey *rsa.PrivateKey
|
||||
var err error
|
||||
var bytes []byte
|
||||
blk, _ := pem.Decode(private)
|
||||
if blk == nil {
|
||||
return []byte{}, errors.New("private key error!")
|
||||
@ -579,22 +597,25 @@ func (this StarCrypto) RSADecrypt(data, private []byte, password string) ([]byte
|
||||
if err != nil {
|
||||
return []byte{}, err
|
||||
}
|
||||
prikey, err = x509.ParsePKCS1PrivateKey(tmp)
|
||||
if err != nil {
|
||||
return []byte{}, err
|
||||
}
|
||||
bytes = tmp
|
||||
} else {
|
||||
prikey, err = x509.ParsePKCS1PrivateKey(blk.Bytes)
|
||||
bytes = blk.Bytes
|
||||
}
|
||||
prikey, err = x509.ParsePKCS1PrivateKey(bytes)
|
||||
if err != nil {
|
||||
tmp, err := x509.ParsePKCS8PrivateKey(bytes)
|
||||
if err != nil {
|
||||
return []byte{}, err
|
||||
}
|
||||
prikey = tmp.(*rsa.PrivateKey)
|
||||
}
|
||||
return rsa.DecryptPKCS1v15(rand.Reader, prikey, data)
|
||||
}
|
||||
|
||||
func (this StarCrypto) RSASign(hash256, private []byte, password string) ([]byte, error) {
|
||||
func (this StarCrypto) RSASign(hashdata, private []byte, password string, hashtype crypto.Hash) ([]byte, error) {
|
||||
var prikey *rsa.PrivateKey
|
||||
var err error
|
||||
var bytes []byte
|
||||
blk, _ := pem.Decode(private)
|
||||
if blk == nil {
|
||||
return []byte{}, errors.New("private key error!")
|
||||
@ -604,20 +625,22 @@ func (this StarCrypto) RSASign(hash256, private []byte, password string) ([]byte
|
||||
if err != nil {
|
||||
return []byte{}, err
|
||||
}
|
||||
prikey, err = x509.ParsePKCS1PrivateKey(tmp)
|
||||
if err != nil {
|
||||
return []byte{}, err
|
||||
}
|
||||
bytes = tmp
|
||||
} else {
|
||||
prikey, err = x509.ParsePKCS1PrivateKey(blk.Bytes)
|
||||
bytes = blk.Bytes
|
||||
}
|
||||
prikey, err = x509.ParsePKCS1PrivateKey(bytes)
|
||||
if err != nil {
|
||||
tmp, err := x509.ParsePKCS8PrivateKey(bytes)
|
||||
if err != nil {
|
||||
return []byte{}, err
|
||||
}
|
||||
prikey = tmp.(*rsa.PrivateKey)
|
||||
}
|
||||
return rsa.SignPKCS1v15(rand.Reader, prikey, crypto.SHA256, hash256)
|
||||
return rsa.SignPKCS1v15(rand.Reader, prikey, hashtype, hashdata)
|
||||
}
|
||||
|
||||
func (this StarCrypto) RSAVerify(data, hash256, public []byte) error {
|
||||
func (this StarCrypto) RSAVerify(data, hashdata, public []byte, hashtype crypto.Hash) error {
|
||||
blk, _ := pem.Decode(public)
|
||||
if blk == nil {
|
||||
return errors.New("public key error!")
|
||||
@ -626,7 +649,7 @@ func (this StarCrypto) RSAVerify(data, hash256, public []byte) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return rsa.VerifyPKCS1v15(pubkey.(*rsa.PublicKey), crypto.SHA256, hash256, data)
|
||||
return rsa.VerifyPKCS1v15(pubkey.(*rsa.PublicKey), hashtype, hashdata, data)
|
||||
}
|
||||
|
||||
func (this StarCrypto) VicqueEncodeV1(srcdata []byte, key string) []byte {
|
||||
|
395
http.go
Normal file
395
http.go
Normal file
@ -0,0 +1,395 @@
|
||||
package starainrt
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"crypto/rand"
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"mime/multipart"
|
||||
"net"
|
||||
"net/http"
|
||||
urls "net/url"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"time"
|
||||
)
|
||||
|
||||
type StarCurl struct {
|
||||
TimeOut int
|
||||
DialTimeOut int
|
||||
ReqHeader http.Header
|
||||
ReqCookies []*http.Cookie
|
||||
RespHeader http.Header
|
||||
RespCookies []*http.Cookie
|
||||
RespHttpCode int
|
||||
PostBuffer *bytes.Buffer
|
||||
CircleBuffer *CircleByteBuffer
|
||||
Proxy string
|
||||
}
|
||||
|
||||
func NewStarCurl() *StarCurl {
|
||||
star := new(StarCurl)
|
||||
star.ReqHeader = make(http.Header)
|
||||
star.TimeOut = 60
|
||||
star.DialTimeOut = 15
|
||||
star.PostBuffer = nil
|
||||
return star
|
||||
}
|
||||
|
||||
func (this *StarCurl) ResetReqHeader() {
|
||||
this.ReqHeader = make(http.Header)
|
||||
}
|
||||
|
||||
func (this *StarCurl) ResetReqCookies() {
|
||||
this.ReqCookies = []*http.Cookie{}
|
||||
}
|
||||
|
||||
func (this *StarCurl) AddSimpleCookie(key, value string) {
|
||||
this.ReqCookies = append(this.ReqCookies, &http.Cookie{Name: key, Value: value, Path: "/"})
|
||||
}
|
||||
|
||||
func randomBoundary() string {
|
||||
var buf [30]byte
|
||||
_, err := io.ReadFull(rand.Reader, buf[:])
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return fmt.Sprintf("%x", buf[:])
|
||||
|
||||
}
|
||||
|
||||
func (this *StarCurl) CurlWithFile(url string, postdata map[string]string, formname, fpath, savepath string, tofile bool, shell func(float64)) (result []byte, err error) {
|
||||
fpsrc, err := os.Open(fpath)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
defer fpsrc.Close()
|
||||
boundary := randomBoundary()
|
||||
boundarybytes := []byte("\r\n--" + boundary + "\r\n")
|
||||
endbytes := []byte("\r\n--" + boundary + "--\r\n")
|
||||
fpstat, _ := os.Stat(fpath)
|
||||
filebig := float64(fpstat.Size())
|
||||
sum, n := 0, 0
|
||||
fpdst := NewCircleByteBuffer(1048576)
|
||||
if postdata != nil {
|
||||
for k, v := range postdata {
|
||||
header := fmt.Sprintf("Content-Disposition: form-data; name=\"%s\";\r\nContent-Type: x-www-form-urlencoded \r\n\r\n", k)
|
||||
fpdst.Write(boundarybytes)
|
||||
fpdst.Write([]byte(header))
|
||||
fpdst.Write([]byte(v))
|
||||
}
|
||||
}
|
||||
header := fmt.Sprintf("Content-Disposition: form-data; name=\"%s\"; filename=\"%s\"\r\nContent-Type: application/octet-stream\r\n\r\n", formname, fpstat.Name())
|
||||
fpdst.Write(boundarybytes)
|
||||
fpdst.Write([]byte(header))
|
||||
go func() {
|
||||
for {
|
||||
bufs := make([]byte, 393213)
|
||||
n, err = fpsrc.Read(bufs)
|
||||
if err != nil {
|
||||
if err == io.EOF {
|
||||
if n != 0 {
|
||||
fpdst.Write(bufs[0:n])
|
||||
go shell(float64(sum+n) / filebig * 100)
|
||||
}
|
||||
break
|
||||
}
|
||||
return
|
||||
}
|
||||
sum += n
|
||||
go shell(float64(sum) / filebig * 100)
|
||||
fpdst.Write(bufs[0:n])
|
||||
}
|
||||
fpdst.Write(endbytes)
|
||||
fpdst.Write(nil)
|
||||
}()
|
||||
this.CircleBuffer = fpdst
|
||||
this.ReqHeader.Set("Content-Type", "multipart/form-data;boundary="+boundary)
|
||||
if tofile {
|
||||
err = this.CurlDataToFile(url, []byte{}, "POST", savepath, shell)
|
||||
this.ResetReqHeader()
|
||||
} else {
|
||||
result, err = this.Curl(url, []byte{}, "POST")
|
||||
}
|
||||
this.ResetReqHeader()
|
||||
return
|
||||
}
|
||||
|
||||
func (this *StarCurl) CurlWithFileByMemory(url string, postdata map[string]string, formname, fpath, savepath string, tofile bool, shell func(float64)) (result []byte, err error) {
|
||||
buf := &bytes.Buffer{}
|
||||
bufwriter := multipart.NewWriter(buf)
|
||||
if postdata != nil {
|
||||
for k, v := range postdata {
|
||||
bufwriter.WriteField(k, v)
|
||||
}
|
||||
}
|
||||
fpdst, err := bufwriter.CreateFormFile(formname, filepath.Base(fpath))
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
fpsrc, err := os.Open(fpath)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
defer fpsrc.Close()
|
||||
fpstat, _ := os.Stat(fpath)
|
||||
filebig := float64(fpstat.Size())
|
||||
sum, n := 0, 0
|
||||
for {
|
||||
bufs := make([]byte, 393213)
|
||||
n, err = fpsrc.Read(bufs)
|
||||
if err != nil {
|
||||
if err == io.EOF {
|
||||
if n != 0 {
|
||||
fpdst.Write(bufs[0:n])
|
||||
go shell(float64(sum+n) / filebig * 100)
|
||||
}
|
||||
break
|
||||
}
|
||||
return
|
||||
}
|
||||
sum += n
|
||||
go shell(float64(sum) / filebig * 100)
|
||||
fpdst.Write(bufs[0:n])
|
||||
}
|
||||
|
||||
this.PostBuffer = buf
|
||||
this.ReqHeader.Set("Content-Type", "multipart/form-data;boundary="+bufwriter.Boundary())
|
||||
bufwriter.Close()
|
||||
if tofile {
|
||||
err = this.CurlDataToFile(url, []byte{}, "POST", savepath, shell)
|
||||
this.ResetReqHeader()
|
||||
} else {
|
||||
result, err = this.Curl(url, []byte{}, "POST")
|
||||
}
|
||||
this.ResetReqHeader()
|
||||
return
|
||||
}
|
||||
|
||||
func (this *StarCurl) CurlDataToFile(url string, postdata []byte, method, fpath string, shell func(float64)) (err error) {
|
||||
var req *http.Request
|
||||
if method == "" {
|
||||
if len(postdata) != 0 {
|
||||
method = "POST"
|
||||
} else {
|
||||
method = "GET"
|
||||
}
|
||||
}
|
||||
if len(postdata) == 0 && this.PostBuffer == nil && this.CircleBuffer == nil {
|
||||
req, err = http.NewRequest(method, url, nil)
|
||||
} else if len(postdata) != 0 {
|
||||
req, err = http.NewRequest(method, url, bytes.NewBuffer(postdata))
|
||||
} else if this.PostBuffer != nil {
|
||||
req, err = http.NewRequest(method, url, this.PostBuffer)
|
||||
} else {
|
||||
req, err = http.NewRequest(method, url, this.CircleBuffer)
|
||||
}
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
if (this.ReqHeader == nil) && method == "POST" {
|
||||
this.ReqHeader.Set("Content-Type", "application/x-www-form-urlencoded")
|
||||
}
|
||||
req.Header = this.ReqHeader
|
||||
if len(this.ReqCookies) != 0 {
|
||||
for _, v := range this.ReqCookies {
|
||||
req.AddCookie(v)
|
||||
}
|
||||
}
|
||||
transport := &http.Transport{
|
||||
Dial: func(netw, addr string) (net.Conn, error) {
|
||||
deadline := time.Now().Add(time.Duration(this.TimeOut) * time.Second)
|
||||
c, err := net.DialTimeout(netw, addr, time.Second*time.Duration(this.DialTimeOut))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if this.TimeOut != 0 {
|
||||
c.SetDeadline(deadline)
|
||||
}
|
||||
return c, nil
|
||||
},
|
||||
}
|
||||
if this.Proxy != "" {
|
||||
purl, _ := urls.Parse(this.Proxy)
|
||||
transport.Proxy = http.ProxyURL(purl)
|
||||
}
|
||||
client := &http.Client{
|
||||
Transport: transport,
|
||||
}
|
||||
resp, err := client.Do(req)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
this.PostBuffer = nil
|
||||
this.CircleBuffer = nil
|
||||
this.RespHttpCode = resp.StatusCode
|
||||
this.RespHeader = resp.Header
|
||||
this.RespCookies = resp.Cookies()
|
||||
fpsrc, err := os.Create(fpath)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
defer fpsrc.Close()
|
||||
filebig := float64(resp.ContentLength)
|
||||
if filebig <= 0 {
|
||||
filebig = 100
|
||||
}
|
||||
var n, sum int = 0, 0
|
||||
for {
|
||||
buf := make([]byte, 393213)
|
||||
n, err = resp.Body.Read(buf)
|
||||
if err != nil {
|
||||
if err == io.EOF {
|
||||
err = nil
|
||||
if n != 0 {
|
||||
fpsrc.Write(buf[0:n])
|
||||
}
|
||||
go shell(100.00)
|
||||
break
|
||||
}
|
||||
return
|
||||
}
|
||||
sum += n
|
||||
go shell(float64(sum) / filebig * 100.00)
|
||||
fpsrc.Write(buf[0:n])
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func (this *StarCurl) Curl(url string, postdata []byte, method string) (body []byte, err error) {
|
||||
var req *http.Request
|
||||
if method == "" {
|
||||
if len(postdata) != 0 {
|
||||
method = "POST"
|
||||
} else {
|
||||
method = "GET"
|
||||
}
|
||||
}
|
||||
if len(postdata) == 0 && this.PostBuffer == nil && this.CircleBuffer == nil {
|
||||
req, err = http.NewRequest(method, url, nil)
|
||||
} else if len(postdata) != 0 {
|
||||
req, err = http.NewRequest(method, url, bytes.NewBuffer(postdata))
|
||||
} else if this.PostBuffer != nil {
|
||||
req, err = http.NewRequest(method, url, this.PostBuffer)
|
||||
} else {
|
||||
req, err = http.NewRequest(method, url, this.CircleBuffer)
|
||||
}
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
if (this.ReqHeader == nil) && method == "POST" {
|
||||
this.ReqHeader.Set("Content-Type", "application/x-www-form-urlencoded")
|
||||
}
|
||||
req.Header = this.ReqHeader
|
||||
if len(this.ReqCookies) != 0 {
|
||||
for _, v := range this.ReqCookies {
|
||||
req.AddCookie(v)
|
||||
}
|
||||
}
|
||||
transport := &http.Transport{
|
||||
Dial: func(netw, addr string) (net.Conn, error) {
|
||||
deadline := time.Now().Add(time.Duration(this.TimeOut) * time.Second)
|
||||
c, err := net.DialTimeout(netw, addr, time.Second*time.Duration(this.DialTimeOut))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if this.TimeOut != 0 {
|
||||
c.SetDeadline(deadline)
|
||||
}
|
||||
return c, nil
|
||||
},
|
||||
}
|
||||
if this.Proxy != "" {
|
||||
purl, _ := urls.Parse(this.Proxy)
|
||||
transport.Proxy = http.ProxyURL(purl)
|
||||
}
|
||||
client := &http.Client{
|
||||
Transport: transport,
|
||||
}
|
||||
resp, err := client.Do(req)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
this.PostBuffer = nil
|
||||
this.CircleBuffer = nil
|
||||
this.RespHttpCode = resp.StatusCode
|
||||
this.RespHeader = resp.Header
|
||||
this.RespCookies = resp.Cookies()
|
||||
body, err = ioutil.ReadAll(resp.Body)
|
||||
return
|
||||
}
|
||||
|
||||
//HttpNulReset将重置Header和Cookie为空
|
||||
func HttpNulReset() {
|
||||
var tmp map[string]string
|
||||
HttpNul, HttpNul2 = tmp, tmp
|
||||
}
|
||||
|
||||
func Curl(url string, postdata string, header map[string]string, cookie map[string]string, method string) (error, int, []byte, http.Header, []*http.Cookie) {
|
||||
var req *http.Request
|
||||
if method == "" {
|
||||
if len(postdata) != 0 {
|
||||
method = "POST"
|
||||
} else {
|
||||
method = "GET"
|
||||
}
|
||||
}
|
||||
BytePostData := []byte(postdata)
|
||||
if postdata == "" || len(postdata) == 0 {
|
||||
req, _ = http.NewRequest(method, url, nil)
|
||||
} else {
|
||||
req, _ = http.NewRequest(method, url, bytes.NewBuffer(BytePostData))
|
||||
}
|
||||
|
||||
if (len(header) == 0 || header == nil) && method == "POST" {
|
||||
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
|
||||
}
|
||||
for k, v := range header {
|
||||
req.Header.Set(k, v)
|
||||
}
|
||||
if len(cookie) != 0 {
|
||||
for k, v := range cookie {
|
||||
req.AddCookie(&http.Cookie{Name: k, Value: v, HttpOnly: true})
|
||||
}
|
||||
|
||||
}
|
||||
client := &http.Client{
|
||||
Transport: &http.Transport{
|
||||
Dial: func(netw, addr string) (net.Conn, error) {
|
||||
deadline := time.Now().Add(time.Duration(HttpTimeOut) * time.Second)
|
||||
c, err := net.DialTimeout(netw, addr, time.Second*time.Duration(HttpTimeOut))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
c.SetDeadline(deadline)
|
||||
return c, nil
|
||||
},
|
||||
}}
|
||||
resp, err := client.Do(req)
|
||||
var rte []*http.Cookie
|
||||
if err != nil {
|
||||
return err, 0, []byte(""), req.Header, rte
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
statuscode := resp.StatusCode
|
||||
hea := resp.Header
|
||||
body, _ := ioutil.ReadAll(resp.Body)
|
||||
return nil, statuscode, body, hea, resp.Cookies()
|
||||
|
||||
}
|
||||
|
||||
//CurlGet发起一个HTTP GET请求
|
||||
func CurlGet(url string) (error, []byte) {
|
||||
err, _, res, _, _ := Curl(url, "", HttpNul, HttpNul2, "GET")
|
||||
return err, res
|
||||
}
|
||||
|
||||
//CurlPost发起一个基于表单的HTTP Post请求
|
||||
func CurlPost(url, postdata string) (error, []byte) {
|
||||
err, _, res, _, _ := Curl(url, postdata, HttpNul, HttpNul2, "POST")
|
||||
return err, res
|
||||
}
|
@ -17,7 +17,7 @@ func Test_CfgParse(t *testing.T) {
|
||||
sakurs = ssss #[ossk]`
|
||||
//data, _ := ioutil.ReadFile(`c:\Users\Starainrt\Desktop\postgresql.conf`)
|
||||
ini := new(StarCfg)
|
||||
ini.ParseINI([]byte(data))
|
||||
ini.Seg("happy").SetInt64("sakura", 986787,"")
|
||||
ini.Parse([]byte(data))
|
||||
ini.Seg("happy").SetInt64("sakura", 986787, "")
|
||||
fmt.Println(string(ini.Build()))
|
||||
}
|
||||
|
476
net.go
476
net.go
@ -2,394 +2,138 @@ package starainrt
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"crypto/rand"
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"mime/multipart"
|
||||
"net"
|
||||
"net/http"
|
||||
urls "net/url"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"time"
|
||||
"errors"
|
||||
)
|
||||
|
||||
type StarCurl struct {
|
||||
TimeOut int
|
||||
DialTimeOut int
|
||||
ReqHeader http.Header
|
||||
ReqCookies []*http.Cookie
|
||||
RespHeader http.Header
|
||||
RespCookies []*http.Cookie
|
||||
RespHttpCode int
|
||||
PostBuffer *bytes.Buffer
|
||||
CircleBuffer *CircleByteBuffer
|
||||
Proxy string
|
||||
const SecretKey string = "1996victorique1127B612BTXL"
|
||||
|
||||
var header []byte = []byte{11, 27, 19, 96}
|
||||
var Crypto *StarCrypto
|
||||
|
||||
func init() {
|
||||
Crypto = new(StarCrypto)
|
||||
}
|
||||
|
||||
func NewStarCurl() *StarCurl {
|
||||
star := new(StarCurl)
|
||||
star.ReqHeader = make(http.Header)
|
||||
star.TimeOut = 60
|
||||
star.DialTimeOut = 15
|
||||
star.PostBuffer = nil
|
||||
return star
|
||||
type StarQueue struct {
|
||||
Encode bool
|
||||
Msgid uint16
|
||||
MsgPool []MsgUsed
|
||||
UnFinMsg []byte
|
||||
LastID int //= -1
|
||||
}
|
||||
|
||||
func (this *StarCurl) ResetReqHeader() {
|
||||
this.ReqHeader = make(http.Header)
|
||||
func NewQueue() *StarQueue {
|
||||
que := new(StarQueue)
|
||||
que.LastID = -1
|
||||
que.Encode = true
|
||||
return que
|
||||
}
|
||||
|
||||
func (this *StarCurl) ResetReqCookies() {
|
||||
this.ReqCookies = []*http.Cookie{}
|
||||
}
|
||||
|
||||
func (this *StarCurl) AddSimpleCookie(key, value string) {
|
||||
this.ReqCookies = append(this.ReqCookies, &http.Cookie{Name: key, Value: value})
|
||||
}
|
||||
|
||||
func randomBoundary() string {
|
||||
var buf [30]byte
|
||||
_, err := io.ReadFull(rand.Reader, buf[:])
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return fmt.Sprintf("%x", buf[:])
|
||||
|
||||
}
|
||||
|
||||
func (this *StarCurl) CurlWithFile(url string, postdata map[string]string, formname, fpath, savepath string, tofile bool, shell func(float64)) (result []byte, err error) {
|
||||
fpsrc, err := os.Open(fpath)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
defer fpsrc.Close()
|
||||
boundary := randomBoundary()
|
||||
boundarybytes := []byte("\r\n--" + boundary + "\r\n")
|
||||
endbytes := []byte("\r\n--" + boundary + "--\r\n")
|
||||
fpstat, _ := os.Stat(fpath)
|
||||
filebig := float64(fpstat.Size())
|
||||
sum, n := 0, 0
|
||||
fpdst := NewCircleByteBuffer(1048576)
|
||||
if postdata != nil {
|
||||
for k, v := range postdata {
|
||||
header := fmt.Sprintf("Content-Disposition: form-data; name=\"%s\";\r\nContent-Type: x-www-form-urlencoded \r\n\r\n", k)
|
||||
fpdst.Write(boundarybytes)
|
||||
fpdst.Write([]byte(header))
|
||||
fpdst.Write([]byte(v))
|
||||
}
|
||||
}
|
||||
header := fmt.Sprintf("Content-Disposition: form-data; name=\"%s\"; filename=\"%s\"\r\nContent-Type: application/octet-stream\r\n\r\n", formname, fpstat.Name())
|
||||
fpdst.Write(boundarybytes)
|
||||
fpdst.Write([]byte(header))
|
||||
go func() {
|
||||
for {
|
||||
bufs := make([]byte, 393213)
|
||||
n, err = fpsrc.Read(bufs)
|
||||
if err != nil {
|
||||
if err == io.EOF {
|
||||
if n != 0 {
|
||||
fpdst.Write(bufs[0:n])
|
||||
go shell(float64(sum+n) / filebig * 100)
|
||||
}
|
||||
break
|
||||
}
|
||||
return
|
||||
}
|
||||
sum += n
|
||||
go shell(float64(sum) / filebig * 100)
|
||||
fpdst.Write(bufs[0:n])
|
||||
}
|
||||
fpdst.Write(endbytes)
|
||||
fpdst.Write(nil)
|
||||
}()
|
||||
this.CircleBuffer = fpdst
|
||||
this.ReqHeader.Set("Content-Type", "multipart/form-data;boundary="+boundary)
|
||||
if tofile {
|
||||
err = this.CurlDataToFile(url, []byte{}, "POST", savepath, shell)
|
||||
this.ResetReqHeader()
|
||||
func (this *StarQueue) BuildMessage(str string) []byte {
|
||||
var msg []byte
|
||||
var buffer bytes.Buffer
|
||||
if this.Encode {
|
||||
msg = Crypto.VicqueEncodeV1([]byte(str), SecretKey)
|
||||
} else {
|
||||
result, err = this.Curl(url, []byte{}, "POST")
|
||||
msg = []byte(str)
|
||||
}
|
||||
this.ResetReqHeader()
|
||||
return
|
||||
buffer.Write([]byte(Crypto.CRC32(msg)))
|
||||
buffer.Write([]byte{byte(this.Msgid >> 8), byte(this.Msgid)})
|
||||
buffer.Write(msg)
|
||||
lens := len(buffer.Bytes())
|
||||
if lens > 65535 {
|
||||
return nil
|
||||
}
|
||||
msg = make([]byte, lens)
|
||||
copy(msg, buffer.Bytes())
|
||||
buffer.Reset()
|
||||
ulens := uint16(lens)
|
||||
buffer.Write(header)
|
||||
buffer.Write([]byte{byte(ulens >> 8), byte(ulens)})
|
||||
buffer.Write(msg)
|
||||
this.Msgid++
|
||||
return buffer.Bytes()
|
||||
}
|
||||
|
||||
func (this *StarCurl) CurlWithFileByMemory(url string, postdata map[string]string, formname, fpath, savepath string, tofile bool, shell func(float64)) (result []byte, err error) {
|
||||
buf := &bytes.Buffer{}
|
||||
bufwriter := multipart.NewWriter(buf)
|
||||
if postdata != nil {
|
||||
for k, v := range postdata {
|
||||
bufwriter.WriteField(k, v)
|
||||
}
|
||||
}
|
||||
fpdst, err := bufwriter.CreateFormFile(formname, filepath.Base(fpath))
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
fpsrc, err := os.Open(fpath)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
defer fpsrc.Close()
|
||||
fpstat, _ := os.Stat(fpath)
|
||||
filebig := float64(fpstat.Size())
|
||||
sum, n := 0, 0
|
||||
for {
|
||||
bufs := make([]byte, 393213)
|
||||
n, err = fpsrc.Read(bufs)
|
||||
if err != nil {
|
||||
if err == io.EOF {
|
||||
if n != 0 {
|
||||
fpdst.Write(bufs[0:n])
|
||||
go shell(float64(sum+n) / filebig * 100)
|
||||
}
|
||||
break
|
||||
}
|
||||
return
|
||||
}
|
||||
sum += n
|
||||
go shell(float64(sum) / filebig * 100)
|
||||
fpdst.Write(bufs[0:n])
|
||||
}
|
||||
type MsgUsed struct {
|
||||
ID uint16
|
||||
Msg string
|
||||
Crc32 string
|
||||
Ip string
|
||||
}
|
||||
|
||||
this.PostBuffer = buf
|
||||
this.ReqHeader.Set("Content-Type", "multipart/form-data;boundary="+bufwriter.Boundary())
|
||||
bufwriter.Close()
|
||||
if tofile {
|
||||
err = this.CurlDataToFile(url, []byte{}, "POST", savepath, shell)
|
||||
this.ResetReqHeader()
|
||||
func (this *StarQueue) ParseMessage(msg []byte, ip string) int {
|
||||
var buffer bytes.Buffer
|
||||
buffer.Write(this.UnFinMsg)
|
||||
buffer.Write(msg)
|
||||
msg = buffer.Bytes()
|
||||
if len(msg) <= 6 {
|
||||
this.UnFinMsg = msg
|
||||
return -2
|
||||
}
|
||||
if msg[0] != byte(11) {
|
||||
this.UnFinMsg = []byte{}
|
||||
//resend last
|
||||
return this.LastID + 1
|
||||
}
|
||||
if msg[1] != byte(27) || msg[2] != byte(19) || msg[3] != byte(96) {
|
||||
//resend last
|
||||
this.UnFinMsg = []byte{}
|
||||
return this.LastID + 1
|
||||
}
|
||||
length := uint16(uint(msg[4])<<uint(8) + uint(msg[5]))
|
||||
if 6+length > uint16(len(msg)) {
|
||||
this.UnFinMsg = msg
|
||||
return -2
|
||||
} else {
|
||||
result, err = this.Curl(url, []byte{}, "POST")
|
||||
}
|
||||
this.ResetReqHeader()
|
||||
return
|
||||
}
|
||||
|
||||
func (this *StarCurl) CurlDataToFile(url string, postdata []byte, method, fpath string, shell func(float64)) (err error) {
|
||||
var req *http.Request
|
||||
if method == "" {
|
||||
if len(postdata) != 0 {
|
||||
method = "POST"
|
||||
this.UnFinMsg = []byte{}
|
||||
strmsg := msg[6 : length+6]
|
||||
crc := strmsg[0:8]
|
||||
id := strmsg[8:10]
|
||||
strmsg = strmsg[10:]
|
||||
if Crypto.CRC32([]byte(strmsg)) != string(crc) {
|
||||
//resend last
|
||||
this.UnFinMsg = []byte{}
|
||||
return this.LastID + 1
|
||||
} else {
|
||||
method = "GET"
|
||||
if this.Encode {
|
||||
strmsg = Crypto.VicqueDecodeV1(strmsg, SecretKey)
|
||||
}
|
||||
msgs := MsgUsed{uint16(uint(id[0])<<8 + uint(id[1])), string(strmsg), string(crc), ip}
|
||||
this.LastID = int(msgs.ID)
|
||||
this.MsgPool = append(this.MsgPool, msgs)
|
||||
}
|
||||
if 6+length == uint16(len(msg)) {
|
||||
return -2
|
||||
}
|
||||
msg = msg[length+6:]
|
||||
return this.ParseMessage(msg, ip)
|
||||
}
|
||||
if len(postdata) == 0 && this.PostBuffer == nil && this.CircleBuffer == nil {
|
||||
req, err = http.NewRequest(method, url, nil)
|
||||
} else if len(postdata) != 0 {
|
||||
req, err = http.NewRequest(method, url, bytes.NewBuffer(postdata))
|
||||
} else if this.PostBuffer != nil {
|
||||
req, err = http.NewRequest(method, url, this.PostBuffer)
|
||||
return -2
|
||||
}
|
||||
|
||||
func (this *StarQueue) Restore(n int) ([]MsgUsed, error) {
|
||||
if n > len(this.MsgPool) {
|
||||
return nil, errors.New("N is Too Large")
|
||||
}
|
||||
tmp := this.MsgPool[0:n]
|
||||
if n != len(this.MsgPool) {
|
||||
this.MsgPool = this.MsgPool[n:]
|
||||
} else {
|
||||
req, err = http.NewRequest(method, url, this.CircleBuffer)
|
||||
this.MsgPool = []MsgUsed{}
|
||||
}
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
if (this.ReqHeader == nil) && method == "POST" {
|
||||
this.ReqHeader.Set("Content-Type", "application/x-www-form-urlencoded")
|
||||
}
|
||||
req.Header = this.ReqHeader
|
||||
if len(this.ReqCookies) != 0 {
|
||||
for _, v := range this.ReqCookies {
|
||||
req.AddCookie(v)
|
||||
}
|
||||
}
|
||||
transport := &http.Transport{
|
||||
Dial: func(netw, addr string) (net.Conn, error) {
|
||||
deadline := time.Now().Add(time.Duration(this.TimeOut) * time.Second)
|
||||
c, err := net.DialTimeout(netw, addr, time.Second*time.Duration(this.DialTimeOut))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if this.TimeOut != 0 {
|
||||
c.SetDeadline(deadline)
|
||||
}
|
||||
return c, nil
|
||||
},
|
||||
}
|
||||
if this.Proxy != "" {
|
||||
purl, _ := urls.Parse(this.Proxy)
|
||||
transport.Proxy = http.ProxyURL(purl)
|
||||
}
|
||||
client := &http.Client{
|
||||
Transport: transport,
|
||||
}
|
||||
resp, err := client.Do(req)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
this.PostBuffer = nil
|
||||
this.CircleBuffer = nil
|
||||
this.RespHttpCode = resp.StatusCode
|
||||
this.RespHeader = resp.Header
|
||||
this.RespCookies = resp.Cookies()
|
||||
fpsrc, err := os.Create(fpath)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
defer fpsrc.Close()
|
||||
filebig := float64(resp.ContentLength)
|
||||
if filebig <= 0 {
|
||||
filebig = 100
|
||||
}
|
||||
var n, sum int = 0, 0
|
||||
for {
|
||||
buf := make([]byte, 393213)
|
||||
n, err = resp.Body.Read(buf)
|
||||
if err != nil {
|
||||
if err == io.EOF {
|
||||
err = nil
|
||||
if n != 0 {
|
||||
fpsrc.Write(buf[0:n])
|
||||
}
|
||||
go shell(100.00)
|
||||
break
|
||||
}
|
||||
return
|
||||
}
|
||||
sum += n
|
||||
go shell(float64(sum) / filebig * 100.00)
|
||||
fpsrc.Write(buf[0:n])
|
||||
}
|
||||
return
|
||||
return tmp, nil
|
||||
}
|
||||
|
||||
func (this *StarCurl) Curl(url string, postdata []byte, method string) (body []byte, err error) {
|
||||
var req *http.Request
|
||||
if method == "" {
|
||||
if len(postdata) != 0 {
|
||||
method = "POST"
|
||||
} else {
|
||||
method = "GET"
|
||||
}
|
||||
func (this *StarQueue) RestoreOne() (MsgUsed, error) {
|
||||
if len(this.MsgPool) == 0 {
|
||||
return MsgUsed{}, errors.New("N is Too Large")
|
||||
}
|
||||
if len(postdata) == 0 && this.PostBuffer == nil && this.CircleBuffer == nil {
|
||||
req, err = http.NewRequest(method, url, nil)
|
||||
} else if len(postdata) != 0 {
|
||||
req, err = http.NewRequest(method, url, bytes.NewBuffer(postdata))
|
||||
} else if this.PostBuffer != nil {
|
||||
req, err = http.NewRequest(method, url, this.PostBuffer)
|
||||
tmp := this.MsgPool[0]
|
||||
if 1 != len(this.MsgPool) {
|
||||
this.MsgPool = this.MsgPool[1:]
|
||||
} else {
|
||||
req, err = http.NewRequest(method, url, this.CircleBuffer)
|
||||
this.MsgPool = []MsgUsed{}
|
||||
}
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
if (this.ReqHeader == nil) && method == "POST" {
|
||||
this.ReqHeader.Set("Content-Type", "application/x-www-form-urlencoded")
|
||||
}
|
||||
req.Header = this.ReqHeader
|
||||
if len(this.ReqCookies) != 0 {
|
||||
for _, v := range this.ReqCookies {
|
||||
req.AddCookie(v)
|
||||
}
|
||||
}
|
||||
transport := &http.Transport{
|
||||
Dial: func(netw, addr string) (net.Conn, error) {
|
||||
deadline := time.Now().Add(time.Duration(this.TimeOut) * time.Second)
|
||||
c, err := net.DialTimeout(netw, addr, time.Second*time.Duration(this.DialTimeOut))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if this.TimeOut != 0 {
|
||||
c.SetDeadline(deadline)
|
||||
}
|
||||
return c, nil
|
||||
},
|
||||
}
|
||||
if this.Proxy != "" {
|
||||
purl, _ := urls.Parse(this.Proxy)
|
||||
transport.Proxy = http.ProxyURL(purl)
|
||||
}
|
||||
client := &http.Client{
|
||||
Transport: transport,
|
||||
}
|
||||
resp, err := client.Do(req)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
this.PostBuffer = nil
|
||||
this.CircleBuffer = nil
|
||||
this.RespHttpCode = resp.StatusCode
|
||||
this.RespHeader = resp.Header
|
||||
this.RespCookies = resp.Cookies()
|
||||
body, err = ioutil.ReadAll(resp.Body)
|
||||
return
|
||||
}
|
||||
|
||||
//HttpNulReset将重置Header和Cookie为空
|
||||
func HttpNulReset() {
|
||||
var tmp map[string]string
|
||||
HttpNul, HttpNul2 = tmp, tmp
|
||||
}
|
||||
|
||||
func Curl(url string, postdata string, header map[string]string, cookie map[string]string, method string) (error, int, []byte, http.Header, []*http.Cookie) {
|
||||
var req *http.Request
|
||||
if method == "" {
|
||||
if len(postdata) != 0 {
|
||||
method = "POST"
|
||||
} else {
|
||||
method = "GET"
|
||||
}
|
||||
}
|
||||
BytePostData := []byte(postdata)
|
||||
if postdata == "" || len(postdata) == 0 {
|
||||
req, _ = http.NewRequest(method, url, nil)
|
||||
} else {
|
||||
req, _ = http.NewRequest(method, url, bytes.NewBuffer(BytePostData))
|
||||
}
|
||||
|
||||
if (len(header) == 0 || header == nil) && method == "POST" {
|
||||
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
|
||||
}
|
||||
for k, v := range header {
|
||||
req.Header.Set(k, v)
|
||||
}
|
||||
if len(cookie) != 0 {
|
||||
for k, v := range cookie {
|
||||
req.AddCookie(&http.Cookie{Name: k, Value: v, HttpOnly: true})
|
||||
}
|
||||
|
||||
}
|
||||
client := &http.Client{
|
||||
Transport: &http.Transport{
|
||||
Dial: func(netw, addr string) (net.Conn, error) {
|
||||
deadline := time.Now().Add(time.Duration(HttpTimeOut) * time.Second)
|
||||
c, err := net.DialTimeout(netw, addr, time.Second*time.Duration(HttpTimeOut))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
c.SetDeadline(deadline)
|
||||
return c, nil
|
||||
},
|
||||
}}
|
||||
resp, err := client.Do(req)
|
||||
var rte []*http.Cookie
|
||||
if err != nil {
|
||||
return err, 0, []byte(""), req.Header, rte
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
statuscode := resp.StatusCode
|
||||
hea := resp.Header
|
||||
body, _ := ioutil.ReadAll(resp.Body)
|
||||
return nil, statuscode, body, hea, resp.Cookies()
|
||||
|
||||
}
|
||||
|
||||
//CurlGet发起一个HTTP GET请求
|
||||
func CurlGet(url string) (error, []byte) {
|
||||
err, _, res, _, _ := Curl(url, "", HttpNul, HttpNul2, "GET")
|
||||
return err, res
|
||||
}
|
||||
|
||||
//CurlPost发起一个基于表单的HTTP Post请求
|
||||
func CurlPost(url, postdata string) (error, []byte) {
|
||||
err, _, res, _, _ := Curl(url, postdata, HttpNul, HttpNul2, "POST")
|
||||
return err, res
|
||||
return tmp, nil
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user