#[non_exhaustive]pub struct DataResponse {
pub success: bool,
pub data: Option<Vec<SqlmapDataChunk>>,
pub error: Option<Vec<String>>,
}Expand description
Final payload block returning all gathered data for a task.
Fields (Non-exhaustive)§
This struct is marked as non-exhaustive
Non-exhaustive structs could have additional fields added in future. Therefore, non-exhaustive structs cannot be constructed in external crates using the traditional
Struct { .. } syntax; cannot be matched against without a wildcard ..; and struct update syntax will not work.success: boolTrue if fetch succeeded.
data: Option<Vec<SqlmapDataChunk>>The aggregated data chunks representing injection results.
error: Option<Vec<String>>Array of structured errors from the engine.
Implementations§
Source§impl DataResponse
impl DataResponse
Sourcepub fn findings(&self) -> Vec<SqlmapFinding>
pub fn findings(&self) -> Vec<SqlmapFinding>
Extract structured findings from the raw data chunks.
Type 1 chunks contain vulnerability data. This parses them into
SqlmapFinding structs with parameter, type, payload, and details.
Examples found in repository?
examples/full_scan.rs (line 74)
13async fn main() -> Result<(), Box<dyn std::error::Error>> {
14 // ── 1. Check availability ────────────────────────────
15 if !SqlmapEngine::is_available() {
16 eprintln!("ERROR: sqlmapapi not found in PATH");
17 eprintln!("Quick fix:");
18 eprintln!(" conda env create -f environment.yml");
19 eprintln!(" conda activate sqlmap-env");
20 eprintln!(" # OR: ./setup.sh");
21 std::process::exit(1);
22 }
23
24 // ── 2. Boot the daemon ───────────────────────────────
25 println!("Booting sqlmapapi daemon on port 8775...");
26 let engine = SqlmapEngine::new(8775, true, None).await?;
27 println!("Daemon ready at {}", engine.api_url());
28
29 // ── 3. Configure scan with builder ───────────────────
30 let target = std::env::args()
31 .nth(1)
32 .unwrap_or_else(|| "http://testphp.vulnweb.com/listproducts.php?cat=1".to_string());
33
34 println!("Target: {target}");
35
36 let opts = SqlmapOptions::builder()
37 .url(&target)
38 .level(3)
39 .risk(2)
40 .batch(true)
41 .threads(4)
42 .random_agent(true)
43 .build();
44
45 // ── 4. Create and run task ───────────────────────────
46 let task = engine.create_task(&opts).await?;
47 println!("Task created: {}", task.task_id());
48
49 task.start().await?;
50 println!("Scan started, polling for completion...");
51
52 // ── 5. Monitor execution ─────────────────────────────
53 task.wait_for_completion(300).await?;
54 println!("Scan complete!");
55
56 // ── 6. Fetch and display logs ────────────────────────
57 match task.fetch_log().await {
58 Ok(log_resp) => {
59 if let Some(logs) = &log_resp.log {
60 println!("\n=== Scan Log ({} entries) ===", logs.len());
61 for entry in logs.iter().rev().take(10) {
62 println!(" [{}] {}: {}", entry.time, entry.level, entry.message);
63 }
64 if logs.len() > 10 {
65 println!(" ... and {} more entries", logs.len() - 10);
66 }
67 }
68 }
69 Err(err) => eprintln!("Could not fetch log: {err}"),
70 }
71
72 // ── 7. Fetch results ─────────────────────────────────
73 let data = task.fetch_data().await?;
74 let findings = data.findings();
75
76 println!("\n=== Results ===");
77 println!(" Findings: {}", findings.len());
78
79 if findings.is_empty() {
80 println!(" No SQL injection vulnerabilities detected.");
81 } else {
82 // ── 8. Multi-format output ───────────────────────
83 println!("\n{}", sqlmap_rs::types::format_findings(&findings, OutputFormat::Plain));
84
85 println!("=== JSON ===");
86 println!("{}", sqlmap_rs::types::format_findings(&findings, OutputFormat::JsonPretty));
87
88 println!("=== CSV ===");
89 println!("{}", sqlmap_rs::types::format_findings(&findings, OutputFormat::Csv));
90
91 println!("=== Markdown ===");
92 println!("{}", sqlmap_rs::types::format_findings(&findings, OutputFormat::Markdown));
93 }
94
95 // ── 9. Inspect configured options ────────────────────
96 match task.list_options().await {
97 Ok(options) => {
98 println!("\n=== Active Options ===");
99 println!("{}", serde_json::to_string_pretty(&options)?);
100 }
101 Err(err) => eprintln!("Could not fetch options: {err}"),
102 }
103
104 // Task is auto-deleted from daemon on drop.
105 // Engine daemon is auto-killed on drop.
106 println!("\nDone. Task and daemon will be cleaned up automatically.");
107
108 Ok(())
109}Trait Implementations§
Source§impl Clone for DataResponse
impl Clone for DataResponse
Source§fn clone(&self) -> DataResponse
fn clone(&self) -> DataResponse
Returns a duplicate of the value. Read more
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from
source. Read moreSource§impl Debug for DataResponse
impl Debug for DataResponse
Source§impl<'de> Deserialize<'de> for DataResponse
impl<'de> Deserialize<'de> for DataResponse
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Deserialize this value from the given Serde deserializer. Read more
Auto Trait Implementations§
impl Freeze for DataResponse
impl RefUnwindSafe for DataResponse
impl Send for DataResponse
impl Sync for DataResponse
impl Unpin for DataResponse
impl UnsafeUnpin for DataResponse
impl UnwindSafe for DataResponse
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more