44
55namespace Workbunny \MysqlProtocol \Packets ;
66
7+ use Workbunny \MysqlProtocol \Constants \ExceptionCode ;
78use Workbunny \MysqlProtocol \Exceptions \PacketException ;
89use Workbunny \MysqlProtocol \Utils \Binary ;
9- use InvalidArgumentException ;
1010use Workbunny \MysqlProtocol \Utils \Packet ;
1111
1212class AuthSwitchRequest implements PacketInterface
@@ -21,61 +21,50 @@ class AuthSwitchRequest implements PacketInterface
2121 * @param Binary $binary
2222 * @return array 解析后的数据,包含:
2323 * - plugin_name: string
24- * - auth_plugin_data: string(可能为空 )
24+ * - auth_plugin_data: array(字节组 )
2525 */
2626 public static function unpack (Binary $ binary ): array
2727 {
28- try {
29- return Packet::parser (function (Binary $ binary ) {
30- // 读取 1 个字节并验证标志必须为 0xFE
31- $ flag = $ binary ->readByte ();
32- if ($ flag !== self ::PACKET_FLAG ) {
33- throw new InvalidArgumentException ("Error: Invalid packet flag ' $ flag', expected 0xFE " );
34- }
35- // 读取 NULL 终止的认证插件名称
36- $ pluginName = Binary::BytesToString ($ binary ->readNullTerminated ());
37- // 剩下的所有数据为附加的认证数据(可以为空)
38- $ remainingLength = $ binary ->length () - $ binary ->getReadCursor ();
39- $ authPluginDataBytes = $ binary ->readBytes ($ remainingLength );
40- $ authPluginData = Binary::BytesToString ($ authPluginDataBytes );
41- return [
42- 'flag ' => $ flag ,
43- 'plugin_name ' => $ pluginName ,
44- 'auth_plugin_data ' => $ authPluginData ,
45- ];
46- }, $ binary );
47- } catch (InvalidArgumentException $ e ) {
48- throw new PacketException ("Error: Failed to unpack auth switch request packet [ {$ e ->getMessage ()}] " , $ e ->getCode (), $ e );
49- }
28+ return Packet::parser (function (Binary $ binary ) {
29+ // 读取 1 个字节并验证标志必须为 0xFE
30+ $ flag = $ binary ->readByte ();
31+ if ($ flag !== self ::PACKET_FLAG ) {
32+ throw new PacketException ("Invalid packet flag ' $ flag', expected 0xFE " , ExceptionCode::ERROR_VALUE );
33+ }
34+ // 读取 NULL 终止的认证插件名称
35+ $ pluginName = Binary::BytesToString ($ binary ->readNullTerminated ());
36+ // 剩下的所有数据为附加的认证数据(可以为空)
37+ $ remainingLength = $ binary ->length () - $ binary ->getReadCursor ();
38+ $ authPluginData = $ binary ->readBytes ($ remainingLength );
39+ return [
40+ 'flag ' => $ flag ,
41+ 'plugin_name ' => $ pluginName ,
42+ 'auth_plugin_data ' => $ authPluginData ,
43+ ];
44+ }, $ binary );
5045 }
5146
5247 /**
5348 * 将 AuthSwitchRequest 数据包内容封装为 Binary 对象。
5449 *
5550 * @param array $data 数组包含:
5651 * - plugin_name: 认证插件名称(字符串,必填)
57- * - auth_plugin_data: 附加认证数据(字符串 ,可选)
52+ * - auth_plugin_data: 附加认证数据(字节组 ,可选)
5853 * @return Binary
5954 */
6055 public static function pack (array $ data ): Binary
6156 {
62- $ packetId = $ data ['packet_id ' ] ?? 0 ;
63-
64- try {
65- return Packet::binary (function (Binary $ binary ) use ($ data ) {
66- $ pluginName = $ data ['plugin_name ' ] ?? '' ;
67- $ authPluginData = $ data ['auth_plugin_data ' ] ?? null ;
68- // 写入标志字节 0xFE
69- $ binary ->writeByte (self ::PACKET_FLAG );
70- // 写入认证插件名称(字符串转换成字节数组)及 NULL 终止符
71- $ binary ->writeNullTerminated (Binary::StringToBytes ($ pluginName ));
72- // 如果附加认证数据存在,则写入
73- if ($ authPluginData ) {
74- $ binary ->writeBytes (Binary::StringToBytes ($ authPluginData ));
75- }
76- }, $ packetId );
77- } catch (InvalidArgumentException $ e ) {
78- throw new PacketException ("Error: Failed to pack auth switch request packet [ {$ e ->getMessage ()}] " , $ e ->getCode (), $ e );
79- }
57+ return Packet::binary (function (Binary $ binary ) use ($ data ) {
58+ $ pluginName = $ data ['plugin_name ' ] ?? '' ;
59+ $ authPluginData = $ data ['auth_plugin_data ' ] ?? [];
60+ // 写入标志字节 0xFE
61+ $ binary ->writeByte (self ::PACKET_FLAG );
62+ // 写入认证插件名称(字符串转换成字节数组)及 NULL 终止符
63+ $ binary ->writeNullTerminated (Binary::StringToBytes ($ pluginName ));
64+ // 如果附加认证数据存在,则写入
65+ if ($ authPluginData and is_array ($ authPluginData )) {
66+ $ binary ->writeBytes ($ authPluginData );
67+ }
68+ }, $ data ['packet_id ' ] ?? 0 );
8069 }
8170}
0 commit comments