diff --git a/Cargo.toml b/Cargo.toml index 015397e..60fa81d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -31,7 +31,7 @@ time = "0.2.25" [dev-dependencies] postgres = "0.15" -mysql = "18" +mysql = "20.1.0" mysql_async = "0.20.0" slab = "0.4.2" tokio = "0.1.19" diff --git a/src/lib.rs b/src/lib.rs index b3b4e10..34bef33 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -101,7 +101,7 @@ use std::io::prelude::*; use std::iter; use std::net; -pub use crate::myc::constants::{ColumnFlags, ColumnType, StatusFlags}; +pub use crate::myc::constants::{CapabilityFlags, ColumnFlags, ColumnType, StatusFlags}; mod commands; mod errorcodes; @@ -238,15 +238,22 @@ impl, R: Read, W: Write> MysqlIntermediary { fn init(&mut self) -> Result<(), B::Error> { self.writer.write_all(&[10])?; // protocol 10 + let mut capabilities = CapabilityFlags::empty(); + capabilities.insert(CapabilityFlags::CLIENT_PROTOCOL_41); + capabilities.insert(CapabilityFlags::CLIENT_RESERVED); + capabilities.insert(CapabilityFlags::CLIENT_SECURE_CONNECTION); + capabilities.insert(CapabilityFlags::CLIENT_PLUGIN_AUTH); + let capabilities_bytes = capabilities.bits().to_le_bytes(); + // 5.1.10 because that's what Ruby's ActiveRecord requires self.writer.write_all(&b"5.1.10-alpha-msql-proxy\0"[..])?; self.writer.write_all(&[0x08, 0x00, 0x00, 0x00])?; // TODO: connection ID self.writer.write_all(&b";X,po_k}\0"[..])?; // auth seed - self.writer.write_all(&[0x00, 0x42])?; // just 4.1 proto + self.writer.write_all(&capabilities_bytes[..2])?; // just 4.1 proto self.writer.write_all(&[0x21])?; // UTF8_GENERAL_CI self.writer.write_all(&[0x00, 0x00])?; // status flags - self.writer.write_all(&[0x00, 0x00])?; // extended capabilities + self.writer.write_all(&capabilities_bytes[2..])?; // extended capabilities self.writer.write_all(&[0x00])?; // no plugins self.writer.write_all(&[0x00; 6][..])?; // filler self.writer.write_all(&[0x00; 4][..])?; // filler @@ -266,17 +273,22 @@ impl, R: Read, W: Write> MysqlIntermediary { io::ErrorKind::UnexpectedEof, "client sent incomplete handshake", ), - nom::Err::Failure((input, nom_e_kind)) - | nom::Err::Error((input, nom_e_kind)) => { - if let nom::error::ErrorKind::Eof = nom_e_kind { + nom::Err::Failure(nom_error) | nom::Err::Error(nom_error) => { + if let nom::error::ErrorKind::Eof = nom_error.code { io::Error::new( io::ErrorKind::UnexpectedEof, - format!("client did not complete handshake; got {:?}", input), + format!( + "client did not complete handshake; got {:?}", + nom_error.input + ), ) } else { io::Error::new( io::ErrorKind::InvalidData, - format!("bad client handshake; got {:?} ({:?})", input, nom_e_kind), + format!( + "bad client handshake; got {:?} ({:?})", + nom_error.input, nom_error.code + ), ) } }