fix(proto): flush written startup message
This commit is contained in:
parent
c1744711d3
commit
505f59b354
4 changed files with 14 additions and 7 deletions
|
|
@ -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 })) {
|
||||
|
|
|
|||
|
|
@ -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")]
|
||||
|
|
|
|||
|
|
@ -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)>,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue