feat(proto): add server handshake handler
This commit is contained in:
parent
393bc0a751
commit
dbd0ef3970
3 changed files with 61 additions and 0 deletions
1
proto/src/handshake/mod.rs
Normal file
1
proto/src/handshake/mod.rs
Normal file
|
|
@ -0,0 +1 @@
|
|||
pub mod server;
|
||||
59
proto/src/handshake/server.rs
Normal file
59
proto/src/handshake/server.rs
Normal 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)
|
||||
}
|
||||
|
|
@ -1,3 +1,4 @@
|
|||
pub mod handshake;
|
||||
pub mod message;
|
||||
pub mod reader;
|
||||
pub mod writer;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue