fix(proto): flush written startup message

This commit is contained in:
Jindřich Moravec 2023-12-23 01:27:15 +01:00
parent c1744711d3
commit 505f59b354
4 changed files with 14 additions and 7 deletions

View file

@ -14,6 +14,7 @@ pub async fn do_client_handshake(
) -> Result<HandshakeResponse, ClientHandshakeError> { ) -> Result<HandshakeResponse, ClientHandshakeError> {
let startup_message: StartupMessageData = request.into(); let startup_message: StartupMessageData = request.into();
writer.write_startup_message(startup_message).await?; writer.write_startup_message(startup_message).await?;
writer.flush().await?;
let auth = reader.read_proto().await?; let auth = reader.read_proto().await?;
if !matches!(auth, BackendMessage::AuthenticationOk(AuthenticationOkData { status: 0 })) { if !matches!(auth, BackendMessage::AuthenticationOk(AuthenticationOkData { status: 0 })) {

View file

@ -11,6 +11,8 @@ pub enum ClientHandshakeError {
UnexpectedResponse, UnexpectedResponse,
#[error("unexpected auth response")] #[error("unexpected auth response")]
UnexpectedAuthResponse(BackendMessage), UnexpectedAuthResponse(BackendMessage),
#[error("socket communication failed")]
Io(#[from] io::Error),
#[error("writing message to socket failed")] #[error("writing message to socket failed")]
Write(#[from] ProtoWriteError), Write(#[from] ProtoWriteError),
#[error("reading message from socket failed")] #[error("reading message from socket failed")]

View file

@ -1,6 +1,7 @@
use crate::message::primitive::pgstring::PgString; use crate::message::primitive::pgstring::PgString;
use crate::message::special::StartupMessageData; use crate::message::special::StartupMessageData;
#[derive(Debug)]
pub struct HandshakeRequest { pub struct HandshakeRequest {
version: i32, version: i32,
parameters: Vec<(PgString, PgString)>, parameters: Vec<(PgString, PgString)>,

View file

@ -1,6 +1,7 @@
use crate::handshake::errors::ClientHandshakeError; use crate::handshake::errors::ClientHandshakeError;
use crate::message::backend::{BackendKeyDataData, BackendMessage, ParameterStatusData}; use crate::message::backend::{BackendKeyDataData, BackendMessage, ParameterStatusData};
#[derive(Debug)]
pub struct HandshakeResponse { pub struct HandshakeResponse {
pub version: String, pub version: String,
pub process_id: i32, pub process_id: i32,
@ -41,20 +42,22 @@ impl TryFrom<&[BackendMessage]> for HandshakeResponse {
} }
match (version, process_id, secret_key) { match (version, process_id, secret_key) {
(Some(version), Some(process_id), Some(secret_key)) => { (Some(version), Some(process_id), Some(secret_key)) => Ok(Self {
Ok(Self { version, process_id, secret_key }) version,
} process_id,
secret_key,
}),
_ => Err(ClientHandshakeError::UnexpectedResponse), _ => Err(ClientHandshakeError::UnexpectedResponse),
} }
} }
} }
impl From<&HandshakeResponse> for Vec<BackendMessage> { impl From<HandshakeResponse> for Vec<BackendMessage> {
fn from(response: &HandshakeResponse) -> Self { fn from(response: HandshakeResponse) -> Self {
vec![ vec![
BackendMessage::ParameterStatus(ParameterStatusData { BackendMessage::ParameterStatus(ParameterStatusData {
name: "server_version".into(), name: "server_version".into(),
value: response.version.clone().into(), value: response.version.into(),
}), }),
BackendMessage::BackendKeyData(BackendKeyDataData { BackendMessage::BackendKeyData(BackendKeyDataData {
process: response.process_id, process: response.process_id,