diff --git a/archive.go b/archive.go new file mode 100644 index 0000000..f11b2ae --- /dev/null +++ b/archive.go @@ -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 +} diff --git a/archive_test.go b/archive_test.go new file mode 100644 index 0000000..f273d2c --- /dev/null +++ b/archive_test.go @@ -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) }) +} diff --git a/crypto.go b/crypto.go index 654f2bc..3fde8a3 100644 --- a/crypto.go +++ b/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 { diff --git a/http.go b/http.go new file mode 100644 index 0000000..bebc7ea --- /dev/null +++ b/http.go @@ -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 +} diff --git a/ini_test.go b/ini_test.go index a0f18d9..dfaa9ed 100644 --- a/ini_test.go +++ b/ini_test.go @@ -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())) } diff --git a/net.go b/net.go index ef8cb53..6e247a3 100644 --- a/net.go +++ b/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" -func NewStarCurl() *StarCurl { - star := new(StarCurl) - star.ReqHeader = make(http.Header) - star.TimeOut = 60 - star.DialTimeOut = 15 - star.PostBuffer = nil - return star -} +var header []byte = []byte{11, 27, 19, 96} +var Crypto *StarCrypto -func (this *StarCurl) ResetReqHeader() { - this.ReqHeader = make(http.Header) +func init() { + Crypto = new(StarCrypto) } -func (this *StarCurl) ResetReqCookies() { - this.ReqCookies = []*http.Cookie{} +type StarQueue struct { + Encode bool + Msgid uint16 + MsgPool []MsgUsed + UnFinMsg []byte + LastID int //= -1 } -func (this *StarCurl) AddSimpleCookie(key, value string) { - this.ReqCookies = append(this.ReqCookies, &http.Cookie{Name: key, Value: value}) +func NewQueue() *StarQueue { + que := new(StarQueue) + que.LastID = -1 + que.Encode = true + return que } -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") - } - this.ResetReqHeader() - return + msg = []byte(str) + } + 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]) - } - - 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 +type MsgUsed struct { + ID uint16 + Msg string + Crc32 string + Ip string } -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) +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])< uint16(len(msg)) { + this.UnFinMsg = msg + return -2 } 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 + 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 { + if this.Encode { + strmsg = Crypto.VicqueDecodeV1(strmsg, SecretKey) } - return + 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 } - sum += n - go shell(float64(sum) / filebig * 100.00) - fpsrc.Write(buf[0:n]) + msg = msg[length+6:] + return this.ParseMessage(msg, ip) } - return + return -2 } -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) Restore(n int) ([]MsgUsed, error) { + if n > len(this.MsgPool) { + return nil, 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:n] + if n != len(this.MsgPool) { + this.MsgPool = this.MsgPool[n:] } 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 + this.MsgPool = []MsgUsed{} } - 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 + return tmp, nil } -//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" - } +func (this *StarQueue) RestoreOne() (MsgUsed, error) { + if len(this.MsgPool) == 0 { + return MsgUsed{}, errors.New("N is Too Large") } - BytePostData := []byte(postdata) - if postdata == "" || len(postdata) == 0 { - req, _ = http.NewRequest(method, url, nil) + tmp := this.MsgPool[0] + if 1 != len(this.MsgPool) { + this.MsgPool = this.MsgPool[1:] } else { - req, _ = http.NewRequest(method, url, bytes.NewBuffer(BytePostData)) + this.MsgPool = []MsgUsed{} } - - 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 }