-package part
+package part
import (
- "fmt"
- "time"
+ "errors"
+ "fmt"
+ "os"
"runtime"
"strings"
"syscall"
- "errors"
- "os"
- "io/ioutil"
+ "time"
reqf "github.com/qydysky/part/reqf"
)
RV []interface{}
}
-func Checkfile() *checkfile{
- return &checkfile{}
+func Checkfile() *checkfile {
+ return &checkfile{}
}
-func (this *checkfile) Build(checkFile,root,checkDir,SplitString string,usemd5 bool) {
-
- v,_,_:=this.GetAllFile(checkDir)
- _checkFile := Filel {
- File:checkFile,
- Loc:0,
+func (t *checkfile) Build(checkFile, root, checkDir, SplitString string, usemd5 bool) {
+
+ v, _, _ := t.GetAllFile(checkDir)
+ _checkFile := Filel{
+ File: checkFile,
+ Loc: 0,
}
Logf().I("checkFile Build:begin")
- if usemd5 {_checkFile.Context = append(_checkFile.Context, "UseMd5")}
+ if usemd5 {
+ _checkFile.Context = append(_checkFile.Context, "UseMd5")
+ }
_checkFile.Context = append(_checkFile.Context, SplitString)
- for _,value := range v {
- if usemd5 {
+ for _, value := range v {
+ if usemd5 {
md5, e := Md5().Md5File(value)
- if e != nil {md5 = "00000000000000000000000000000000"}
+ if e != nil {
+ md5 = "00000000000000000000000000000000"
+ }
_checkFile.Context = append(_checkFile.Context, md5)
}
_checkFile.Context = append(_checkFile.Context, value[len(root):])
_checkFile.Context = append(_checkFile.Context, SplitString)
}
-
+
File().FileWR(_checkFile)
Logf().I("checkFile Build:ok")
}
func (t *checkfile) IsExist(f string) bool {
- if len(f) > 4096 {return false}
+ if len(f) > 4096 {
+ return false
+ }
_, err := os.Stat(f)
if err != nil {
if errors.Is(err, os.ErrNotExist) {
- t.RV = append(t.RV,false,nil)
+ t.RV = append(t.RV, false, nil)
return false
- }else{
- if !strings.Contains(err.Error(),"file name too long") {
+ } else {
+ if !strings.Contains(err.Error(), "file name too long") {
Logf().E(err)
}
- t.RV = append(t.RV,false,err)
+ t.RV = append(t.RV, false, err)
return false
}
}
- t.RV = append(t.RV,true,nil)
+ t.RV = append(t.RV, true, nil)
return true
}
-func (this *checkfile) IsOpen(f string) bool {
- if !this.IsExist(f) {return false}
-
- fi,e:=os.OpenFile(f, syscall.O_RDONLY|syscall.O_EXCL, 0)
- if e!=nil {return true}
+func (t *checkfile) IsOpen(f string) bool {
+ if !t.IsExist(f) {
+ return false
+ }
+
+ fi, e := os.OpenFile(f, syscall.O_RDONLY|syscall.O_EXCL, 0)
+ if e != nil {
+ return true
+ }
fi.Close()
return false
}
-func (this *checkfile) Checkfile(src string)(string,error){
+func (t *checkfile) Checkfile(src string) (string, error) {
- _,str,err:=this.GetAllFile(src)
+ _, str, err := t.GetAllFile(src)
- if err !=nil {return "",errors.New("获取文件列表错误!")}
+ if err != nil {
+ return "", errors.New("获取文件列表错误!")
+ }
- return Md5().Md5String(str),nil
+ return Md5().Md5String(str), nil
}
-func (this *checkfile) GetAllFile(pathname string) ([]string,string,error) {
+func (t *checkfile) GetAllFile(pathname string) ([]string, string, error) {
- var (
+ var (
returnVal string = ""
- list []string
+ list []string
)
- rd, err := ioutil.ReadDir(pathname)
+ rd, err := os.ReadDir(pathname)
- if err != nil {return list,returnVal,err}
+ if err != nil {
+ return list, returnVal, err
+ }
- for _, fi := range rd {
- if fi.IsDir() {
- _list, _returnVal, _:=this.GetAllFile(pathname + fi.Name() + "/")
- returnVal+=_returnVal
+ for _, fi := range rd {
+ if fi.IsDir() {
+ _list, _returnVal, _ := t.GetAllFile(pathname + fi.Name() + "/")
+ returnVal += _returnVal
list = append(list, _list...)
- } else {
- returnVal+=pathname + "/" + fi.Name() + "\n"
- list = append(list, pathname + fi.Name())
- }
- }
- return list,returnVal,err
+ } else {
+ returnVal += pathname + "/" + fi.Name() + "\n"
+ list = append(list, pathname+fi.Name())
+ }
+ }
+ return list, returnVal, err
}
-func (this *checkfile) GetFileSize(path string) int64 {
+func (t *checkfile) GetFileSize(path string) int64 {
- if !this.IsExist(path) {
- return 0
- }
- fileInfo, err := os.Stat(path)
- if err != nil {
- return 0
- }
- return fileInfo.Size()
+ if !t.IsExist(path) {
+ return 0
+ }
+ fileInfo, err := os.Stat(path)
+ if err != nil {
+ return 0
+ }
+ return fileInfo.Size()
}
-func (this *checkfile) CheckList(checkFile,root,SplitString string)bool{
-
+func (t *checkfile) CheckList(checkFile, root, SplitString string) bool {
+
if checkFile == "" || SplitString == "" {
Logf().E("[err]checkFile or SplitString has null.")
return false
Logf().I("===checkFile Check===")
var checkFileString string
- var checkFileList []string
- if strings.Contains(checkFile,"https://") {
+ var checkFileList []string
+ if strings.Contains(checkFile, "https://") {
Logf().I("[wait]checkFile: Getting checkfile...")
- var r = reqf.Rval {
- Url:checkFile,
- Timeout:6,
- Retry:2,
+ var r = reqf.Rval{
+ Url: checkFile,
+ Timeout: 6,
+ Retry: 2,
}
req := reqf.New()
- if e:=req.Reqf(r);e != nil {
- Logf().E("[err]checkFile:",checkFile,e.Error())
+ if e := req.Reqf(r); e != nil {
+ Logf().E("[err]checkFile:", checkFile, e.Error())
return false
- }else{
+ } else {
Logf().I("[ok]checkFile: Get checkfile.")
- checkFileString=string(req.Respon)
+ checkFileString = string(req.Respon)
}
- }else{
- var _checkFile = Filel {
- File:checkFile,
- Loc:0,
+ } else {
+ var _checkFile = Filel{
+ File: checkFile,
+ Loc: 0,
}
-
- checkFileString=File().FileWR(_checkFile)
+
+ checkFileString = File().FileWR(_checkFile)
}
- checkFileList=strings.Split(checkFileString,SplitString);
+ checkFileList = strings.Split(checkFileString, SplitString)
var (
returnVal bool = true
- UseMd5 bool = strings.Contains(checkFileList[0], "UseMd5")
- _value string
+ UseMd5 bool = strings.Contains(checkFileList[0], "UseMd5")
+ _value string
)
- for _,value := range checkFileList[1:] {
- if value == "" {continue}
+ for _, value := range checkFileList[1:] {
+ if value == "" {
+ continue
+ }
+
+ if UseMd5 {
+ _value = root + value[32:]
+ } else {
+ _value = root + value
+ }
- if UseMd5 {_value = root + value[32:]}else{_value = root + value}
-
- if !this.IsExist(_value) {
+ if !t.IsExist(_value) {
Logf().E("[err]checkFile:", _value, "not exist!")
returnVal = false
- }else{
+ } else {
if UseMd5 {
- if md5,_ := Md5().Md5File(_value); value[:32] != md5 {
+ if md5, _ := Md5().Md5File(_value); value[:32] != md5 {
Logf().E("[err]checkFile:", _value, "no match!")
returnVal = false
}
}
-
+
if runtime.GOOS != "windows" && strings.Contains(_value, ".run") {
var want os.FileMode = 0700
- if !this.CheckFilePerm(_value, want) {
+ if !t.CheckFilePerm(_value, want) {
Logf().E("[err]checkFile:", _value, "no permission!")
returnVal = false
}
}
}
- if returnVal {Logf().I("[ok]checkFile: all file pass!")}
+ if returnVal {
+ Logf().I("[ok]checkFile: all file pass!")
+ }
Logf().I("===checkFile Check===")
return returnVal
}
-func (this *checkfile) GetFileModTime(path string) (error,int64) {
+func (t *checkfile) GetFileModTime(path string) (error, int64) {
- if !this.IsExist(path) {return errors.New("not exist"),time.Now().Unix()}
+ if !t.IsExist(path) {
+ return errors.New("not exist"), time.Now().Unix()
+ }
f, err := os.Open(path)
if err != nil {
fmt.Println("open file error")
- return err,time.Now().Unix()
+ return err, time.Now().Unix()
}
defer f.Close()
fi, err := f.Stat()
if err != nil {
fmt.Println("stat fileinfo error")
- return err,time.Now().Unix()
+ return err, time.Now().Unix()
}
- return nil,fi.ModTime().Unix()
+ return nil, fi.ModTime().Unix()
}
-func (this *checkfile) CheckFilePerm(f string,want os.FileMode)bool{
+func (t *checkfile) CheckFilePerm(f string, want os.FileMode) bool {
fi, err := os.Lstat(f)
if err != nil {
- Logf().E("[err]cant get permission : ",f);
+ Logf().E("[err]cant get permission : ", f)
return false
}
- return fi.Mode().Perm()>=want
+ return fi.Mode().Perm() >= want
}
package part
import (
- "sync"
- "strings"
"fmt"
- "os"
"io"
- "io/ioutil"
+ "os"
+ "strings"
+ "sync"
"syscall"
Ppart "github.com/qydysky/part/linuxwin"
)
type Filel struct {
- File string //src
- Loc int64 //WriteOrRead loc ;0:rewrite Or read all;-1 write on end
+ File string //src
+ Loc int64 //WriteOrRead loc ;0:rewrite Or read all;-1 write on end
ReadNum int64
Context []interface{} //Write string
// wrap with encoder/decoder
//https://pkg.go.dev/golang.org/x/text/encoding
- WrapWriter func(io.Writer)(io.Writer)
+ WrapWriter func(io.Writer) io.Writer
// WrapReader func(io.Reader)(io.Reader)
// read func(b []byte)(int,error)
- write func(b []byte)(int,error)
+ write func(b []byte) (int, error)
}
// func (t Filel) Read(b []byte)(int,error){return t.read(b)}
-func (t Filel) Write(b []byte)(int,error){return t.write(b)}
-
+func (t Filel) Write(b []byte) (int, error) { return t.write(b) }
-func File() *file{
+func File() *file {
return &file{}
}
func (this *file) FileWR(C Filel) string {
- this.Lock()
+ this.Lock()
defer this.Unlock()
var returnVal string
- if C.File == "" {returnVal="";return returnVal}
-
+ if C.File == "" {
+ returnVal = ""
+ return returnVal
+ }
+
if len(C.Context) != 0 {
switch C.Context[0].(type) {
case io.Reader:
fmt.Println("Err:copy only allow one context")
return ""
}
- returnVal=this.copy(C)
+ returnVal = this.copy(C)
default:
- returnVal=this.write(C)
+ returnVal = this.write(C)
}
- }else{
- returnVal=this.read(C)
+ } else {
+ returnVal = this.read(C)
}
return returnVal
func (this *file) copy(C Filel) string {
var (
- File string=C.File
+ File string = C.File
)
this.NewPath(File)
- fileObj,err := os.OpenFile(File,os.O_RDWR|os.O_EXCL|os.O_TRUNC,0644)
+ fileObj, err := os.OpenFile(File, os.O_RDWR|os.O_EXCL|os.O_TRUNC, 0644)
if err != nil {
- fmt.Println("Err:cant open file:",File,err);
+ fmt.Println("Err:cant open file:", File, err)
return ""
}
defer fileObj.Close()
if _, err := io.Copy(fileObj, C.Context[0].(io.Reader)); err != nil {
- fmt.Println("Err:cant copy file:",File,err);
+ fmt.Println("Err:cant copy file:", File, err)
return ""
}
return "ok"
func (this *file) write(C Filel) string {
var (
- File string=C.File
- Loc int64=C.Loc
+ File string = C.File
+ Loc int64 = C.Loc
)
this.NewPath(File)
- var Kind int
+ var Kind int
switch Loc {
- case 0:Kind=os.O_RDWR|os.O_EXCL|os.O_TRUNC
- default:Kind=os.O_RDWR|os.O_EXCL
+ case 0:
+ Kind = os.O_RDWR | os.O_EXCL | os.O_TRUNC
+ default:
+ Kind = os.O_RDWR | os.O_EXCL
}
- fileObj,err := os.OpenFile(File,Kind,0644)
+ fileObj, err := os.OpenFile(File, Kind, 0644)
if err != nil {
- fmt.Println("Err:cant open file:",File,err);
+ fmt.Println("Err:cant open file:", File, err)
return ""
}
defer fileObj.Close()
- Loc=this.locfix(Loc,File,fileObj)
+ Loc = this.locfix(Loc, File, fileObj)
var writer io.Writer
- C.write = func(b []byte)(int, error){
+ C.write = func(b []byte) (int, error) {
return fileObj.WriteAt(b, Loc)
}
writer = C
writer = C.WrapWriter(writer)
}
- for _,v := range C.Context{
+ for _, v := range C.Context {
switch v.(type) {
case []uint8:
tmp := v.([]byte)
_, err = writer.Write(tmp)
if err != nil {
- fmt.Println("Err:cant write file:",File,err);
+ fmt.Println("Err:cant write file:", File, err)
return ""
}
Loc += int64(len(tmp))
tmp := []byte(v.(string))
_, err = writer.Write(tmp)
if err != nil {
- fmt.Println("Err:cant write file:",File,err);
+ fmt.Println("Err:cant write file:", File, err)
return ""
}
Loc += int64(len(tmp))
default:
- fmt.Println("Err:need context type string or []byte");
+ fmt.Println("Err:need context type string or []byte")
return ""
}
}
func (this *file) read(C Filel) string {
var (
- File string=C.File
- Loc int64=C.Loc
- ReadNum int64=C.ReadNum
+ File string = C.File
+ Loc int64 = C.Loc
+ ReadNum int64 = C.ReadNum
)
- fileObj,err := os.OpenFile(File,os.O_RDONLY,0644)
+ fileObj, err := os.OpenFile(File, os.O_RDONLY, 0644)
if err != nil {
- fmt.Println("Err:cant open file:",File,err);
+ fmt.Println("Err:cant open file:", File, err)
return ""
}
defer fileObj.Close()
- Loc=this.locfix(Loc,File,fileObj)
+ Loc = this.locfix(Loc, File, fileObj)
if ReadNum == 0 {
- returnVal,err := ioutil.ReadAll(fileObj)
+ returnVal, err := io.ReadAll(fileObj)
if err != nil {
- fmt.Println("Err:cant read file:",File,err);
+ fmt.Println("Err:cant read file:", File, err)
return ""
}
return string(returnVal[Loc:])
}
-
+
buf := make([]byte, ReadNum)
- _, err=fileObj.ReadAt(buf,Loc)
+ _, err = fileObj.ReadAt(buf, Loc)
if err != nil {
- fmt.Println("Err:cant read file:",File,err);
+ fmt.Println("Err:cant read file:", File, err)
return ""
}
return string(buf)
}
-func (this *file) locfix(Loc int64,File string,fileObj *os.File)int64{
+func (this *file) locfix(Loc int64, File string, fileObj *os.File) int64 {
var returnVal int64
- FileInfo,err:=fileObj.Stat()
+ FileInfo, err := fileObj.Stat()
if err != nil {
- fmt.Println("Err:cant read file lenght",File,err)
+ fmt.Println("Err:cant read file lenght", File, err)
return 0
}
- if Loc<0 {
- returnVal=FileInfo.Size()+1+Loc
+ if Loc < 0 {
+ returnVal = FileInfo.Size() + 1 + Loc
}
- if returnVal<0 || returnVal>FileInfo.Size() {
- fmt.Println("Err:outrage of file lenght",File,Loc,"out of 0 ~",FileInfo.Size())
+ if returnVal < 0 || returnVal > FileInfo.Size() {
+ fmt.Println("Err:outrage of file lenght", File, Loc, "out of 0 ~", FileInfo.Size())
return 0
}
return returnVal
}
-func (this *file) NewPath(filename string) error{
+func (this *file) NewPath(filename string) error {
/*
如果filename路径不存在,就新建它
- */
- var exist func(string) bool = func (s string) bool {
+ */
+ var exist func(string) bool = func(s string) bool {
_, err := os.Stat(s)
return err == nil || os.IsExist(err)
}
- for i:=0;true;{
- a := strings.Index(filename[i:],"/")
- if a == -1 {break}
- if a == 0 {a = 1}//bug fix 当绝对路径时开头的/导致问题
- i=i+a+1
+ for i := 0; true; {
+ a := strings.Index(filename[i:], "/")
+ if a == -1 {
+ break
+ }
+ if a == 0 {
+ a = 1
+ } //bug fix 当绝对路径时开头的/导致问题
+ i = i + a + 1
if !exist(filename[:i-1]) {
err := os.Mkdir(filename[:i-1], os.ModePerm)
- if err != nil {return err}
+ if err != nil {
+ return err
+ }
}
}
-
+
if _, err := os.Stat(filename); os.IsNotExist(err) {
- fd,err:=os.Create(filename)
+ fd, err := os.Create(filename)
if err != nil {
return err
- }else{
+ } else {
fd.Close()
}
}
return nil
}
-func FileMove(src,trg string) error {
- return Ppart.FileMove(src,trg)
+func FileMove(src, trg string) error {
+ return Ppart.FileMove(src, trg)
}
// func main(){
-// var u File
+// var u File
// u.File="a.txt"
// u.Write=false
// u.Loc=0
package part
import (
- br "github.com/andybalholm/brotli"
- "bytes"
- "io"
- "io/ioutil"
+ "bytes"
+ "io"
+
+ br "github.com/andybalholm/brotli"
)
-func InBr(byteS []byte, level int) ([]byte,error) {
- buf := bytes.NewBuffer(nil)
- Write := br.NewWriterLevel(buf, level)
- defer Write.Close()
+func InBr(byteS []byte, level int) ([]byte, error) {
+ buf := bytes.NewBuffer(nil)
+ Write := br.NewWriterLevel(buf, level)
+ defer Write.Close()
- // 写入待压缩内容
- if _,err := Write.Write(byteS); err != nil {return buf.Bytes(),err}
- if err := Write.Flush(); err != nil {return buf.Bytes(),err}
- return buf.Bytes(),nil
+ // 写入待压缩内容
+ if _, err := Write.Write(byteS); err != nil {
+ return buf.Bytes(), err
+ }
+ if err := Write.Flush(); err != nil {
+ return buf.Bytes(), err
+ }
+ return buf.Bytes(), nil
}
-func UnBr(byteS []byte) ([]byte,error) {
- buf := bytes.NewBuffer(byteS)
- Read := br.NewReader(buf)
+func UnBr(byteS []byte) ([]byte, error) {
+ buf := bytes.NewBuffer(byteS)
+ Read := br.NewReader(buf)
- rb, err := ioutil.ReadAll(Read)
- if err == io.EOF || err == io.ErrUnexpectedEOF {
- return rb, nil
- }
- return rb, err
-}
\ No newline at end of file
+ rb, err := io.ReadAll(Read)
+ if err == io.EOF || err == io.ErrUnexpectedEOF {
+ return rb, nil
+ }
+ return rb, err
+}
package part
import (
+ _ "embed"
"testing"
)
+//go:embed data.txt
+var data []byte
+
func Test_Br(t *testing.T) {
- s := []byte(`abc`)
- t.Log(string(s))
+ b, e := InBr(data, 6)
+ if e != nil {
+ t.Error(e)
+ return
+ }
+ t.Log(len(data))
- b,e := InBr(s, 6)
- if e != nil {t.Error(e);return}
- t.Log(string(b))
+ c, e := UnBr(b)
+ if e != nil {
+ t.Error(e)
+ return
+ }
- c,e := UnBr(b)
- if e != nil {t.Error(e);return}
- t.Log(string(c))
-
- for k,v := range c {
- if v != []byte("abc")[k] {t.Error(`no match`)}
+ for k, v := range c {
+ if v != []byte("abc")[k] {
+ t.Error(`no match`)
+ }
}
}
package part
import (
- "compress/flate"
- "bytes"
- "io"
- "io/ioutil"
+ "bytes"
+ "compress/flate"
+ "io"
)
-func InFlate(byteS []byte, level int) ([]byte,error) {
- buf := bytes.NewBuffer(nil)
+func InFlate(byteS []byte, level int) ([]byte, error) {
+ buf := bytes.NewBuffer(nil)
- // 创建一个flate.Write
- flateWrite, err := flate.NewWriter(buf, level)
- if err != nil {
- return buf.Bytes(),err
- }
- defer flateWrite.Close()
- // 写入待压缩内容
- flateWrite.Write(byteS)
- flateWrite.Flush()
- return buf.Bytes(),nil
+ // 创建一个flate.Write
+ flateWrite, err := flate.NewWriter(buf, level)
+ if err != nil {
+ return buf.Bytes(), err
+ }
+ defer flateWrite.Close()
+ // 写入待压缩内容
+ flateWrite.Write(byteS)
+ flateWrite.Flush()
+ return buf.Bytes(), nil
}
-func UnFlate(byteS []byte) ([]byte,error) {
- flateRead := flate.NewReader(bytes.NewBuffer(byteS))
- rb, err := ioutil.ReadAll(flateRead)
- flateRead.Close()
- if err == io.EOF || err == io.ErrUnexpectedEOF {
- return append([]byte{},rb...), nil
- }
- return append([]byte{},rb...), err
-}
\ No newline at end of file
+func UnFlate(byteS []byte) ([]byte, error) {
+ flateRead := flate.NewReader(bytes.NewBuffer(byteS))
+ rb, err := io.ReadAll(flateRead)
+ flateRead.Close()
+ if err == io.EOF || err == io.ErrUnexpectedEOF {
+ return append([]byte{}, rb...), nil
+ }
+ return append([]byte{}, rb...), err
+}
package part
import (
- gzip "compress/gzip"
- "bytes"
- "io"
- "io/ioutil"
+ "bytes"
+ gzip "compress/gzip"
+ "io"
)
-func InGzip(byteS []byte, level int) ([]byte,error) {
- buf := bytes.NewBuffer(nil)
- Write,err := gzip.NewWriterLevel(buf, level)
- if err != nil {
- return buf.Bytes(),err
- }
- defer Write.Close()
- // 写入待压缩内容
- if _,err := Write.Write(byteS); err != nil {return buf.Bytes(),err}
- if err := Write.Flush(); err != nil {return buf.Bytes(),err}
- return buf.Bytes(),nil
+func InGzip(byteS []byte, level int) ([]byte, error) {
+ buf := bytes.NewBuffer(nil)
+ Write, err := gzip.NewWriterLevel(buf, level)
+ if err != nil {
+ return buf.Bytes(), err
+ }
+ defer Write.Close()
+ // 写入待压缩内容
+ if _, err := Write.Write(byteS); err != nil {
+ return buf.Bytes(), err
+ }
+ if err := Write.Flush(); err != nil {
+ return buf.Bytes(), err
+ }
+ return buf.Bytes(), nil
}
-func UnGzip(byteS []byte) ([]byte,error) {
- Read,err := gzip.NewReader(bytes.NewBuffer(byteS))
- if err != nil {
- return byteS,err
- }
- rb, err := ioutil.ReadAll(Read)
- Read.Close()
- if err == io.EOF || err == io.ErrUnexpectedEOF {
- return append([]byte{},rb...), nil
- }
- return append([]byte{},rb...), err
-}
\ No newline at end of file
+func UnGzip(byteS []byte) ([]byte, error) {
+ Read, err := gzip.NewReader(bytes.NewBuffer(byteS))
+ if err != nil {
+ return byteS, err
+ }
+ rb, err := io.ReadAll(Read)
+ Read.Close()
+ if err == io.EOF || err == io.ErrUnexpectedEOF {
+ return append([]byte{}, rb...), nil
+ }
+ return append([]byte{}, rb...), err
+}
package part
import (
- "os"
- "io/ioutil"
- "errors"
"crypto/rand"
- "crypto/sha256"
"crypto/rsa"
+ "crypto/sha256"
"crypto/x509"
"encoding/pem"
+ "errors"
+ "io"
+ "os"
)
type Crypto struct {
}
func FileLoad(path string) (data []byte, err error) {
- fileObject,e := os.OpenFile(path, os.O_RDONLY, 0644)
+ fileObject, e := os.OpenFile(path, os.O_RDONLY, 0644)
if e != nil {
err = e
return
}
defer fileObject.Close()
- data,e = ioutil.ReadAll(fileObject)
+ data, e = io.ReadAll(fileObject)
if e != nil {
err = e
return
return
}
-func (t *Crypto) PubLoad() (bool) {
+func (t *Crypto) PubLoad() bool {
return t.pubKey != nil
}
-func (t *Crypto) PriLoad() (bool) {
+func (t *Crypto) PriLoad() bool {
return t.priKey != nil
}
err = e
return
}
- t.pubKey,_ = pubI.(*rsa.PublicKey)
+ t.pubKey, _ = pubI.(*rsa.PublicKey)
return
}
func (t *Crypto) LoadPKIXPubKey(path string) (err error) {
- if d,e := FileLoad(path);e != nil {
+ if d, e := FileLoad(path); e != nil {
return e
} else {
err = t.GetPKIXPubKey(d)
}
func (t *Crypto) LoadPKCS1PriKey(path string) (err error) {
- if d,e := FileLoad(path);e != nil {
+ if d, e := FileLoad(path); e != nil {
return e
} else {
err = t.GetPKCS1PriKey(d)
return
}
return rsa.DecryptOAEP(sha256.New(), rand.Reader, t.priKey, sourceByte, []byte{})
-}
\ No newline at end of file
+}
module github.com/qydysky/part
-go 1.14
+go 1.19
require (
- github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d // indirect
github.com/andybalholm/brotli v1.0.4
- github.com/go-ole/go-ole v1.2.5 // indirect
github.com/gorilla/websocket v1.4.2
github.com/klauspost/compress v1.11.6
- github.com/klauspost/pgzip v1.2.5
github.com/miekg/dns v1.1.35
github.com/shirou/gopsutil v3.20.12+incompatible
github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966
- github.com/thedevsaddam/gojsonq v2.3.0+incompatible
github.com/thedevsaddam/gojsonq/v2 v2.5.2
- golang.org/x/text v0.3.8 // indirect
+ golang.org/x/text v0.3.8
+)
+
+require (
+ github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d // indirect
+ github.com/go-ole/go-ole v1.2.5 // indirect
+ github.com/stretchr/testify v1.8.1 // indirect
+ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550 // indirect
+ golang.org/x/net v0.0.0-20190923162816-aa69164e4478 // indirect
+ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f // indirect
)
//replace github.com/thedevsaddam/gojsonq v2.3.0+incompatible => github.com/thedevsaddam/gojsonq/v2 v2.5.2
github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d h1:G0m3OIz70MZUWq3EgK3CesDbo8upS2Vm9/P3FtgI+Jk=
github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
-github.com/andybalholm/brotli v1.0.1 h1:KqhlKozYbRtJvsPrrEeXcO+N2l6NYT5A2QAFmSULpEc=
-github.com/andybalholm/brotli v1.0.1/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y=
github.com/andybalholm/brotli v1.0.4 h1:V7DdXeJtZscaqfNuAdSRuRFzuiKlHSC/Zh3zl9qY3JY=
github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
-github.com/go-ole/go-ole v1.2.4 h1:nNBDSCOigTSiarFpYE9J/KtEA1IOW4CNeqT9TQDqCxI=
-github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/go-ole/go-ole v1.2.5 h1:t4MGB5xEDZvXI+0rMjjsfBsD7yAgp/s9ZDkL1JndXwY=
github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
-github.com/klauspost/compress v1.10.10 h1:a/y8CglcM7gLGYmlbP/stPE5sR3hbhFRUjCBfd/0B3I=
-github.com/klauspost/compress v1.10.10/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
github.com/klauspost/compress v1.11.6 h1:EgWPCW6O3n1D5n99Zq3xXBt9uCwRGvpwGOusOLNBRSQ=
github.com/klauspost/compress v1.11.6/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
-github.com/klauspost/pgzip v1.2.5 h1:qnWYvvKqedOF2ulHpMG72XQol4ILEJ8k2wwRl/Km8oE=
-github.com/klauspost/pgzip v1.2.5/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs=
-github.com/miekg/dns v1.1.31 h1:sJFOl9BgwbYAWOGEwr61FU28pqsBNdpRBnhGXtO06Oo=
-github.com/miekg/dns v1.1.31/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM=
github.com/miekg/dns v1.1.35 h1:oTfOaDH+mZkdcgdIjH6yBajRGtIwcwcaR+rt23ZSrJs=
github.com/miekg/dns v1.1.35/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM=
-github.com/shirou/gopsutil v2.20.6+incompatible h1:P37G9YH8M4vqkKcwBosp+URN5O8Tay67D2MbR361ioY=
-github.com/shirou/gopsutil v2.20.6+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
-github.com/shirou/gopsutil v2.20.7+incompatible h1:Ymv4OD12d6zm+2yONe39VSmp2XooJe8za7ngOLW/o/w=
-github.com/shirou/gopsutil v2.20.7+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/shirou/gopsutil v3.20.12+incompatible h1:6VEGkOXP/eP4o2Ilk8cSsX0PhOEfX6leqAnD+urrp9M=
github.com/shirou/gopsutil v3.20.12+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 h1:JIAuq3EEf9cgbU6AtGPK4CTG3Zf6CKMNqf0MHTggAUA=
github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966/go.mod h1:sUM3LWHvSMaG192sy56D9F7CNvL7jUJVXoqM1QKLnog=
-github.com/thedevsaddam/gojsonq v1.9.1 h1:zQulEP43nwmq5EKrNWyIgJVbqDeMdC1qzXM/f5O15a0=
-github.com/thedevsaddam/gojsonq v2.3.0+incompatible h1:i2lFTvGY4LvoZ2VUzedsFlRiyaWcJm3Uh6cQ9+HyQA8=
-github.com/thedevsaddam/gojsonq v2.3.0+incompatible/go.mod h1:RBcQaITThgJAAYKH7FNp2onYodRz8URfsuEGpAch0NA=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
+github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
+github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
+github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
+github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/thedevsaddam/gojsonq/v2 v2.5.2 h1:CoMVaYyKFsVj6TjU6APqAhAvC07hTI6IQen8PHzHYY0=
github.com/thedevsaddam/gojsonq/v2 v2.5.2/go.mod h1:bv6Xa7kWy82uT0LnXPE2SzGqTj33TAEeR560MdJkiXs=
-github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550 h1:ObdrDkeb4kJdCP557AjRjq69pTHfNouLtWZG7j9rPN8=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de h1:ikNHVSjEfnvz6sxdSPCaPt572qowuyMDMJLLm3Db3ig=
-golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad h1:DN0cp81fZ3njFcrLCytUHRSUkqBjfTo4Tx9RJTWs0EY=
-golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
-golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 h1:7I4JAnoQBe7ZtJcBaYHi5UtiO8tQHbUSXxL+pnGRANg=
-golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
-golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190923162816-aa69164e4478 h1:l5EDrHhldLYb3ZRHDUhXF7Om7MvYXnkV9/iQNo1lX6g=
golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200707034311-ab3426394381 h1:VXak5I6aEWmAXeQjA+QSZzlgNrpq9mjcfDemuexIKsU=
-golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
-golang.org/x/net v0.0.0-20201224014010-6772e930b67b h1:iFwSg7t5GZmB/Q5TjiEAsdoLDrdJRC1RiF2WhuV29Qw=
-golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
-golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
-golang.org/x/net v0.0.0-20220722155237-a158d28d115b h1:PxfKdU9lEEDYjdIzOtC4qFWgkU2rGHdKlKowJSMN9h0=
-golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1 h1:sIky/MyNRSHTrdxfsiUSS4WIAMvInbeXljJz+jDjeYE=
-golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200808120158-1030fc2bf1d9 h1:yi1hN8dcqI9l8klZfy4B8mJvFmmAxJEePIQQFNSd7Cs=
-golang.org/x/sys v0.0.0-20200808120158-1030fc2bf1d9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200810151505-1b9f1253b3ed h1:WBkVNH1zd9jg/dK4HCM4lNANnmd12EHC9z+LmcCG4ns=
-golang.org/x/sys v0.0.0-20200810151505-1b9f1253b3ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210113000019-eaf3bda374d2 h1:F9vNgpIiamoF+Q1/c78bikg/NScXEtbZSNEpnRelOzs=
-golang.org/x/sys v0.0.0-20210113000019-eaf3bda374d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f h1:v4INt8xihDGvnrfjMDVXGxw9wrfxYyCjk0KbXjhR55s=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
-golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
-golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
-golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.3.8 h1:nAL+RVCQ9uMn3vJZbV+MRnydTJFPf8qqY42YiA6MrqY=
golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
-golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
-golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
"context"
"errors"
"io"
- "io/ioutil"
"net"
"net/http"
"net/url"
"sync"
"time"
- compress "github.com/qydysky/part/compress"
+ flate "compress/flate"
+ gzip "compress/gzip"
+
+ br "github.com/andybalholm/brotli"
signal "github.com/qydysky/part/signal"
s "github.com/qydysky/part/strings"
// "encoding/binary"
}
t.Response = resp
- defer resp.Body.Close()
defer func() {
t.UsedTime = time.Since(beginTime)
}()
err = errors.New(strconv.Itoa(resp.StatusCode))
}
- if compress_type := resp.Header[`Content-Encoding`]; len(compress_type) != 0 && (compress_type[0] == `br` ||
- compress_type[0] == `gzip` ||
- compress_type[0] == `deflate`) {
-
- if val.NoResponse {
- return errors.New("respose had compress, must load all data, but NoResponse is true")
- }
-
- var err error
- t.Respon, err = ioutil.ReadAll(resp.Body)
+ var ws []io.Writer
+ if val.SaveToPath != "" {
+ out, err := os.Create(val.SaveToPath)
if err != nil {
+ out.Close()
return err
}
+ defer out.Close()
+ ws = append(ws, out)
+ }
+ if val.SaveToPipeWriter != nil {
+ defer val.SaveToPipeWriter.Close()
+ ws = append(ws, val.SaveToPipeWriter)
+ }
+ // if val.SaveToChan != nil {
+ // r, w := io.Pipe()
+ // go func() {
+ // buf := make([]byte, 1<<16)
+ // for {
+ // n, e := r.Read(buf)
+ // if n != 0 {
+ // val.SaveToChan <- buf[:n]
+ // } else if e != nil {
+ // defer close(val.SaveToChan)
+ // break
+ // }
+ // }
+ // }()
+ // defer w.Close()
+ // ws = append(ws, w)
+ // }
+ if !val.NoResponse {
+ var buf bytes.Buffer
+ defer func() {
+ t.Respon = buf.Bytes()
+ }()
+ ws = append(ws, &buf)
+ }
- if compress_type := resp.Header[`Content-Encoding`]; len(compress_type) != 0 {
- switch compress_type[0] {
- case `br`:
- if tmp, err := compress.UnBr(t.Respon); err != nil {
- return err
- } else {
- t.Respon = append([]byte{}, tmp...)
- }
- case `gzip`:
- if tmp, err := compress.UnGzip(t.Respon); err != nil {
- return err
- } else {
- t.Respon = append([]byte{}, tmp...)
- }
- case `deflate`:
- if tmp, err := compress.UnFlate(t.Respon); err != nil {
- return err
- } else {
- t.Respon = append([]byte{}, tmp...)
- }
- default:
- }
- }
- } else {
- var ws []io.Writer
- if val.SaveToPath != "" {
- out, err := os.Create(val.SaveToPath)
- if err != nil {
- out.Close()
- return err
- }
- defer out.Close()
- ws = append(ws, out)
- }
- if val.SaveToPipeWriter != nil {
- defer val.SaveToPipeWriter.Close()
- ws = append(ws, val.SaveToPipeWriter)
- }
- // if val.SaveToChan != nil {
- // r, w := io.Pipe()
- // go func() {
- // buf := make([]byte, 1<<16)
- // for {
- // n, e := r.Read(buf)
- // if n != 0 {
- // val.SaveToChan <- buf[:n]
- // } else if e != nil {
- // defer close(val.SaveToChan)
- // break
- // }
- // }
- // }()
- // defer w.Close()
- // ws = append(ws, w)
- // }
- if !val.NoResponse {
- var buf bytes.Buffer
- defer func() {
- t.Respon = buf.Bytes()
- }()
- ws = append(ws, &buf)
+ w := io.MultiWriter(ws...)
+ s := signal.Init()
+
+ var resReader io.Reader
+ if compress_type := resp.Header[`Content-Encoding`]; len(compress_type) != 0 {
+ switch compress_type[0] {
+ case `br`:
+ resReader = br.NewReader(resp.Body)
+ case `gzip`:
+ resReader, _ = gzip.NewReader(resp.Body)
+ case `deflate`:
+ resReader = flate.NewReader(resp.Body)
+ default:
+ resReader = resp.Body
}
+ defer resp.Body.Close()
+ }
- w := io.MultiWriter(ws...)
- s := signal.Init()
- go func() {
- buf := make([]byte, 1<<16)
- for {
- if n, e := resp.Body.Read(buf); n != 0 {
- w.Write(buf[:n])
- } else if e != nil {
- if !errors.Is(e, io.EOF) {
- err = e
- }
- break
+ go func() {
+ buf := make([]byte, 1<<16)
+ for {
+ if n, e := resReader.Read(buf); n != 0 {
+ w.Write(buf[:n])
+ } else if e != nil {
+ if !errors.Is(e, io.EOF) {
+ err = e
}
+ break
+ }
- if !t.cancel.Islive() {
- err = context.Canceled
- break
- }
+ if !t.cancel.Islive() {
+ err = context.Canceled
+ break
}
- s.Done()
- }()
- s.Wait()
- // if _, e := io.Copy(w, resp.Body); e != nil {
- // err = e
- // }
- }
+ }
+ s.Done()
+ }()
+ s.Wait()
+ // if _, e := io.Copy(w, resp.Body); e != nil {
+ // err = e
+ // }
return
}
package part
import (
+ "bytes"
+ "context"
"io"
+ "net/http"
"testing"
"time"
+
+ web "github.com/qydysky/part/Web"
+ compress "github.com/qydysky/part/compress"
)
func Test_Timeout(t *testing.T) {
t.Log(`no error`)
<-c
}
+
+func Test_compress(t *testing.T) {
+ addr := "127.0.0.1:10001"
+ s := web.New(&http.Server{
+ Addr: addr,
+ WriteTimeout: time.Second * time.Duration(10),
+ })
+ s.Handle(map[string]func(http.ResponseWriter, *http.Request){
+ `/br`: func(w http.ResponseWriter, _ *http.Request) {
+ d, _ := compress.InBr([]byte("abc强强强强"), 6)
+ w.Header().Set("Content-Encoding", "br")
+ w.Write(d)
+ },
+ `/flate`: func(w http.ResponseWriter, _ *http.Request) {
+ d, _ := compress.InFlate([]byte("abc强强强强"), -1)
+ w.Header().Set("Content-Encoding", "deflate")
+ w.Write(d)
+ },
+ `/gzip`: func(w http.ResponseWriter, _ *http.Request) {
+ d, _ := compress.InGzip([]byte("abc强强强强"), -1)
+ w.Header().Set("Content-Encoding", "gzip")
+ w.Write(d)
+ },
+ `/exit`: func(_ http.ResponseWriter, _ *http.Request) {
+ s.Server.Shutdown(context.Background())
+ },
+ })
+
+ r := New()
+ r.Reqf(Rval{
+ Url: "http://" + addr + "/br",
+ })
+ if !bytes.Equal(r.Respon, []byte("abc强强强强")) {
+ t.Error("br fail")
+ }
+ r.Reqf(Rval{
+ Url: "http://" + addr + "/gzip",
+ })
+ if !bytes.Equal(r.Respon, []byte("abc强强强强")) {
+ t.Error("gzip fail")
+ }
+ r.Reqf(Rval{
+ Url: "http://" + addr + "/flate",
+ })
+ if !bytes.Equal(r.Respon, []byte("abc强强强强")) {
+ t.Error("flate fail")
+ }
+
+ {
+ rc, wc := io.Pipe()
+ c := make(chan struct{})
+ go func() {
+ d, _ := io.ReadAll(rc)
+ if !bytes.Equal(d, []byte("abc强强强强")) {
+ t.Error("br fail")
+ }
+ close(c)
+ }()
+ r.Reqf(Rval{
+ Url: "http://" + addr + "/br",
+ SaveToPipeWriter: wc,
+ })
+ <-c
+ }
+ {
+ rc, wc := io.Pipe()
+ c := make(chan struct{})
+ go func() {
+ d, _ := io.ReadAll(rc)
+ if !bytes.Equal(d, []byte("abc强强强强")) {
+ t.Error("gzip fail")
+ }
+ close(c)
+ }()
+ r.Reqf(Rval{
+ Url: "http://" + addr + "/gzip",
+ SaveToPipeWriter: wc,
+ })
+ <-c
+ }
+ {
+ rc, wc := io.Pipe()
+ c := make(chan struct{})
+ go func() {
+ d, _ := io.ReadAll(rc)
+ if !bytes.Equal(d, []byte("abc强强强强")) {
+ t.Error("flate fail")
+ }
+ close(c)
+ }()
+ r.Reqf(Rval{
+ Url: "http://" + addr + "/flate",
+ SaveToPipeWriter: wc,
+ })
+ <-c
+ }
+}
"testing"
)
+type tmp struct {
+ p int
+}
+
func Test_customMap(t *testing.T) {
var c Map
//set
- c.Store(0, 3)
- if v, ok := c.Load(0); ok && v != 3 {
+ var p1 = new(tmp)
+ p1.p = 0
+ c.Store(0, p1)
+ if v, ok := c.Load(0); !ok || v == nil || v.(*tmp).p != 0 {
t.Error(`1`)
}
//change
import (
"errors"
"fmt"
- "io/ioutil"
"net"
"os"
"path/filepath"
defer t.Unlock()
t.Lock()
- dir, err := ioutil.TempDir(pdir, "")
+ dir, err := os.MkdirTemp(pdir, "")
if err != nil {
fmt.Println(err.Error())
return ""
defer t.Unlock()
t.Lock()
- tmpfile, err := ioutil.TempFile(pdir, "*.tmp")
+ tmpfile, err := os.MkdirTemp(pdir, "*.tmp")
if err != nil {
fmt.Println(err.Error())
return ""
}
- name := tmpfile.Name()
- tmpfile.Close()
+ name := tmpfile
return name
}