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

perf: add 0 alloc func OpenWriterF

This commit is contained in:
fumiama 2021-11-23 16:21:06 +08:00
parent 26579583cc
commit a70e0f20de
4 changed files with 92 additions and 18 deletions

View File

@ -19,6 +19,14 @@ func NewWriterF(f func(writer *Writer)) []byte {
return b return b
} }
// OpenWriterF must call func close
func OpenWriterF(f func(writer *Writer)) (b []byte, close func()) {
w := SelectWriter()
w.WriteByte(0)
f(w)
return w.Bytes(), func() { PutWriter(w) }
}
func (w *Writer) Write(b []byte) { func (w *Writer) Write(b []byte) {
(*bytes.Buffer)(w).Write(b) (*bytes.Buffer)(w).Write(b)
} }
@ -73,9 +81,10 @@ func (w *Writer) EncryptAndWrite(key []byte, data []byte) {
} }
func (w *Writer) WriteIntLvPacket(offset int, f func(writer *Writer)) { func (w *Writer) WriteIntLvPacket(offset int, f func(writer *Writer)) {
data := NewWriterF(f) data, close := OpenWriterF(f)
w.WriteUInt32(uint32(len(data) + offset)) w.WriteUInt32(uint32(len(data) + offset))
w.Write(data) w.Write(data)
close()
} }
func (w *Writer) WriteUniPacket(commandName string, sessionId, extraData, body []byte) { func (w *Writer) WriteUniPacket(commandName string, sessionId, extraData, body []byte) {

View File

@ -49,3 +49,51 @@ func BenchmarkNewWriterF128_5(b *testing.B) {
} }
}) })
} }
func BenchmarkOpenWriterF128(b *testing.B) {
test := make([]byte, 128)
rand.Read(test)
b.StartTimer()
b.RunParallel(func(pb *testing.PB) {
for pb.Next() {
_, close := OpenWriterF(func(w *Writer) {
w.Write(test)
})
close()
}
})
}
func BenchmarkOpenWriterF128_3(b *testing.B) {
test := make([]byte, 128)
rand.Read(test)
b.StartTimer()
b.RunParallel(func(pb *testing.PB) {
for pb.Next() {
_, close := OpenWriterF(func(w *Writer) {
w.Write(test)
w.Write(test)
w.Write(test)
})
close()
}
})
}
func BenchmarkOpenWriterF128_5(b *testing.B) {
test := make([]byte, 128)
rand.Read(test)
b.StartTimer()
b.RunParallel(func(pb *testing.PB) {
for pb.Next() {
_, close := OpenWriterF(func(w *Writer) {
w.Write(test)
w.Write(test)
w.Write(test)
w.Write(test)
w.Write(test)
})
close()
}
})
}

View File

@ -169,10 +169,12 @@ func (c *QQClient) buildQRCodeLoginPacket(t106, t16a, t318 []byte) (uint16, []by
w.Write(tlv.T18(16, uint32(c.Uin))) w.Write(tlv.T18(16, uint32(c.Uin)))
w.Write(tlv.T1(uint32(c.Uin), c.deviceInfo.IpAddress)) w.Write(tlv.T1(uint32(c.Uin), c.deviceInfo.IpAddress))
w.Write(binary.NewWriterF(func(w *binary.Writer) { wb, cl := binary.OpenWriterF(func(w *binary.Writer) {
w.WriteUInt16(0x106) w.WriteUInt16(0x106)
w.WriteBytesShort(t106) w.WriteBytesShort(t106)
})) })
w.Write(wb)
cl()
// w.Write(tlv.T106(uint32(c.Uin), 0, c.version.AppId, c.version.SSOVersion, c.PasswordMd5, true, c.deviceInfo.Guid, c.deviceInfo.TgtgtKey, 0)) // w.Write(tlv.T106(uint32(c.Uin), 0, c.version.AppId, c.version.SSOVersion, c.PasswordMd5, true, c.deviceInfo.Guid, c.deviceInfo.TgtgtKey, 0))
w.Write(tlv.T116(c.version.MiscBitmap, c.version.SubSigmap)) w.Write(tlv.T116(c.version.MiscBitmap, c.version.SubSigmap))
w.Write(tlv.T100(c.version.SSOVersion, c.version.SubAppId, c.version.MainSigMap)) w.Write(tlv.T100(c.version.SSOVersion, c.version.SubAppId, c.version.MainSigMap))
@ -194,10 +196,12 @@ func (c *QQClient) buildQRCodeLoginPacket(t106, t16a, t318 []byte) (uint16, []by
w.Write(tlv.T145(c.deviceInfo.Guid)) w.Write(tlv.T145(c.deviceInfo.Guid))
w.Write(tlv.T147(16, []byte(c.version.SortVersionName), c.version.ApkSign)) w.Write(tlv.T147(16, []byte(c.version.SortVersionName), c.version.ApkSign))
w.Write(binary.NewWriterF(func(w *binary.Writer) { wb, cl = binary.OpenWriterF(func(w *binary.Writer) {
w.WriteUInt16(0x16A) w.WriteUInt16(0x16A)
w.WriteBytesShort(t16a) w.WriteBytesShort(t16a)
})) })
w.Write(wb)
cl()
w.Write(tlv.T154(seq)) w.Write(tlv.T154(seq))
w.Write(tlv.T141(c.deviceInfo.SimInfo, c.deviceInfo.APN)) w.Write(tlv.T141(c.deviceInfo.SimInfo, c.deviceInfo.APN))
w.Write(tlv.T8(2052)) w.Write(tlv.T8(2052))
@ -219,10 +223,12 @@ func (c *QQClient) buildQRCodeLoginPacket(t106, t16a, t318 []byte) (uint16, []by
w.Write(tlv.T516()) w.Write(tlv.T516())
w.Write(tlv.T521(8)) w.Write(tlv.T521(8))
// w.Write(tlv.T525(tlv.T536([]byte{0x01, 0x00}))) // w.Write(tlv.T525(tlv.T536([]byte{0x01, 0x00})))
w.Write(binary.NewWriterF(func(w *binary.Writer) { wb, cl = binary.OpenWriterF(func(w *binary.Writer) {
w.WriteUInt16(0x318) w.WriteUInt16(0x318)
w.WriteBytesShort(t318) w.WriteBytesShort(t318)
})) })
w.Write(wb)
cl()
}) })
sso := packets.BuildSsoPacket(seq, c.version.AppId, c.version.SubAppId, "wtlogin.login", c.deviceInfo.IMEI, []byte{}, c.OutGoingPacketSessionId, req, c.ksid) sso := packets.BuildSsoPacket(seq, c.version.AppId, c.version.SubAppId, "wtlogin.login", c.deviceInfo.IMEI, []byte{}, c.OutGoingPacketSessionId, req, c.ksid)
packet := packets.BuildLoginPacket(c.Uin, 2, make([]byte, 16), sso, []byte{}) packet := packets.BuildLoginPacket(c.Uin, 2, make([]byte, 16), sso, []byte{})
@ -306,10 +312,12 @@ func (c *QQClient) buildRequestTgtgtNopicsigPacket() (uint16, []byte) {
w.Write(tlv.T18(16, uint32(c.Uin))) w.Write(tlv.T18(16, uint32(c.Uin)))
w.Write(tlv.T1(uint32(c.Uin), c.deviceInfo.IpAddress)) w.Write(tlv.T1(uint32(c.Uin), c.deviceInfo.IpAddress))
w.Write(binary.NewWriterF(func(w *binary.Writer) { wb, cl := binary.OpenWriterF(func(w *binary.Writer) {
w.WriteUInt16(0x106) w.WriteUInt16(0x106)
w.WriteBytesShort(c.sigInfo.encryptedA1) w.WriteBytesShort(c.sigInfo.encryptedA1)
})) })
w.Write(wb)
cl()
w.Write(tlv.T116(c.version.MiscBitmap, c.version.SubSigmap)) w.Write(tlv.T116(c.version.MiscBitmap, c.version.SubSigmap))
w.Write(tlv.T100(c.version.SSOVersion, 2, c.version.MainSigMap)) w.Write(tlv.T100(c.version.SSOVersion, 2, c.version.MainSigMap))
w.Write(tlv.T107(0)) w.Write(tlv.T107(0))
@ -989,13 +997,15 @@ func (c *QQClient) buildGroupKickPacket(groupCode, memberUin int64, kickMsg stri
// OidbSvc.0x570_8 // OidbSvc.0x570_8
func (c *QQClient) buildGroupMutePacket(groupCode, memberUin int64, time uint32) (uint16, []byte) { func (c *QQClient) buildGroupMutePacket(groupCode, memberUin int64, time uint32) (uint16, []byte) {
seq := c.nextSeq() seq := c.nextSeq()
payload := c.packOIDBPackage(1392, 8, binary.NewWriterF(func(w *binary.Writer) { b, cl := binary.OpenWriterF(func(w *binary.Writer) {
w.WriteUInt32(uint32(groupCode)) w.WriteUInt32(uint32(groupCode))
w.WriteByte(32) w.WriteByte(32)
w.WriteUInt16(1) w.WriteUInt16(1)
w.WriteUInt32(uint32(memberUin)) w.WriteUInt32(uint32(memberUin))
w.WriteUInt32(time) w.WriteUInt32(time)
})) })
payload := c.packOIDBPackage(1392, 8, b)
cl()
packet := packets.BuildUniPacket(c.Uin, seq, "OidbSvc.0x570_8", 1, c.OutGoingPacketSessionId, EmptyBytes, c.sigInfo.d2Key, payload) packet := packets.BuildUniPacket(c.Uin, seq, "OidbSvc.0x570_8", 1, c.OutGoingPacketSessionId, EmptyBytes, c.sigInfo.d2Key, payload)
return seq, packet return seq, packet
} }
@ -1029,7 +1039,7 @@ func (c *QQClient) buildFriendPokePacket(target int64) (uint16, []byte) {
// OidbSvc.0x55c_1 // OidbSvc.0x55c_1
func (c *QQClient) buildGroupAdminSetPacket(groupCode, member int64, flag bool) (uint16, []byte) { func (c *QQClient) buildGroupAdminSetPacket(groupCode, member int64, flag bool) (uint16, []byte) {
seq := c.nextSeq() seq := c.nextSeq()
payload := c.packOIDBPackage(1372, 1, binary.NewWriterF(func(w *binary.Writer) { b, cl := binary.OpenWriterF(func(w *binary.Writer) {
w.WriteUInt32(uint32(groupCode)) w.WriteUInt32(uint32(groupCode))
w.WriteUInt32(uint32(member)) w.WriteUInt32(uint32(member))
w.WriteByte(func() byte { w.WriteByte(func() byte {
@ -1038,7 +1048,9 @@ func (c *QQClient) buildGroupAdminSetPacket(groupCode, member int64, flag bool)
} }
return 0 return 0
}()) }())
})) })
payload := c.packOIDBPackage(1372, 1, b)
cl()
packet := packets.BuildUniPacket(c.Uin, seq, "OidbSvc.0x55c_1", 1, c.OutGoingPacketSessionId, EmptyBytes, c.sigInfo.d2Key, payload) packet := packets.BuildUniPacket(c.Uin, seq, "OidbSvc.0x55c_1", 1, c.OutGoingPacketSessionId, EmptyBytes, c.sigInfo.d2Key, payload)
return seq, packet return seq, packet
} }
@ -1049,10 +1061,12 @@ func (c *QQClient) buildQuitGroupPacket(groupCode int64) (uint16, []byte) {
jw := jce.NewJceWriter() jw := jce.NewJceWriter()
jw.WriteInt32(2, 0) jw.WriteInt32(2, 0)
jw.WriteInt64(c.Uin, 1) jw.WriteInt64(c.Uin, 1)
jw.WriteBytes(binary.NewWriterF(func(w *binary.Writer) { b, cl := binary.OpenWriterF(func(w *binary.Writer) {
w.WriteUInt32(uint32(c.Uin)) w.WriteUInt32(uint32(c.Uin))
w.WriteUInt32(uint32(groupCode)) w.WriteUInt32(uint32(groupCode))
}), 2) })
jw.WriteBytes(b, 2)
cl()
buf := &jce.RequestDataVersion3{Map: map[string][]byte{"GroupMngReq": packUniRequestData(jw.Bytes())}} buf := &jce.RequestDataVersion3{Map: map[string][]byte{"GroupMngReq": packUniRequestData(jw.Bytes())}}
pkt := &jce.RequestPacket{ pkt := &jce.RequestPacket{
IVersion: 3, IVersion: 3,

View File

@ -459,12 +459,15 @@ func getSSOAddress() ([]*net.TCPAddr, error) {
SFuncName: "HttpServerListReq", SFuncName: "HttpServerListReq",
SBuffer: buf.ToBytes(), SBuffer: buf.ToBytes(),
} }
tea := binary.NewTeaCipher(key) b, cl := binary.OpenWriterF(func(w *binary.Writer) {
rsp, err := utils.HttpPostBytes("https://configsvr.msf.3g.qq.com/configsvr/serverlist.jsp", tea.Encrypt(binary.NewWriterF(func(w *binary.Writer) {
w.WriteIntLvPacket(0, func(w *binary.Writer) { w.WriteIntLvPacket(0, func(w *binary.Writer) {
w.Write(pkt.ToBytes()) w.Write(pkt.ToBytes())
}) })
}))) })
tea := binary.NewTeaCipher(key)
encpkt := tea.Encrypt(b)
cl()
rsp, err := utils.HttpPostBytes("https://configsvr.msf.3g.qq.com/configsvr/serverlist.jsp", encpkt)
if err != nil { if err != nil {
return nil, errors.Wrap(err, "unable to fetch server list") return nil, errors.Wrap(err, "unable to fetch server list")
} }