Parse cancel message in pq_proto (#1060)

This commit is contained in:
bojanserafimov
2021-12-28 16:43:44 -05:00
committed by GitHub
parent 1e3ddd43bc
commit 24eca8d58b
4 changed files with 100 additions and 83 deletions

View File

@@ -3,9 +3,7 @@
//! implementation determining how to process the queries. Currently its API
//! is rather narrow, but we can extend it once required.
use crate::pq_proto::{
BeMessage, BeParameterStatusMessage, FeMessage, FeStartupMessage, StartupRequestCode,
};
use crate::pq_proto::{BeMessage, BeParameterStatusMessage, FeMessage, FeStartupPacket};
use crate::sock_split::{BidiStream, ReadStream, WriteStream};
use anyhow::{anyhow, bail, ensure, Result};
use bytes::{Bytes, BytesMut};
@@ -34,7 +32,7 @@ pub trait Handler {
/// If Ok(false) is returned postgres_backend will skip auth -- that is needed for new users
/// creation is the proxy code. That is quite hacky and ad-hoc solution, may be we could allow
/// to override whole init logic in implementations.
fn startup(&mut self, _pgb: &mut PostgresBackend, _sm: &FeStartupMessage) -> Result<()> {
fn startup(&mut self, _pgb: &mut PostgresBackend, _sm: &FeStartupPacket) -> Result<()> {
Ok(())
}
@@ -237,7 +235,7 @@ impl PostgresBackend {
use ProtoState::*;
match state {
Initialization | Encrypted => FeStartupMessage::read(stream),
Initialization | Encrypted => FeStartupPacket::read(stream),
Authentication | Established => FeMessage::read(stream),
}
}
@@ -329,7 +327,7 @@ impl PostgresBackend {
ensure!(
matches!(
msg,
FeMessage::PasswordMessage(_) | FeMessage::StartupMessage(_)
FeMessage::PasswordMessage(_) | FeMessage::StartupPacket(_)
),
"protocol violation"
);
@@ -337,11 +335,11 @@ impl PostgresBackend {
let have_tls = self.tls_config.is_some();
match msg {
FeMessage::StartupMessage(m) => {
FeMessage::StartupPacket(m) => {
trace!("got startup message {:?}", m);
match m.kind {
StartupRequestCode::NegotiateSsl => {
match m {
FeStartupPacket::SslRequest => {
info!("SSL requested");
self.write_message(&BeMessage::EncryptionResponse(have_tls))?;
@@ -350,11 +348,11 @@ impl PostgresBackend {
self.state = ProtoState::Encrypted;
}
}
StartupRequestCode::NegotiateGss => {
FeStartupPacket::GssEncRequest => {
info!("GSS requested");
self.write_message(&BeMessage::EncryptionResponse(false))?;
}
StartupRequestCode::Normal => {
FeStartupPacket::StartupMessage { .. } => {
if have_tls && !matches!(self.state, ProtoState::Encrypted) {
self.write_message(&BeMessage::ErrorResponse(
"must connect with TLS".to_string(),
@@ -387,7 +385,7 @@ impl PostgresBackend {
}
}
}
StartupRequestCode::Cancel => {
FeStartupPacket::CancelRequest { .. } => {
return Ok(ProcessMsgResult::Break);
}
}