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:
parent
4f05838b6c
commit
e2a42e5425
@ -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)
|
||||||
|
@ -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{},
|
||||||
})
|
})
|
||||||
|
@ -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,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user