Skip to content

Commit d3fcb5d

Browse files
committed
tried to fix the unit tests
1 parent 29d1a6b commit d3fcb5d

File tree

5 files changed

+80
-73
lines changed

5 files changed

+80
-73
lines changed

src/SuperSocket.MySQL/IBufferWriterExtensions.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -104,12 +104,12 @@ public static int WriteNullTerminatedString(this IBufferWriter<byte> writer, str
104104

105105
if (!string.IsNullOrEmpty(value))
106106
{
107-
var bytes = System.Text.Encoding.UTF8.GetBytes(value);
108-
var span = writer.GetSpan(bytes.Length + 1);
109-
bytes.CopyTo(span);
110-
span[bytes.Length] = 0; // null terminator
111-
writer.Advance(bytes.Length + 1);
112-
bytesWritten = bytes.Length + 1;
107+
var maxByteCount = Encoding.UTF8.GetMaxByteCount(value.Length);
108+
var span = writer.GetSpan(maxByteCount + 1);
109+
var encodedBytes = Encoding.UTF8.GetBytes(value, span);
110+
span[encodedBytes] = 0; // null terminator
111+
bytesWritten = encodedBytes + 1;
112+
writer.Advance(bytesWritten);
113113
}
114114
else
115115
{

src/SuperSocket.MySQL/MySQLConnection.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,7 @@ public async Task ConnectAsync(CancellationToken cancellationToken = default)
5757
{
5858
CapabilityFlags = (uint)(ClientCapabilities.CLIENT_PROTOCOL_41 |
5959
ClientCapabilities.CLIENT_SECURE_CONNECTION |
60-
ClientCapabilities.CLIENT_PLUGIN_AUTH |
61-
ClientCapabilities.CLIENT_CONNECT_WITH_DB),
60+
ClientCapabilities.CLIENT_PLUGIN_AUTH),
6261
MaxPacketSize = 16777216, // 16MB
6362
CharacterSet = 0x21, // utf8_general_ci
6463
Username = _userName,
@@ -68,6 +67,7 @@ public async Task ConnectAsync(CancellationToken cancellationToken = default)
6867

6968
// Generate authentication response
7069
handshakeResponse.AuthResponse = GenerateAuthResponse(handshakePacket);
70+
handshakeResponse.SequenceId = packet.SequenceId + 1;
7171

7272
// Send handshake response
7373
await SendAsync(PacketEncoder, handshakeResponse).ConfigureAwait(false);

src/SuperSocket.MySQL/MySQLPacketDecoder.cs

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,25 +27,33 @@ public MySQLPacket Decode(ref ReadOnlySequence<byte> buffer, object context)
2727

2828
var reader = new SequenceReader<byte>(buffer);
2929

30-
reader.Advance(4); // Skip the first 4 bytes of the header
30+
reader.Advance(3); // Skip the first 3 bytes of the header
31+
reader.TryRead(out var sequenceId); // Read the sequence ID
32+
33+
var filter = context as MySQLPacketFilter;
34+
35+
var packetType = -1;
3136

3237
// Read the first byte to determine packet type
33-
if (!reader.TryRead(out byte packetType))
34-
return null;
38+
if (filter.ReceivedHandshake)
39+
{
40+
if (!reader.TryRead(out var packetTypeByte))
41+
return null;
3542

36-
var filter = context as MySQLPacketFilter;
43+
packetType = (int)packetTypeByte;
44+
}
3745

3846
// Reset reader to beginning
3947
reader = new SequenceReader<byte>(buffer);
4048

41-
var package = _packetFactory.Create(
42-
(filter.ReceivedHandshake == true
43-
? packetType
44-
: -1)); // Use -1 for HandshakePacket if not received yet
49+
var package = _packetFactory.Create(packetType);
4550

4651
package.Decode(ref reader, context);
52+
package.SequenceId = sequenceId;
53+
54+
if (!filter.ReceivedHandshake)
55+
filter.ReceivedHandshake = true;
4756

48-
filter.ReceivedHandshake = true;
4957
return package;
5058
}
5159
}

src/SuperSocket.MySQL/Packets/HandshakeResponsePacket.cs

Lines changed: 54 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

src/SuperSocket.MySQL/Packets/MySQLPacket.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ namespace SuperSocket.MySQL
55
{
66
public abstract class MySQLPacket
77
{
8+
public int SequenceId { get; set; }
89

910
/// <summary>
1011
/// Decodes the body of the log event from the binary data.

0 commit comments

Comments
 (0)