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> {
let startup_message: StartupMessageData = request.into();
writer.write_startup_message(startup_message).await?;
writer.flush().await?;
let auth = reader.read_proto().await?;
if !matches!(auth, BackendMessage::AuthenticationOk(AuthenticationOkData { status: 0 })) {

View file

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

View file

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

View file

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