@@ -68,92 +68,90 @@ protected internal override void Decode(ref SequenceReader<byte> reader, object
6868
6969 protected internal override int Encode ( IBufferWriter < byte > writer )
7070 {
71+ var contentWriter = new ArrayBufferWriter < byte > ( ) ;
72+
7173 var bytesWritten = 0 ;
72- var span = writer . GetSpan ( 4 ) ;
74+ var span = contentWriter . GetSpan ( 4 ) ;
7375
7476 // Write capability flags (4 bytes)
7577 BitConverter . TryWriteBytes ( span , CapabilityFlags ) ;
76- writer . Advance ( 4 ) ;
78+ contentWriter . Advance ( 4 ) ;
7779 bytesWritten += 4 ;
78-
80+
7981 // Write max packet size (4 bytes)
80- span = writer . GetSpan ( 4 ) ;
82+ span = contentWriter . GetSpan ( 4 ) ;
8183 BitConverter . TryWriteBytes ( span , MaxPacketSize ) ;
82- writer . Advance ( 4 ) ;
84+ contentWriter . Advance ( 4 ) ;
8385 bytesWritten += 4 ;
84-
86+
8587 // Write character set (1 byte)
86- span = writer . GetSpan ( 1 ) ;
88+ span = contentWriter . GetSpan ( 1 ) ;
8789 span [ 0 ] = CharacterSet ;
88- writer . Advance ( 1 ) ;
90+ contentWriter . Advance ( 1 ) ;
8991 bytesWritten += 1 ;
9092
9193 // Write reserved bytes (23 bytes of zeros)
92- span = writer . GetSpan ( 23 ) ;
94+ span = contentWriter . GetSpan ( 23 ) ;
9395 span . Slice ( 0 , 23 ) . Clear ( ) ;
94- writer . Advance ( 23 ) ;
96+ contentWriter . Advance ( 23 ) ;
9597 bytesWritten += 23 ;
96-
97- // Write null-terminated username
98- var usernameBytes = Encoding . UTF8 . GetBytes ( Username ?? string . Empty ) ;
99- span = writer . GetSpan ( usernameBytes . Length + 1 ) ;
100- usernameBytes . CopyTo ( span ) ;
101- span [ usernameBytes . Length ] = 0 ; // null terminator
102- writer . Advance ( usernameBytes . Length + 1 ) ;
103- bytesWritten += usernameBytes . Length + 1 ;
98+
99+ bytesWritten += contentWriter . WriteNullTerminatedString ( Username ) ;
104100
105101 // Write auth response
106102 if ( AuthResponse != null )
107103 {
108- if ( ( CapabilityFlags & 0x00200000 ) != 0 ) // CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA
109- {
110- bytesWritten += writer . WriteUInt64 ( ( ulong ) AuthResponse . Length ) ;
111- }
112- else if ( ( CapabilityFlags & 0x00008000 ) != 0 ) // CLIENT_SECURE_CONNECTION
113- {
114- span = writer . GetSpan ( 1 ) ;
115- span [ 0 ] = ( byte ) AuthResponse . Length ;
116- writer . Advance ( 1 ) ;
117- bytesWritten += 1 ;
118- }
119-
120- span = writer . GetSpan ( AuthResponse . Length ) ;
121- AuthResponse . CopyTo ( span ) ;
122- writer . Advance ( AuthResponse . Length ) ;
123- bytesWritten += AuthResponse . Length ;
124-
125- if ( ( CapabilityFlags & 0x00008000 ) == 0 ) // Not CLIENT_SECURE_CONNECTION
126- {
127- span = writer . GetSpan ( 1 ) ;
128- span [ 0 ] = 0 ; // null terminator
129- writer . Advance ( 1 ) ;
130- bytesWritten += 1 ;
131- }
104+ if ( ( CapabilityFlags & ( uint ) ClientCapabilities . CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA ) != 0 ) // CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA
105+ {
106+ bytesWritten += contentWriter . WriteLengthEncodedInteger ( ( ulong ) AuthResponse . Length ) ;
107+ contentWriter . Write ( AuthResponse ) ;
108+ bytesWritten += AuthResponse . Length ;
109+ }
110+ else if ( ( CapabilityFlags & ( uint ) ClientCapabilities . CLIENT_SECURE_CONNECTION ) != 0 ) // CLIENT_SECURE_CONNECTION
111+ {
112+ span = contentWriter . GetSpan ( 1 ) ;
113+ span [ 0 ] = ( byte ) AuthResponse . Length ;
114+ contentWriter . Advance ( 1 ) ;
115+ bytesWritten += 1 ;
116+
117+ contentWriter . Write ( AuthResponse ) ;
118+ bytesWritten += AuthResponse . Length ;
119+ }
120+ else
121+ {
122+ contentWriter . Write ( AuthResponse ) ;
123+ bytesWritten += AuthResponse . Length ;
124+
125+ span = contentWriter . GetSpan ( 1 ) ;
126+ span [ 0 ] = 0 ; // null terminator
127+ contentWriter . Advance ( 1 ) ;
128+ bytesWritten += 1 ;
129+ }
132130 }
133131
134132 // Write database name if present
135133 if ( ( CapabilityFlags & 0x00000008 ) != 0 && ! string . IsNullOrEmpty ( Database ) )
136134 {
137- var databaseBytes = Encoding . UTF8 . GetBytes ( Database ) ;
138- span = writer . GetSpan ( databaseBytes . Length + 1 ) ;
139- databaseBytes . CopyTo ( span ) ;
140- span [ databaseBytes . Length ] = 0 ; // null terminator
141- writer . Advance ( databaseBytes . Length + 1 ) ;
142- bytesWritten += databaseBytes . Length + 1 ;
135+ bytesWritten += contentWriter . WriteNullTerminatedString ( Database ) ;
143136 }
144137
145138 // Write auth plugin name if present
146139 if ( ( CapabilityFlags & 0x00080000 ) != 0 && ! string . IsNullOrEmpty ( AuthPluginName ) )
147140 {
148- var pluginNameBytes = Encoding . UTF8 . GetBytes ( AuthPluginName ) ;
149- span = writer . GetSpan ( pluginNameBytes . Length + 1 ) ;
150- pluginNameBytes . CopyTo ( span ) ;
151- span [ pluginNameBytes . Length ] = 0 ; // null terminator
152- writer . Advance ( pluginNameBytes . Length + 1 ) ;
153- bytesWritten += pluginNameBytes . Length + 1 ;
141+ bytesWritten += contentWriter . WriteNullTerminatedString ( AuthPluginName ) ;
154142 }
155-
156- return bytesWritten ;
143+
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 ;
157155 }
158156 }
159157}
0 commit comments