(
build_id: &str,
view: &BinaryView,
)
| 422 | } |
| 423 | |
| 424 | pub(crate) fn download_debug_info( |
| 425 | build_id: &str, |
| 426 | view: &BinaryView, |
| 427 | ) -> Result<Ref<BinaryView>, String> { |
| 428 | let mut settings_query_opts = QueryOptions::new_with_view(view); |
| 429 | let settings = Settings::new(); |
| 430 | let debug_server_urls = |
| 431 | settings.get_string_list_with_opts("network.debuginfodServers", &mut settings_query_opts); |
| 432 | |
| 433 | for debug_server_url in debug_server_urls.iter() { |
| 434 | let artifact_url = format!("{}/buildid/{}/debuginfo", debug_server_url, build_id); |
| 435 | |
| 436 | // Download from remote |
| 437 | let (tx, rx) = mpsc::channel(); |
| 438 | let write = move |data: &[u8]| -> usize { |
| 439 | if tx.send(Vec::from(data)).is_ok() { |
| 440 | data.len() |
| 441 | } else { |
| 442 | 0 |
| 443 | } |
| 444 | }; |
| 445 | |
| 446 | let dp = DownloadProvider::try_default().map_err(|_| "No default download provider")?; |
| 447 | let mut inst = dp |
| 448 | .create_instance() |
| 449 | .map_err(|_| "Couldn't create download instance")?; |
| 450 | let result = inst |
| 451 | .perform_custom_request( |
| 452 | "GET", |
| 453 | artifact_url, |
| 454 | HashMap::<String, String>::new(), |
| 455 | DownloadInstanceInputOutputCallbacks { |
| 456 | read: None, |
| 457 | write: Some(Box::new(write)), |
| 458 | progress: None, |
| 459 | }, |
| 460 | ) |
| 461 | .map_err(|e| e.to_string())?; |
| 462 | if result.status_code != 200 { |
| 463 | continue; |
| 464 | } |
| 465 | |
| 466 | let mut expected_length = None; |
| 467 | for (k, v) in result.headers.iter() { |
| 468 | if k.to_lowercase() == "content-length" { |
| 469 | expected_length = Some(usize::from_str(v).map_err(|e| e.to_string())?); |
| 470 | } |
| 471 | } |
| 472 | |
| 473 | let mut data = vec![]; |
| 474 | while let Ok(packet) = rx.try_recv() { |
| 475 | data.extend(packet.into_iter()); |
| 476 | } |
| 477 | |
| 478 | if let Some(length) = expected_length { |
| 479 | if data.len() != length { |
| 480 | return Err(format!( |
| 481 | "Bad length: expected {} got {}", |
no test coverage detected