adguardian/fetch/
fetch_query_log.rs1use reqwest::{
2 header::{HeaderValue, CONTENT_LENGTH, AUTHORIZATION},
3};
4use serde::Deserialize;
5
6#[derive(Deserialize)]
7pub struct QueryResponse {
8 pub data: Vec<Query>,
9}
10
11#[derive(Deserialize)]
12pub struct Query {
13 pub cached: bool,
14 pub client: String,
15 pub upstream: String,
16 #[serde(rename = "elapsedMs")]
17 pub elapsed_ms: String,
18 pub question: Question,
19 pub reason: String,
20 pub time: String,
21}
22
23#[derive(Deserialize)]
24pub struct Question {
25 pub class: String,
26 pub name: String,
27 #[serde(rename = "type")]
28 pub question_type: String,
29}
30
31pub async fn fetch_adguard_query_log(
32 client: &reqwest::Client,
33 endpoint: &str,
34 username: &str,
35 password: &str,
36) -> Result<QueryResponse, anyhow::Error> {
37 let auth_string = format!("{}:{}", username, password);
38 let auth_header_value = format!("Basic {}", base64::encode(&auth_string));
39 let mut headers = reqwest::header::HeaderMap::new();
40 headers.insert(AUTHORIZATION, auth_header_value.parse()?);
41 headers.insert(CONTENT_LENGTH, HeaderValue::from_static("0"));
42
43 let url = format!("{}/control/querylog", endpoint);
44 let response = client.get(&url).headers(headers).send().await?;
45 if !response.status().is_success() {
46 return Err(anyhow::anyhow!("Request failed with status code {}", response.status()));
47 }
48
49 let data = response.json().await?;
50 Ok(data)
51}
52