1
0
mirror of https://github.com/Mrs4s/MiraiGo.git synced 2025-05-04 11:07:40 +08:00

client: seek start 0 before upload

This commit is contained in:
wdvxdr 2022-03-28 15:27:59 +08:00
parent 4f05838b6c
commit e2a42e5425
No known key found for this signature in database
GPG Key ID: 703F8C071DE7A1B6
3 changed files with 37 additions and 38 deletions

View File

@ -36,13 +36,13 @@ func (bdh *Transaction) encrypt(key []byte) error {
return nil return nil
} }
func (s *Session) UploadBDH(input Transaction) ([]byte, error) { func (s *Session) UploadBDH(trans Transaction) ([]byte, error) {
if len(s.SsoAddr) == 0 { if len(s.SsoAddr) == 0 {
return nil, errors.New("srv addrs not found. maybe miss some packet?") return nil, errors.New("srv addrs not found. maybe miss some packet?")
} }
addr := s.SsoAddr[0].String() addr := s.SsoAddr[0].String()
if err := input.encrypt(s.SessionKey); err != nil { if err := trans.encrypt(s.SessionKey); err != nil {
return nil, err return nil, err
} }
conn, err := net.DialTimeout("tcp", addr, time.Second*20) conn, err := net.DialTimeout("tcp", addr, time.Second*20)
@ -59,14 +59,15 @@ func (s *Session) UploadBDH(input Transaction) ([]byte, error) {
const chunkSize = 256 * 1024 const chunkSize = 256 * 1024
var rspExt, chunk []byte var rspExt, chunk []byte
offset := 0 offset := 0
if input.Size > chunkSize { if trans.Size > chunkSize {
chunk = make([]byte, chunkSize) chunk = make([]byte, chunkSize)
} else { } else {
chunk = make([]byte, input.Size) chunk = make([]byte, trans.Size)
} }
for { for {
rl, err := io.ReadFull(input.Body, chunk) chunk = chunk[:cap(chunk)]
if errors.Is(err, io.EOF) { rl, err := io.ReadFull(trans.Body, chunk)
if rl == 0 {
break break
} }
if errors.Is(err, io.ErrUnexpectedEOF) { if errors.Is(err, io.ErrUnexpectedEOF) {
@ -74,16 +75,16 @@ func (s *Session) UploadBDH(input Transaction) ([]byte, error) {
} }
ch := md5.Sum(chunk) ch := md5.Sum(chunk)
head, _ := proto.Marshal(&pb.ReqDataHighwayHead{ head, _ := proto.Marshal(&pb.ReqDataHighwayHead{
MsgBasehead: s.dataHighwayHead(_REQ_CMD_DATA, 4096, input.CommandID, 2052), MsgBasehead: s.dataHighwayHead(_REQ_CMD_DATA, 4096, trans.CommandID, 2052),
MsgSeghead: &pb.SegHead{ MsgSeghead: &pb.SegHead{
Filesize: input.Size, Filesize: trans.Size,
Dataoffset: int64(offset), Dataoffset: int64(offset),
Datalength: int32(rl), Datalength: int32(rl),
Serviceticket: input.Ticket, Serviceticket: trans.Ticket,
Md5: ch[:], Md5: ch[:],
FileMd5: input.Sum, FileMd5: trans.Sum,
}, },
ReqExtendinfo: input.Ext, ReqExtendinfo: trans.Ext,
}) })
offset += rl offset += rl
frame := newFrame(head, chunk) frame := newFrame(head, chunk)
@ -102,17 +103,17 @@ func (s *Session) UploadBDH(input Transaction) ([]byte, error) {
rspExt = rspHead.RspExtendinfo rspExt = rspHead.RspExtendinfo
} }
if rspHead.MsgSeghead != nil && rspHead.MsgSeghead.Serviceticket != nil { if rspHead.MsgSeghead != nil && rspHead.MsgSeghead.Serviceticket != nil {
input.Ticket = rspHead.MsgSeghead.Serviceticket trans.Ticket = rspHead.MsgSeghead.Serviceticket
} }
} }
return rspExt, nil return rspExt, nil
} }
func (s *Session) UploadBDHMultiThread(input Transaction, threadCount int) ([]byte, error) { func (s *Session) UploadBDHMultiThread(trans Transaction, threadCount int) ([]byte, error) {
// for small file and small thread count, // for small file and small thread count,
// use UploadBDH instead of UploadBDHMultiThread // use UploadBDH instead of UploadBDHMultiThread
if input.Size < 1024*1024*3 || threadCount < 2 { if trans.Size < 1024*1024*3 || threadCount < 2 {
return s.UploadBDH(input) return s.UploadBDH(trans)
} }
if len(s.SsoAddr) == 0 { if len(s.SsoAddr) == 0 {
@ -120,7 +121,7 @@ func (s *Session) UploadBDHMultiThread(input Transaction, threadCount int) ([]by
} }
addr := s.SsoAddr[0].String() addr := s.SsoAddr[0].String()
if err := input.encrypt(s.SessionKey); err != nil { if err := trans.encrypt(s.SessionKey); err != nil {
return nil, err return nil, err
} }
@ -130,7 +131,7 @@ func (s *Session) UploadBDHMultiThread(input Transaction, threadCount int) ([]by
completedThread uint32 completedThread uint32
cond = sync.NewCond(&sync.Mutex{}) cond = sync.NewCond(&sync.Mutex{})
offset = int64(0) offset = int64(0)
count = (input.Size + blockSize - 1) / blockSize count = (trans.Size + blockSize - 1) / blockSize
id = 0 id = 0
) )
doUpload := func() error { doUpload := func() error {
@ -165,31 +166,27 @@ func (s *Session) UploadBDHMultiThread(input Transaction, threadCount int) ([]by
break break
} }
chunk = chunk[:blockSize] chunk = chunk[:blockSize]
n, err := io.ReadFull(input.Body, chunk) n, err := io.ReadFull(trans.Body, chunk)
cond.L.Unlock() cond.L.Unlock()
if err != nil { if n == 0 {
if err == io.EOF { break
break }
} if errors.Is(err, io.ErrUnexpectedEOF) {
if err == io.ErrUnexpectedEOF { chunk = chunk[:n]
chunk = chunk[:n]
} else {
return err
}
} }
ch := md5.Sum(chunk) ch := md5.Sum(chunk)
head, _ := proto.Marshal(&pb.ReqDataHighwayHead{ head, _ := proto.Marshal(&pb.ReqDataHighwayHead{
MsgBasehead: s.dataHighwayHead(_REQ_CMD_DATA, 4096, input.CommandID, 2052), MsgBasehead: s.dataHighwayHead(_REQ_CMD_DATA, 4096, trans.CommandID, 2052),
MsgSeghead: &pb.SegHead{ MsgSeghead: &pb.SegHead{
Filesize: input.Size, Filesize: trans.Size,
Dataoffset: off, Dataoffset: off,
Datalength: int32(n), Datalength: int32(n),
Serviceticket: input.Ticket, Serviceticket: trans.Ticket,
Md5: ch[:], Md5: ch[:],
FileMd5: input.Sum, FileMd5: trans.Sum,
}, },
ReqExtendinfo: input.Ext, ReqExtendinfo: trans.Ext,
}) })
frame := newFrame(head, chunk) frame := newFrame(head, chunk)
_, err = frame.WriteTo(conn) _, err = frame.WriteTo(conn)

View File

@ -47,7 +47,7 @@ func (s *Session) AppendAddr(ip, port uint32) {
s.SsoAddr = append(s.SsoAddr, addr) s.SsoAddr = append(s.SsoAddr, addr)
} }
func (s *Session) Upload(addr Addr, input Transaction) error { func (s *Session) Upload(addr Addr, trans Transaction) error {
conn, err := net.DialTimeout("tcp", addr.String(), time.Second*3) conn, err := net.DialTimeout("tcp", addr.String(), time.Second*3)
if err != nil { if err != nil {
return errors.Wrap(err, "connect error") return errors.Wrap(err, "connect error")
@ -60,7 +60,7 @@ func (s *Session) Upload(addr Addr, input Transaction) error {
reader := binary.NewNetworkReader(conn) reader := binary.NewNetworkReader(conn)
for { for {
chunk = chunk[:chunkSize] chunk = chunk[:chunkSize]
rl, err := io.ReadFull(input.Body, chunk) rl, err := io.ReadFull(trans.Body, chunk)
if errors.Is(err, io.EOF) { if errors.Is(err, io.EOF) {
break break
} }
@ -69,14 +69,14 @@ func (s *Session) Upload(addr Addr, input Transaction) error {
} }
ch := md5.Sum(chunk) ch := md5.Sum(chunk)
head, _ := proto.Marshal(&pb.ReqDataHighwayHead{ head, _ := proto.Marshal(&pb.ReqDataHighwayHead{
MsgBasehead: s.dataHighwayHead(_REQ_CMD_DATA, 4096, input.CommandID, 2052), MsgBasehead: s.dataHighwayHead(_REQ_CMD_DATA, 4096, trans.CommandID, 2052),
MsgSeghead: &pb.SegHead{ MsgSeghead: &pb.SegHead{
Filesize: input.Size, Filesize: trans.Size,
Dataoffset: int64(offset), Dataoffset: int64(offset),
Datalength: int32(rl), Datalength: int32(rl),
Serviceticket: input.Ticket, Serviceticket: trans.Ticket,
Md5: ch[:], Md5: ch[:],
FileMd5: input.Sum, FileMd5: trans.Sum,
}, },
ReqExtendinfo: []byte{}, ReqExtendinfo: []byte{},
}) })

View File

@ -156,6 +156,8 @@ func (c *QQClient) UploadShortVideo(target message.Source, video, thumb io.ReadS
cmd = 89 cmd = 89
} }
ext, _ := proto.Marshal(c.buildPttShortVideoProto(target, videoSum, thumbSum, videoLen, thumbLen).PttShortVideoUploadReq) ext, _ := proto.Marshal(c.buildPttShortVideoProto(target, videoSum, thumbSum, videoLen, thumbLen).PttShortVideoUploadReq)
_, _ = thumb.Seek(0, io.SeekStart)
_, _ = video.Seek(0, io.SeekStart)
combined := io.MultiReader(thumb, video) combined := io.MultiReader(thumb, video)
input := highway.Transaction{ input := highway.Transaction{
CommandID: cmd, CommandID: cmd,