aboutsummaryrefslogtreecommitdiff
path: root/src/http_client.rs
blob: 6e06474d733f90bc97337b5b04c4efdf80216032 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
use anyhow::{Context, Result};
use reqwest::{Client, cookie::Jar};
use std::{collections::HashMap, fs, sync::Arc};

/// Reads the cookies.json file and builds an authenticated reqwest client.
pub fn build_authenticated_client(cookies_path: &str) -> Result<Client> {
    // Read the JSON file.
    let cookies_content = fs::read_to_string(cookies_path)
        .with_context(|| format!("Failed to read cookies file from: {}", cookies_path))?;

    // Parse the JSON into a Rust HashMap.
    let cookies_map: HashMap<String, String> = serde_json::from_str(&cookies_content)
        .context("Failed to parse cookies file. Ensure it is a flat key-value JSON object.")?;

    // Create a Cookie Jar.
    let jar = Arc::new(Jar::default());
    // `reqwest` needs a URL to associate the cookies with.
    let url = "https://learning.oreilly.com".parse::<reqwest::Url>()?;
    for (key, value) in cookies_map {
        // `reqwest` expects cookies in the standard "key=value" string format.
        let cookie_str = format!("{}={}", key, value);
        jar.add_cookie_str(&cookie_str, &url);
    }

    // Build the client with the cookie provider and a standard User-Agent.
    let client = Client::builder()
        .cookie_provider(Arc::clone(&jar))
        .user_agent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36")
        .build()
        .context("Failed to build the HTTP client")?;

    Ok(client)
}