diff --git a/client/internal/highway/bdh.go b/client/internal/highway/bdh.go index bfb70c61..3b1e8fc6 100644 --- a/client/internal/highway/bdh.go +++ b/client/internal/highway/bdh.go @@ -12,7 +12,6 @@ import ( "golang.org/x/sync/errgroup" "github.com/Mrs4s/MiraiGo/binary" - "github.com/Mrs4s/MiraiGo/client/internal/network" "github.com/Mrs4s/MiraiGo/client/pb" "github.com/Mrs4s/MiraiGo/internal/proto" ) @@ -72,7 +71,7 @@ func (s *Session) UploadBDH(input BdhInput) ([]byte, error) { } ch := md5.Sum(chunk) head, _ := proto.Marshal(&pb.ReqDataHighwayHead{ - MsgBasehead: s.dataHighwayHead(4096, input.CommandID, 2052), + MsgBasehead: s.dataHighwayHead(_REQ_CMD_DATA, 4096, input.CommandID, 2052), MsgSeghead: &pb.SegHead{ Filesize: input.Size, Dataoffset: int64(offset), @@ -84,7 +83,7 @@ func (s *Session) UploadBDH(input BdhInput) ([]byte, error) { ReqExtendinfo: input.Ext, }) offset += rl - frame := network.HeadBodyFrame(head, chunk) + frame := newFrame(head, chunk) _, err = frame.WriteTo(conn) if err != nil { return nil, errors.Wrap(err, "write conn error") @@ -178,7 +177,7 @@ func (s *Session) UploadBDHMultiThread(input BdhInput, threadCount int) ([]byte, } ch := md5.Sum(chunk) head, _ := proto.Marshal(&pb.ReqDataHighwayHead{ - MsgBasehead: s.dataHighwayHead(4096, input.CommandID, 2052), + MsgBasehead: s.dataHighwayHead(_REQ_CMD_DATA, 4096, input.CommandID, 2052), MsgSeghead: &pb.SegHead{ Filesize: input.Size, Dataoffset: off, @@ -189,7 +188,7 @@ func (s *Session) UploadBDHMultiThread(input BdhInput, threadCount int) ([]byte, }, ReqExtendinfo: input.Ext, }) - frame := network.HeadBodyFrame(head, chunk) + frame := newFrame(head, chunk) _, err = frame.WriteTo(conn) if err != nil { return errors.Wrap(err, "write conn error") diff --git a/client/internal/network/frame.go b/client/internal/highway/frame.go similarity index 80% rename from client/internal/network/frame.go rename to client/internal/highway/frame.go index 2b1b8f08..ba1b6b38 100644 --- a/client/internal/network/frame.go +++ b/client/internal/highway/frame.go @@ -1,4 +1,4 @@ -package network +package highway import ( "encoding/binary" @@ -7,15 +7,15 @@ import ( var etx = []byte{0x29} -// HeadBodyFrame 包格式 -// * STX +// newFrame 包格式 +// * STX: 0x28(40) // * head length // * body length // * head data // * body data -// * ETX +// * ETX: 0x29(41) // 节省内存, 可被go runtime优化为writev操作 -func HeadBodyFrame(head []byte, body []byte) net.Buffers { +func newFrame(head []byte, body []byte) net.Buffers { buffers := make(net.Buffers, 4) // buffer0 format: // * STX diff --git a/client/internal/highway/highway.go b/client/internal/highway/highway.go index d031bc6d..83023c8f 100644 --- a/client/internal/highway/highway.go +++ b/client/internal/highway/highway.go @@ -12,12 +12,17 @@ import ( "github.com/pkg/errors" "github.com/Mrs4s/MiraiGo/binary" - "github.com/Mrs4s/MiraiGo/client/internal/network" "github.com/Mrs4s/MiraiGo/client/pb" "github.com/Mrs4s/MiraiGo/internal/proto" "github.com/Mrs4s/MiraiGo/utils" ) +// see com/tencent/mobileqq/highway/utils/BaseConstants.java#L120-L121 +const ( + _REQ_CMD_DATA = "PicUp.DataUp" + _REQ_CMD_HEART_BREAK = "PicUp.Echo" +) + type Session struct { Uin string AppID int32 @@ -74,7 +79,7 @@ func (s *Session) Upload(addr Addr, input Input) error { } ch := md5.Sum(chunk) head, _ := proto.Marshal(&pb.ReqDataHighwayHead{ - MsgBasehead: s.dataHighwayHead(4096, input.CommandID, 2052), + MsgBasehead: s.dataHighwayHead(_REQ_CMD_DATA, 4096, input.CommandID, 2052), MsgSeghead: &pb.SegHead{ Filesize: length, Dataoffset: int64(offset), @@ -86,7 +91,7 @@ func (s *Session) Upload(addr Addr, input Input) error { ReqExtendinfo: []byte{}, }) offset += rl - frame := network.HeadBodyFrame(head, chunk) + frame := newFrame(head, chunk) _, err = frame.WriteTo(conn) if err != nil { return errors.Wrap(err, "write conn error") @@ -134,7 +139,7 @@ func (s *Session) UploadExciting(input ExcitingInput) ([]byte, error) { } ch := md5.Sum(chunk) head, _ := proto.Marshal(&pb.ReqDataHighwayHead{ - MsgBasehead: s.dataHighwayHead(0, input.CommandID, 0), + MsgBasehead: s.dataHighwayHead(_REQ_CMD_DATA, 0, input.CommandID, 0), MsgSeghead: &pb.SegHead{ Filesize: fileLength, Dataoffset: offset, @@ -146,7 +151,7 @@ func (s *Session) UploadExciting(input ExcitingInput) ([]byte, error) { ReqExtendinfo: input.Ext, }) offset += int64(rl) - frame := network.HeadBodyFrame(head, chunk) + frame := newFrame(head, chunk) req, _ := http.NewRequest("POST", url, &frame) req.Header.Set("Accept", "*/*") req.Header.Set("Connection", "Keep-Alive") @@ -182,33 +187,24 @@ func (s *Session) nextSeq() int32 { return atomic.AddInt32(&s.seq, 2) } -func (s *Session) dataHighwayHead(flag, cmd, locale int32) *pb.DataHighwayHead { +func (s *Session) dataHighwayHead(cmd string, flag, cmdID, locale int32) *pb.DataHighwayHead { return &pb.DataHighwayHead{ Version: 1, Uin: s.Uin, - Command: "PicUp.DataUp", + Command: cmd, Seq: s.nextSeq(), Appid: s.AppID, Dataflag: flag, - CommandId: cmd, + CommandId: cmdID, LocaleId: locale, } } func (s *Session) sendHeartbreak(conn net.Conn) error { head, _ := proto.Marshal(&pb.ReqDataHighwayHead{ - MsgBasehead: &pb.DataHighwayHead{ - Version: 1, - Uin: s.Uin, - Command: "PicUp.Echo", - Seq: s.nextSeq(), - Appid: s.AppID, - Dataflag: 4096, - CommandId: 0, - LocaleId: 2052, - }, + MsgBasehead: s.dataHighwayHead(_REQ_CMD_HEART_BREAK, 4096, 0, 2052), }) - frame := network.HeadBodyFrame(head, nil) + frame := newFrame(head, nil) _, err := frame.WriteTo(conn) return err }