(&self)
| 237 | } |
| 238 | |
| 239 | fn hook_curl_multi_exec(&self) -> (Box<BeforeExecuteHook>, Box<AfterExecuteHook>) { |
| 240 | ( |
| 241 | Box::new(|request_id, execute_data| { |
| 242 | validate_num_args(execute_data, 1)?; |
| 243 | |
| 244 | let multi_id = Self::get_resource_id(execute_data)?; |
| 245 | |
| 246 | let is_exec = CURL_MULTI_INFO_MAP.with(|map| { |
| 247 | let mut map = map.borrow_mut(); |
| 248 | let Some(multi_info) = map.get_mut(&multi_id) else { |
| 249 | debug!(multi_id, "curl multi info is missing, maybe hasn't handles"); |
| 250 | return Ok(false); |
| 251 | }; |
| 252 | |
| 253 | debug!(multi_id, "curl multi handles count: {}", multi_info.curl_handles.len()); |
| 254 | if multi_info.curl_handles.is_empty() { |
| 255 | return Ok(false); |
| 256 | } |
| 257 | if multi_info.exec_spans.is_some() { |
| 258 | return Ok(true); |
| 259 | } |
| 260 | |
| 261 | let mut curl_infos = Vec::with_capacity(multi_info.curl_handles.len()); |
| 262 | for (cid, ch) in &multi_info.curl_handles { |
| 263 | curl_infos.push( (*cid, ch.clone(), Self::get_curl_info(*cid, ch.clone())?)); |
| 264 | } |
| 265 | curl_infos.sort_by(|(_, _, i1), (_, _, i2)| i2.raw_url.cmp(&i1.raw_url)); |
| 266 | |
| 267 | let mut exec_spans = Vec::with_capacity(curl_infos.len()); |
| 268 | for (cid, ch, info) in curl_infos { |
| 269 | let span = Self::create_exit_span(request_id, &info)?; |
| 270 | if info.is_http { |
| 271 | Self::inject_sw_header(request_id, ch, &info)?; |
| 272 | } |
| 273 | let span = span.prepare_for_async(); |
| 274 | |
| 275 | debug!(multi_id, operation_name = ?&span.span_object().operation_name, "create exit span"); |
| 276 | exec_spans.push((cid, span)); |
| 277 | } |
| 278 | |
| 279 | multi_info.exec_spans = Some(exec_spans); |
| 280 | |
| 281 | Ok::<_, crate::Error>(true) |
| 282 | })?; |
| 283 | |
| 284 | Ok(Box::new(is_exec)) |
| 285 | }), |
| 286 | Box::new(move |_, is_exec, execute_data, return_value| { |
| 287 | let is_exec = is_exec.downcast::<bool>().unwrap(); |
| 288 | if !*is_exec { |
| 289 | return Ok(()); |
| 290 | } |
| 291 | |
| 292 | if return_value.as_long() != Some(CURLM_OK) { |
| 293 | return Ok(()); |
| 294 | } |
| 295 | |
| 296 | let still_running = execute_data.get_parameter(1); |
no test coverage detected