From 726bb2703d191bbfb90e25e115ea7502df04b93b Mon Sep 17 00:00:00 2001 From: Sanskar Soni Date: Sat, 15 Aug 2026 11:41:12 +0530 Subject: [PATCH 1/2] fix(wasm): check HTTP status before deserializing response body --- wasm-wrappers/fdw/cal_fdw/src/lib.rs | 6 +++--- wasm-wrappers/fdw/calendly_fdw/src/lib.rs | 6 +++--- wasm-wrappers/fdw/cfd1_fdw/src/lib.rs | 6 +++--- wasm-wrappers/fdw/notion_fdw/src/lib.rs | 23 ++++++++++++--------- wasm-wrappers/fdw/paddle_fdw/src/lib.rs | 24 +++++++++++++--------- wasm-wrappers/fdw/snowflake_fdw/src/lib.rs | 6 +++++- 6 files changed, 41 insertions(+), 30 deletions(-) diff --git a/wasm-wrappers/fdw/cal_fdw/src/lib.rs b/wasm-wrappers/fdw/cal_fdw/src/lib.rs index 790ebe922..02c8f0fdb 100644 --- a/wasm-wrappers/fdw/cal_fdw/src/lib.rs +++ b/wasm-wrappers/fdw/cal_fdw/src/lib.rs @@ -158,13 +158,13 @@ impl CalFdw { } } + // check for errors + http::error_for_status(&resp).map_err(|err| format!("{}: {}", err, resp.body))?; + // transform response to json let resp_json: JsonValue = serde_json::from_str(&resp.body).map_err(|e| e.to_string())?; - // check for errors - http::error_for_status(&resp).map_err(|err| format!("{}: {}", err, resp.body))?; - // unify response object to array and save source rows let resp_data = resp_json .pointer("/data") diff --git a/wasm-wrappers/fdw/calendly_fdw/src/lib.rs b/wasm-wrappers/fdw/calendly_fdw/src/lib.rs index 7277f6bbb..c170c734d 100644 --- a/wasm-wrappers/fdw/calendly_fdw/src/lib.rs +++ b/wasm-wrappers/fdw/calendly_fdw/src/lib.rs @@ -150,13 +150,13 @@ impl CalendlyFdw { } } + // check for errors + http::error_for_status(&resp).map_err(|err| format!("{}: {}", err, resp.body))?; + // transform response to json let resp_json: JsonValue = serde_json::from_str(&resp.body).map_err(|e| e.to_string())?; - // check for errors - http::error_for_status(&resp).map_err(|err| format!("{}: {}", err, resp.body))?; - // unify response object to array and save source rows let resp_data = if resp_json.pointer("/collection").is_some() { resp_json diff --git a/wasm-wrappers/fdw/cfd1_fdw/src/lib.rs b/wasm-wrappers/fdw/cfd1_fdw/src/lib.rs index 9ab737b87..4eab2a710 100644 --- a/wasm-wrappers/fdw/cfd1_fdw/src/lib.rs +++ b/wasm-wrappers/fdw/cfd1_fdw/src/lib.rs @@ -226,13 +226,13 @@ impl Cfd1Fdw { continue; } + // check for HTTP errors + http::error_for_status(&resp).map_err(|err| format!("{}: {}", err, resp.body))?; + // transform response to json let resp_json: JsonValue = serde_json::from_str(&resp.body).map_err(|e| e.to_string())?; - // check for HTTP errors - http::error_for_status(&resp).map_err(|err| format!("{}: {}", err, resp.body))?; - // check for API request errors if let Some(success) = resp_json["success"].as_bool() { if !success { diff --git a/wasm-wrappers/fdw/notion_fdw/src/lib.rs b/wasm-wrappers/fdw/notion_fdw/src/lib.rs index fe893c985..2169c06c1 100644 --- a/wasm-wrappers/fdw/notion_fdw/src/lib.rs +++ b/wasm-wrappers/fdw/notion_fdw/src/lib.rs @@ -245,20 +245,23 @@ impl NotionFdw { } } + // check for errors + if resp.status_code == 404 { + // if the 404 is caused by no object found, we shouldn't take it as an error + if let Ok(resp_json) = serde_json::from_str::(&resp.body) { + if resp_json.pointer("/code").and_then(|v| v.as_str()) + == Some("object_not_found") + { + break; + } + } + } + http::error_for_status(&resp).map_err(|err| format!("{}: {}", err, resp.body))?; + // transform response to json let resp_json: JsonValue = serde_json::from_str(&resp.body).map_err(|e| e.to_string())?; - // if the 404 is caused by no object found, we shouldn't take it as an error - if resp.status_code == 404 - && resp_json.pointer("/code").and_then(|v| v.as_str()) == Some("object_not_found") - { - break; - } - - // check for errors - http::error_for_status(&resp).map_err(|err| format!("{}: {}", err, resp.body))?; - // unify response object to array and save source rows let resp_data = if resp_json.pointer("/object").and_then(|v| v.as_str()) == Some("list") { diff --git a/wasm-wrappers/fdw/paddle_fdw/src/lib.rs b/wasm-wrappers/fdw/paddle_fdw/src/lib.rs index 8e49dcbd9..ea96d1385 100644 --- a/wasm-wrappers/fdw/paddle_fdw/src/lib.rs +++ b/wasm-wrappers/fdw/paddle_fdw/src/lib.rs @@ -1,6 +1,6 @@ #[allow(warnings)] mod bindings; -use serde_json::{Map as JsonMap, Value as JsonValue, json}; +use serde_json::{json, Map as JsonMap, Value as JsonValue}; use bindings::{ exports::supabase::wrappers::routines::Guest, @@ -295,19 +295,23 @@ impl PaddleFdw { body: String::default(), }; let resp = http::get(&req)?; - let resp_json: JsonValue = serde_json::from_str(&resp.body).map_err(|e| e.to_string())?; - // if the 404 is caused by no object found, we shouldn't take it as an error - if resp.status_code == 404 && resp_json.pointer("/error/code") == Some(&json!("not_found")) - { - self.src_rows = Vec::default(); - self.src_idx = 0; - self.url = None; - return Ok(()); + // check for errors + if resp.status_code == 404 { + // if the 404 is caused by no object found, we shouldn't take it as an error + if let Ok(resp_json) = serde_json::from_str::(&resp.body) { + if resp_json.pointer("/error/code") == Some(&json!("not_found")) { + self.src_rows = Vec::default(); + self.src_idx = 0; + self.url = None; + return Ok(()); + } + } } - http::error_for_status(&resp).map_err(|err| format!("{}: {}", err, resp.body))?; + let resp_json: JsonValue = serde_json::from_str(&resp.body).map_err(|e| e.to_string())?; + // save source rows self.src_rows = resp_json .as_object() diff --git a/wasm-wrappers/fdw/snowflake_fdw/src/lib.rs b/wasm-wrappers/fdw/snowflake_fdw/src/lib.rs index 44fa56b34..047b7a304 100644 --- a/wasm-wrappers/fdw/snowflake_fdw/src/lib.rs +++ b/wasm-wrappers/fdw/snowflake_fdw/src/lib.rs @@ -61,6 +61,10 @@ impl SnowflakeFdw { http::Method::Post => http::post(&req), _ => unreachable!(), }?; + + // Check for errors + http::error_for_status(&resp).map_err(|err| format!("{}: {}", err, resp.body))?; + let json_value = serde_json::from_str(&resp.body).map_err(|e| e.to_string())?; stats::inc_stats(FDW_NAME, stats::Metric::BytesIn, resp.body.len() as i64); @@ -213,7 +217,7 @@ impl SnowflakeFdw { // polling query result loop { - http::error_for_status(&resp)?; + http::error_for_status(&resp).map_err(|err| format!("{}: {}", err, resp.body))?; // make sure response status code is 200 or 202 only if resp.status_code != 200 && resp.status_code != 202 { From 2f17b56b25c55b5d6ff8ec1d330020f77c63ce54 Mon Sep 17 00:00:00 2001 From: Sanskar Soni Date: Tue, 18 Aug 2026 08:10:52 +0530 Subject: [PATCH 2/2] style: format code with cargo fmt --- wasm-wrappers/fdw/paddle_fdw/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wasm-wrappers/fdw/paddle_fdw/src/lib.rs b/wasm-wrappers/fdw/paddle_fdw/src/lib.rs index ea96d1385..ff38c09e9 100644 --- a/wasm-wrappers/fdw/paddle_fdw/src/lib.rs +++ b/wasm-wrappers/fdw/paddle_fdw/src/lib.rs @@ -1,6 +1,6 @@ #[allow(warnings)] mod bindings; -use serde_json::{json, Map as JsonMap, Value as JsonValue}; +use serde_json::{Map as JsonMap, Value as JsonValue, json}; use bindings::{ exports::supabase::wrappers::routines::Guest,