Skip to content

Commit 0f68ea7

Browse files
committed
feat: skip sending pending payload if URL doesnt match
1 parent 11912b6 commit 0f68ea7

File tree

1 file changed

+61
-6
lines changed

1 file changed

+61
-6
lines changed

testnet/stacks-node/src/event_dispatcher.rs

Lines changed: 61 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -425,7 +425,7 @@ impl EventObserver {
425425
Ok(())
426426
}
427427

428-
fn process_pending_payloads(conn: &Connection) {
428+
fn process_pending_payloads(&self, conn: &Connection) {
429429
let pending_payloads = match Self::get_pending_payloads(conn) {
430430
Ok(payloads) => payloads,
431431
Err(e) => {
@@ -438,6 +438,10 @@ impl EventObserver {
438438
};
439439

440440
for (id, url, payload, timeout_ms) in pending_payloads {
441+
// If the URL is not the same as the endpoint, skip it
442+
if !url.starts_with(&self.endpoint) {
443+
continue;
444+
}
441445
let timeout = Duration::from_millis(timeout_ms);
442446
Self::send_payload_directly(&payload, &url, timeout);
443447

@@ -563,7 +567,7 @@ impl EventObserver {
563567
Self::insert_payload_with_retry(&conn, &full_url, payload, self.timeout);
564568

565569
// Process all pending payloads
566-
Self::process_pending_payloads(&conn);
570+
self.process_pending_payloads(&conn);
567571
} else {
568572
// No database, just send the payload
569573
Self::send_payload_directly(payload, &full_url, self.timeout);
@@ -2042,16 +2046,19 @@ mod test {
20422046
use mockito::Matcher;
20432047

20442048
let dir = tempdir().unwrap();
2045-
let db_path = dir.path().join("test_process_payloads.sqlite");
2049+
let db_path = dir.path().join("event_observers.sqlite");
20462050
let db_path_str = db_path.to_str().unwrap();
2051+
let mut server = mockito::Server::new();
2052+
let endpoint = server.url().to_string();
2053+
let timeout = Duration::from_secs(5);
2054+
let observer =
2055+
EventObserver::new(Some(dir.path().to_path_buf()), endpoint.clone(), timeout);
20472056

20482057
let conn = EventObserver::init_db(db_path_str).expect("Failed to initialize the database");
20492058

20502059
let payload = json!({"key": "value"});
20512060
let timeout = Duration::from_secs(5);
20522061

2053-
// Create a mock server
2054-
let mut server = mockito::Server::new();
20552062
let _m = server
20562063
.mock("POST", "/api")
20572064
.match_header("content-type", Matcher::Regex("application/json.*".into()))
@@ -2068,7 +2075,7 @@ mod test {
20682075
.expect("Failed to insert payload");
20692076

20702077
// Process pending payloads
2071-
EventObserver::process_pending_payloads(&conn);
2078+
observer.process_pending_payloads(&conn);
20722079

20732080
// Verify that the pending payloads list is empty
20742081
let pending_payloads =
@@ -2079,6 +2086,54 @@ mod test {
20792086
_m.assert();
20802087
}
20812088

2089+
#[test]
2090+
fn pending_payloads_are_skipped_if_url_does_not_match() {
2091+
let dir = tempdir().unwrap();
2092+
let db_path = dir.path().join("event_observers.sqlite");
2093+
let db_path_str = db_path.to_str().unwrap();
2094+
2095+
let mut server = mockito::Server::new();
2096+
let endpoint = server.url().to_string();
2097+
let timeout = Duration::from_secs(5);
2098+
let observer =
2099+
EventObserver::new(Some(dir.path().to_path_buf()), endpoint.clone(), timeout);
2100+
2101+
let conn = EventObserver::init_db(db_path_str).expect("Failed to initialize the database");
2102+
2103+
let payload = json!({"key": "value"});
2104+
let timeout = Duration::from_secs(5);
2105+
2106+
let mock = server
2107+
.mock("POST", "/api")
2108+
.match_header(
2109+
"content-type",
2110+
mockito::Matcher::Regex("application/json.*".into()),
2111+
)
2112+
.match_body(mockito::Matcher::Json(payload.clone()))
2113+
.with_status(200)
2114+
.expect(0) // Expect 0 calls to this endpoint
2115+
.create();
2116+
2117+
// Use a different URL than the observer's endpoint
2118+
let url = "http://different-domain.com/api";
2119+
2120+
EventObserver::insert_payload(&conn, url, &payload, timeout)
2121+
.expect("Failed to insert payload");
2122+
2123+
observer.process_pending_payloads(&conn);
2124+
2125+
let pending_payloads =
2126+
EventObserver::get_pending_payloads(&conn).expect("Failed to get pending payloads");
2127+
// Verify that the pending payload is still in the database
2128+
assert_eq!(
2129+
pending_payloads.len(),
2130+
1,
2131+
"Expected payload to remain in database since URL didn't match"
2132+
);
2133+
2134+
mock.assert();
2135+
}
2136+
20822137
#[test]
20832138
fn test_new_event_observer_with_db() {
20842139
let dir = tempdir().unwrap();

0 commit comments

Comments
 (0)