diff --git a/src/standard.rs b/src/standard.rs index fd4a2436a..a4f9d550d 100644 --- a/src/standard.rs +++ b/src/standard.rs @@ -914,7 +914,9 @@ impl Redfish for RedfishStandard { }) } - // This function appends ?$expand=.($levels=1) to the URL, as defined by Redfish spec, to expand first level URIs. + // Request server-side expansion of first-level Members via $expand (OPTIONAL + // per DSP0266 ยง6.3). If the server declines, Members come back as shallow + // `@odata.id` refs; dereference each so callers see fully-populated resources. fn get_collection<'a>( &'a self, id: ODataId, @@ -924,8 +926,36 @@ impl Redfish for RedfishStandard { "{}?$expand=.($levels=1)", id.odata_id.replace(&format!("/{REDFISH_ENDPOINT}/"), "") ); - let (_, body): (_, HashMap) = + let (_, mut body): (_, HashMap) = self.client.get(url.as_str()).await?; + + if let Some(serde_json::Value::Array(members)) = body.get_mut("Members") { + for member in members.iter_mut() { + let shallow_odata_id = member.as_object().and_then(|obj| { + let only_odata_keys = + !obj.is_empty() && obj.keys().all(|k| k.starts_with("@odata.")); + if !only_odata_keys { + return None; + } + obj.get("@odata.id") + .and_then(serde_json::Value::as_str) + .map(str::to_owned) + }); + let Some(odata_id) = shallow_odata_id else { + continue; + }; + let member_url = odata_id.replace(&format!("/{REDFISH_ENDPOINT}/"), ""); + match self + .client + .get::(member_url.as_str()) + .await + { + Ok((_, expanded)) => *member = expanded, + Err(e) => debug!("Failed to dereference shallow Member {member_url}: {e}"), + } + } + } + Ok(Collection { url: url.clone(), body,