Skip to content

Commit 85e776a

Browse files
Merge pull request #3 from easybill/add-option-to-read-initial-response-from-network-connection
add option to read initial response in network connection check
2 parents a95b494 + a3f58f8 commit 85e776a

File tree

2 files changed

+39
-8
lines changed

2 files changed

+39
-8
lines changed

src/checks/network_connection_check.rs

Lines changed: 34 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,22 @@ use crate::status::status_checker::{StatusCheckResult, StatusChecker};
1111

1212
pub(crate) struct NetworkConnectionCheck {
1313
target_address: SocketAddr,
14+
read_initial_response: bool,
1415
}
1516

1617
#[async_trait]
1718
impl StatusChecker for NetworkConnectionCheck {
1819
fn from_options(options: &Options) -> anyhow::Result<Option<Self>> {
1920
match options.socket_check_addr.to_owned() {
2021
None => Ok(None),
21-
Some(target_address) => Ok(Some(Self { target_address })),
22+
Some(target_address) => {
23+
let read_initial_response =
24+
options.socket_check_read_initial_response.unwrap_or(false);
25+
Ok(Some(Self {
26+
target_address,
27+
read_initial_response,
28+
}))
29+
}
2230
}
2331
}
2432

@@ -47,6 +55,14 @@ impl StatusChecker for NetworkConnectionCheck {
4755
Ok(StatusCheckResult::new_failure(failure_reason))
4856
}
4957
Ok(mut tcp_stream) => {
58+
if self.read_initial_response {
59+
if let Some(result) =
60+
self.read_and_discard_response(&mut tcp_stream).await
61+
{
62+
return Ok(result);
63+
}
64+
}
65+
5066
// connection successful
5167
if let Err(err) = tcp_stream.write_all(b"QUIT\n").await {
5268
let failure_reason = format!(
@@ -57,13 +73,9 @@ impl StatusChecker for NetworkConnectionCheck {
5773
}
5874

5975
// receive & discard response from server
60-
let mut buffer = [0; 1024];
61-
if let Err(err) = tcp_stream.read(&mut buffer).await {
62-
let failure_reason = format!(
63-
"error receiving response from {}: {}",
64-
self.target_address, err
65-
);
66-
return Ok(StatusCheckResult::new_failure(failure_reason));
76+
if let Some(result) = self.read_and_discard_response(&mut tcp_stream).await
77+
{
78+
return Ok(result);
6779
}
6880

6981
// successful check
@@ -74,3 +86,17 @@ impl StatusChecker for NetworkConnectionCheck {
7486
}
7587
}
7688
}
89+
90+
impl NetworkConnectionCheck {
91+
async fn read_and_discard_response(
92+
&self,
93+
tcp_stream: &mut TcpStream,
94+
) -> Option<StatusCheckResult> {
95+
let mut buffer = [0; 1024];
96+
if let Err(err) = tcp_stream.read(&mut buffer).await {
97+
let failure_reason = format!("error receiving response: {}", err);
98+
return Some(StatusCheckResult::new_failure(failure_reason));
99+
}
100+
None
101+
}
102+
}

src/options.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,11 @@ pub(crate) struct Options {
3232
// check options for plain sockets
3333
#[arg(long = "socket-addr", env = "EASYCHECK_SOCKET_ADDR")]
3434
pub socket_check_addr: Option<SocketAddr>,
35+
#[arg(
36+
long = "read-initial-response",
37+
env = "EASYCHECK_READ_INITIAL_RESPONSE"
38+
)]
39+
pub socket_check_read_initial_response: Option<bool>,
3540
// check options for http checks
3641
#[arg(long = "http-url", env = "EASYCHECK_HTTP_URL")]
3742
pub http_check_url: Option<Uri>,

0 commit comments

Comments
 (0)