支持run

This commit is contained in:
2025-04-15 18:58:56 +08:00
parent 8da742fea1
commit a0bf198879
9 changed files with 403 additions and 66 deletions

View File

@@ -2,6 +2,7 @@ package saashttp
import (
"bytes"
"compress/gzip"
"crypto/md5"
"encoding/hex"
"encoding/json"
@@ -9,6 +10,7 @@ import (
"io"
"net/http"
"net/url"
"os"
"strconv"
"time"
@@ -70,7 +72,12 @@ func (c *SaasClient) TaskRun(saasReq *saasapi.SaasReq) (saasRes *saasapi.SaasRes
return c.post(postUrl, saasReq)
}
func (c *SaasClient) makeUrl(baseUrl, path string) string {
func (c *SaasClient) TaskUpload(sha256 string, file *os.File, offset int64, size int) (saasRes *saasapi.SaasRes, err error) {
postUrl := c.makeUrl(c.ApiUrls.BaseUrl, c.ApiUrls.TaskUploadPath, "sha256", sha256)
return c.upload(postUrl, file, offset, size)
}
func (c *SaasClient) makeUrl(baseUrl, path string, params ...string) string {
url, err := url.Parse(baseUrl)
if err != nil {
panic(err)
@@ -86,6 +93,10 @@ func (c *SaasClient) makeUrl(baseUrl, path string) string {
default:
queryValues.Add("resmode", "protobuf")
}
for i := 0; i < len(params); i += 2 {
queryValues.Add(params[i], params[i+1])
}
url.RawQuery = queryValues.Encode()
return url.String()
@@ -143,3 +154,81 @@ func (c *SaasClient) post(url string, saasReq *saasapi.SaasReq) (saasRes *saasap
return saasRes, nil
}
func (c *SaasClient) upload(url string, file *os.File, offset int64, size int) (saasRes *saasapi.SaasRes, err error) {
if file == nil {
return nil, fmt.Errorf("file is nil")
}
if size <= 0 {
return nil, fmt.Errorf("size is invalid")
}
buf := make([]byte, size)
n, err := file.ReadAt(buf, offset)
if err != nil {
fmt.Println("read file error", err)
return nil, err
}
if n != size {
return nil, fmt.Errorf("read file error")
}
var gzBuf bytes.Buffer
gz := gzip.NewWriter(&gzBuf)
if _, err := gz.Write(buf); err != nil {
fmt.Println("gzip write error", err)
return nil, err
}
if err = gz.Close(); err != nil {
return nil, err
}
req, err := http.NewRequest("POST", url, bytes.NewBuffer(gzBuf.Bytes()))
if err != nil {
fmt.Println("http new request error", err)
return nil, err
}
timeStamp := strconv.FormatInt(time.Now().Unix(), 10)
md5byte := md5.Sum([]byte(c.Auth.Account + c.Auth.Token + timeStamp))
authorization := hex.EncodeToString(md5byte[:])
req.Header.Add("Account", c.Auth.Account)
req.Header.Add("Time", timeStamp)
req.Header.Add("Authorization", authorization)
req.Header.Add("Content-Type", "application/octet-stream")
req.Header.Add("Content-Encoding", "gzip")
res, err := c.Client.Do(req)
if err != nil {
fmt.Println("http send error", err)
return nil, err
}
defer res.Body.Close()
resBody, err := io.ReadAll(res.Body)
if err != nil {
fmt.Println("http read body error", err)
return nil, err
}
saasRes = &saasapi.SaasRes{}
if c.ResponseEncoder == RESPONSE_ENCODER_PROTOBUF {
err = proto.Unmarshal(resBody, saasRes)
if err != nil {
fmt.Println("unmarshal response body to protobuf error", err)
return nil, err
}
} else {
err = json.Unmarshal(resBody, saasRes)
if err != nil {
fmt.Println("unmarshal response body to json error", err)
return nil, err
}
}
return saasRes, nil
}