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 message;
|
||||||
pub mod reader;
|
pub mod reader;
|
||||||
pub mod writer;
|
pub mod writer;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue