#[non_exhaustive]pub struct DataResponse {
pub success: bool,
pub data: Option<Vec<SqlmapDataChunk>>,
pub error: Option<Vec<String>>,
pub message: Option<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.
message: Option<String>Error or informational message when success is false.
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 are sqlmapapi TECHNIQUES payloads: each value entry is an
injection point with a nested data[] of {title|technique, payload}.
Flat legacy objects with top-level type/payload are still accepted.
Examples found in repository?
examples/full_scan.rs (line 76)
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().nth(1).unwrap_or_else(|| {
31 eprintln!("Usage: cargo run --example full_scan -- <target-url>");
32 eprintln!("Example: cargo run --example full_scan -- http://example.com/page?id=1");
33 std::process::exit(1);
34 });
35
36 println!("Target: {target}");
37
38 let opts = SqlmapOptions::builder()
39 .url(&target)
40 .level(3)
41 .risk(2)
42 .batch(true)
43 .threads(4)
44 .random_agent(true)
45 .build();
46
47 // ── 4. Create and run task ───────────────────────────
48 let task = engine.create_task(&opts).await?;
49 println!("Task created: {}", task.task_id());
50
51 task.start().await?;
52 println!("Scan started, polling for completion...");
53
54 // ── 5. Monitor execution ─────────────────────────────
55 task.wait_for_completion(300).await?;
56 println!("Scan complete!");
57
58 // ── 6. Fetch and display logs ────────────────────────
59 match task.fetch_log().await {
60 Ok(log_resp) => {
61 if let Some(logs) = &log_resp.log {
62 println!("\n=== Scan Log ({} entries) ===", logs.len());
63 for entry in logs.iter().rev().take(10) {
64 println!(" [{}] {}: {}", entry.time, entry.level, entry.message);
65 }
66 if logs.len() > 10 {
67 println!(" ... and {} more entries", logs.len() - 10);
68 }
69 }
70 }
71 Err(err) => eprintln!("Could not fetch log: {err}"),
72 }
73
74 // ── 7. Fetch results ─────────────────────────────────
75 let data = task.fetch_data().await?;
76 let findings = data.findings();
77
78 println!("\n=== Results ===");
79 println!(" Findings: {}", findings.len());
80
81 if findings.is_empty() {
82 println!(" No SQL injection vulnerabilities detected.");
83 } else {
84 // ── 8. Multi-format output ───────────────────────
85 println!("\n{}", sqlmap_rs::types::format_findings(&findings, OutputFormat::Plain));
86
87 println!("=== JSON ===");
88 println!("{}", sqlmap_rs::types::format_findings(&findings, OutputFormat::JsonPretty));
89
90 println!("=== CSV ===");
91 println!("{}", sqlmap_rs::types::format_findings(&findings, OutputFormat::Csv));
92
93 println!("=== Markdown ===");
94 println!("{}", sqlmap_rs::types::format_findings(&findings, OutputFormat::Markdown));
95 }
96
97 // ── 9. Inspect configured options ────────────────────
98 match task.list_options().await {
99 Ok(options) => {
100 println!("\n=== Active Options ===");
101 println!("{}", serde_json::to_string_pretty(&options)?);
102 }
103 Err(err) => eprintln!("Could not fetch options: {err}"),
104 }
105
106 // Task is auto-deleted from daemon on drop.
107 // Engine daemon is auto-killed on drop.
108 println!("\nDone. Task and daemon will be cleaned up automatically.");
109
110 Ok(())
111}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 (const: unstable) · 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