feat(proto): add server handshake handler

This commit is contained in:
Jindřich Moravec 2023-12-11 16:54:41 +01:00
parent 393bc0a751
commit dbd0ef3970
3 changed files with 61 additions and 0 deletions

View file

@ -0,0 +1 @@
pub mod server;

View file

@ -0,0 +1,59 @@
use crate::message::backend::{
AuthenticationOkData, BackendKeyDataData, BackendMessage, ParameterStatusData,
ReadyForQueryData,
};
use crate::message::special::{SpecialMessage, StartupMessageData};
use crate::reader::frontend::FrontendProtoReader;
use crate::writer::backend::BackendProtoWriter;
use crate::writer::protowriter::ProtoFlush;
pub async fn do_server_handshake(
writer: &mut (impl BackendProtoWriter + ProtoFlush),
reader: &mut impl FrontendProtoReader,
name: &str,
process: i32,
secret: i32,
) -> anyhow::Result<StartupMessageData> {
match &reader.peek_special_message().await? {
Some(msg @ SpecialMessage::SSLRequest) => {
reader.consume_special_message(msg).await?;
writer.write_ssl_reject().await?;
writer.flush().await?;
}
_ => {
// No SSL request
}
}
let startup_message = match &reader.peek_special_message().await? {
Some(msg @ SpecialMessage::StartupMessage(data)) => {
reader.consume_special_message(msg).await?;
data.clone()
}
_ => {
return Err(anyhow::anyhow!("Expected Startup Message"));
}
};
writer
.write_proto(BackendMessage::from(AuthenticationOkData { status: 0 }))
.await?;
writer
.write_proto(BackendMessage::from(ParameterStatusData {
name: "server_version".to_string().into(),
value: format!("16.0 ({name})").into(),
}))
.await?;
writer
.write_proto(BackendMessage::from(BackendKeyDataData { process, secret }))
.await?;
writer
.write_proto(BackendMessage::from(ReadyForQueryData { status: b'I' }))
.await?;
writer.flush().await?;
Ok(startup_message)
}

View file

@ -1,3 +1,4 @@
pub mod handshake;
pub mod message;
pub mod reader;
pub mod writer;