MCPcopy Create free account
hub / github.com/apache/skywalking-php / hook_curl_multi_exec

Method hook_curl_multi_exec

src/plugin/plugin_curl.rs:239–335  ·  view source on GitHub ↗
(&self)

Source from the content-addressed store, hash-verified

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);

Callers 1

hookMethod · 0.80

Calls 2

validate_num_argsFunction · 0.85
create_exit_spanFunction · 0.70

Tested by

no test coverage detected