Skip to content

Commit 2c7dc40

Browse files
committed
Move handle_incorrect_begin_string to inbound module
1 parent c493e5a commit 2c7dc40

3 files changed

Lines changed: 39 additions & 11 deletions

File tree

crates/hotfix/src/session.rs

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ use crate::message::sequence_reset::SequenceReset;
3434
use crate::message::test_request::TestRequest;
3535
use crate::message::verification_error::{CompIdType, MessageVerificationError};
3636
use crate::session::admin_request::AdminRequest;
37-
use crate::session::ctx::SessionCtx;
37+
use crate::session::ctx::{SessionCtx, TransitionResult};
3838
use crate::session::error::SessionCreationError;
3939
use crate::session::error::{InternalSendError, InternalSendResultExt, SessionOperationError};
4040
pub use crate::session::error::{SendError, SendOutcome};
@@ -604,7 +604,12 @@ where
604604
.await?;
605605
}
606606
MessageVerificationError::IncorrectBeginString(begin_string) => {
607-
self.handle_incorrect_begin_string(begin_string).await;
607+
if let Some(writer) = self.state.get_writer() {
608+
let result = inbound::handle_incorrect_begin_string(
609+
&mut self.ctx, writer, begin_string,
610+
).await;
611+
self.apply_transition(result);
612+
}
608613
}
609614
MessageVerificationError::IncorrectCompId {
610615
comp_id,
@@ -664,14 +669,6 @@ where
664669
Ok(())
665670
}
666671

667-
async fn handle_incorrect_begin_string(&mut self, received_begin_string: String) {
668-
self.state
669-
.logout_and_terminate(
670-
&mut self.ctx,
671-
&format!("beginString={received_begin_string} is not supported"),
672-
)
673-
.await;
674-
}
675672

676673
async fn handle_incorrect_comp_id(
677674
&mut self,
@@ -753,6 +750,12 @@ where
753750
Ok(())
754751
}
755752

753+
fn apply_transition(&mut self, result: TransitionResult) {
754+
if let TransitionResult::TransitionTo(new_state) = result {
755+
self.state = new_state;
756+
}
757+
}
758+
756759
fn reset_heartbeat_timer(&mut self) {
757760
self.state
758761
.reset_heartbeat_timer(self.ctx.config.heartbeat_interval);

crates/hotfix/src/session/ctx.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,14 @@ use crate::message::OutboundMessage;
77
use crate::message::generate_message;
88
use crate::message::parser::RawFixMessage;
99
use crate::session::error::InternalSendError;
10+
use crate::session::state::SessionState;
1011
use crate::store::StoreError;
1112

13+
pub(crate) enum TransitionResult {
14+
Stay,
15+
TransitionTo(SessionState),
16+
}
17+
1218
pub(crate) struct SessionCtx<A, S> {
1319
pub config: SessionConfig,
1420
pub store: S,

crates/hotfix/src/session/inbound.rs

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
1+
use crate::message::logout::Logout;
12
use crate::message::reject::Reject;
23
use crate::message::verification::verify_message;
34
use crate::message::verification_error::MessageVerificationError;
4-
use crate::session::ctx::SessionCtx;
5+
use crate::session::ctx::{SessionCtx, TransitionResult};
56
use crate::session::outbound;
7+
use crate::session::state::SessionState;
68
use crate::transport::writer::WriterRef;
9+
use tracing::warn;
710
use hotfix_message::Part;
811
use hotfix_message::message::Message;
912
use hotfix_message::session_fields::{MSG_SEQ_NUM, SessionRejectReason};
@@ -47,6 +50,22 @@ pub(crate) async fn handle_sending_time_accuracy_problem<A, S: MessageStore>(
4750
}
4851
}
4952

53+
pub(crate) async fn handle_incorrect_begin_string<A, S: MessageStore>(
54+
ctx: &mut SessionCtx<A, S>,
55+
writer: &WriterRef,
56+
received_begin_string: String,
57+
) -> TransitionResult {
58+
let logout = Logout::with_reason(format!(
59+
"beginString={received_begin_string} is not supported"
60+
));
61+
match ctx.prepare_message(logout).await {
62+
Ok(prepared) => writer.send_raw_message(prepared.raw).await,
63+
Err(err) => warn!("failed to send logout for incorrect begin string: {err}"),
64+
}
65+
writer.disconnect().await;
66+
TransitionResult::TransitionTo(SessionState::new_disconnected(true, "incorrect begin string"))
67+
}
68+
5069
pub(crate) async fn handle_invalid_msg_type<A, S: MessageStore>(
5170
ctx: &mut SessionCtx<A, S>,
5271
writer: &WriterRef,

0 commit comments

Comments
 (0)