11using System ;
22using System . Buffers ;
3+ using System . Buffers . Binary ;
34using System . Text ;
45
56namespace SuperSocket . MySQL . Packets
@@ -13,26 +14,27 @@ public class HandshakeResponsePacket : MySQLPacket
1314 public byte [ ] AuthResponse { get ; set ; }
1415 public string Database { get ; set ; }
1516 public string AuthPluginName { get ; set ; }
17+
1618 protected internal override void Decode ( ref SequenceReader < byte > reader , object context )
1719 {
1820 // Read capability flags (4 bytes)
1921 reader . TryReadLittleEndian ( out int capabilityFlags ) ;
2022 CapabilityFlags = ( uint ) capabilityFlags ;
21-
23+
2224 // Read max packet size (4 bytes)
2325 reader . TryReadLittleEndian ( out int maxPacketSize ) ;
2426 MaxPacketSize = ( uint ) maxPacketSize ;
25-
27+
2628 // Read character set (1 byte)
2729 reader . TryRead ( out byte characterSet ) ;
2830 CharacterSet = characterSet ;
29-
31+
3032 // Skip reserved bytes (23 bytes)
3133 reader . Advance ( 23 ) ;
32-
34+
3335 // Read null-terminated username
3436 Username = reader . TryReadNullTerminatedString ( out string username ) ? username : string . Empty ;
35-
37+
3638 // Read auth response length and data
3739 if ( ( CapabilityFlags & 0x00200000 ) != 0 ) // CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA
3840 {
@@ -52,13 +54,13 @@ protected internal override void Decode(ref SequenceReader<byte> reader, object
5254 {
5355 AuthResponse = reader . TryReadNullTerminatedString ( out string authResponseString ) ? Encoding . UTF8 . GetBytes ( authResponseString ) : Array . Empty < byte > ( ) ;
5456 }
55-
57+
5658 // Read database name if present
5759 if ( ( CapabilityFlags & 0x00000008 ) != 0 ) // CLIENT_CONNECT_WITH_DB
5860 {
5961 Database = reader . TryReadNullTerminatedString ( out string database ) ? database : string . Empty ;
6062 }
61-
63+
6264 // Read auth plugin name if present
6365 if ( ( CapabilityFlags & 0x00080000 ) != 0 ) // CLIENT_PLUGIN_AUTH
6466 {
@@ -68,90 +70,80 @@ protected internal override void Decode(ref SequenceReader<byte> reader, object
6870
6971 protected internal override int Encode ( IBufferWriter < byte > writer )
7072 {
71- var contentWriter = new ArrayBufferWriter < byte > ( ) ;
72-
7373 var bytesWritten = 0 ;
74- var span = contentWriter . GetSpan ( 4 ) ;
75-
74+ var span = writer . GetSpan ( 4 ) ;
75+
76+ BinaryPrimitives . WriteUInt32LittleEndian ( span , CapabilityFlags ) ;
77+
7678 // Write capability flags (4 bytes)
77- BitConverter . TryWriteBytes ( span , CapabilityFlags ) ;
78- contentWriter . Advance ( 4 ) ;
79+ // BitConverter.TryWriteBytes(span, CapabilityFlags);
80+ writer . Advance ( 4 ) ;
7981 bytesWritten += 4 ;
8082
8183 // Write max packet size (4 bytes)
82- span = contentWriter . GetSpan ( 4 ) ;
84+ span = writer . GetSpan ( 4 ) ;
8385 BitConverter . TryWriteBytes ( span , MaxPacketSize ) ;
84- contentWriter . Advance ( 4 ) ;
86+ writer . Advance ( 4 ) ;
8587 bytesWritten += 4 ;
8688
8789 // Write character set (1 byte)
88- span = contentWriter . GetSpan ( 1 ) ;
90+ span = writer . GetSpan ( 1 ) ;
8991 span [ 0 ] = CharacterSet ;
90- contentWriter . Advance ( 1 ) ;
92+ writer . Advance ( 1 ) ;
9193 bytesWritten += 1 ;
9294
9395 // Write reserved bytes (23 bytes of zeros)
94- span = contentWriter . GetSpan ( 23 ) ;
96+ span = writer . GetSpan ( 23 ) ;
9597 span . Slice ( 0 , 23 ) . Clear ( ) ;
96- contentWriter . Advance ( 23 ) ;
98+ writer . Advance ( 23 ) ;
9799 bytesWritten += 23 ;
98100
99- bytesWritten += contentWriter . WriteNullTerminatedString ( Username ) ;
101+ bytesWritten += writer . WriteNullTerminatedString ( Username ) ;
100102
101103 // Write auth response
102104 if ( AuthResponse != null )
103105 {
104106 if ( ( CapabilityFlags & ( uint ) ClientCapabilities . CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA ) != 0 ) // CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA
105107 {
106- bytesWritten += contentWriter . WriteLengthEncodedInteger ( ( ulong ) AuthResponse . Length ) ;
107- contentWriter . Write ( AuthResponse ) ;
108+ bytesWritten += writer . WriteLengthEncodedInteger ( ( ulong ) AuthResponse . Length ) ;
109+ writer . Write ( AuthResponse ) ;
108110 bytesWritten += AuthResponse . Length ;
109111 }
110112 else if ( ( CapabilityFlags & ( uint ) ClientCapabilities . CLIENT_SECURE_CONNECTION ) != 0 ) // CLIENT_SECURE_CONNECTION
111113 {
112- span = contentWriter . GetSpan ( 1 ) ;
114+ span = writer . GetSpan ( 1 ) ;
113115 span [ 0 ] = ( byte ) AuthResponse . Length ;
114- contentWriter . Advance ( 1 ) ;
116+ writer . Advance ( 1 ) ;
115117 bytesWritten += 1 ;
116118
117- contentWriter . Write ( AuthResponse ) ;
119+ writer . Write ( AuthResponse ) ;
118120 bytesWritten += AuthResponse . Length ;
119121 }
120122 else
121123 {
122- contentWriter . Write ( AuthResponse ) ;
124+ writer . Write ( AuthResponse ) ;
123125 bytesWritten += AuthResponse . Length ;
124126
125- span = contentWriter . GetSpan ( 1 ) ;
127+ span = writer . GetSpan ( 1 ) ;
126128 span [ 0 ] = 0 ; // null terminator
127- contentWriter . Advance ( 1 ) ;
129+ writer . Advance ( 1 ) ;
128130 bytesWritten += 1 ;
129131 }
130132 }
131133
132134 // Write database name if present
133135 if ( ( CapabilityFlags & 0x00000008 ) != 0 && ! string . IsNullOrEmpty ( Database ) )
134136 {
135- bytesWritten += contentWriter . WriteNullTerminatedString ( Database ) ;
137+ bytesWritten += writer . WriteNullTerminatedString ( Database ) ;
136138 }
137139
138140 // Write auth plugin name if present
139141 if ( ( CapabilityFlags & 0x00080000 ) != 0 && ! string . IsNullOrEmpty ( AuthPluginName ) )
140142 {
141- bytesWritten += contentWriter . WriteNullTerminatedString ( AuthPluginName ) ;
143+ bytesWritten += writer . WriteNullTerminatedString ( AuthPluginName ) ;
142144 }
143145
144- var headerSpan = writer . GetSpan ( 4 ) ;
145- headerSpan [ 0 ] = ( byte ) ( bytesWritten & 0xFF ) ;
146- headerSpan [ 1 ] = ( byte ) ( ( bytesWritten >> 8 ) & 0xFF ) ;
147- headerSpan [ 2 ] = ( byte ) ( ( bytesWritten >> 16 ) & 0xFF ) ;
148- headerSpan [ 3 ] = ( byte ) SequenceId ; // Sequence ID, typically starts at 0 for the first packet
149- //headerSpan[4] = 0x00; // Set header byte
150- writer . Advance ( 4 ) ;
151-
152- writer . Write ( contentWriter . WrittenSpan ) ;
153-
154- return bytesWritten + 4 ;
146+ return bytesWritten ;
155147 }
156148 }
157149}
0 commit comments