adguardian/fetch/
fetch_query_log.rs

1use 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