spider_lib/
request.rs

1use bytes::Bytes;
2use reqwest::header::HeaderMap;
3use reqwest::{Method, Url};
4use std::collections::HashMap;
5use serde_json;
6
7use crate::error::SpiderError;
8
9#[derive(Debug, Clone)]
10pub struct Request {
11    pub url: Url,
12    pub method: Method,
13    pub headers: HeaderMap,
14    pub body: Option<Bytes>,
15    pub callback_name: String,
16    pub spider_name: String,
17    pub meta: HashMap<String, serde_json::Value>,
18}
19
20impl Request {
21    pub fn new(url: Url, spider_name: &str, callback_name: &str) -> Self {
22        Request {
23            url,
24            method: Method::GET,
25            headers: HeaderMap::new(),
26            body: None,
27            spider_name: spider_name.to_string(),
28            callback_name: callback_name.to_string(),
29            meta: HashMap::new(),
30        }
31    }
32
33    pub fn with_method(mut self, method: Method) -> Self {
34        self.method = method;
35        self
36    }
37
38    pub fn with_header(mut self, name: &str, value: &str) -> Result<Self, SpiderError> {
39        let header_name = reqwest::header::HeaderName::from_bytes(name.as_bytes())
40            .map_err(|e| SpiderError::HeaderValueError(format!("Invalid header name '{}': {}", name, e)))?;
41        let header_value = reqwest::header::HeaderValue::from_str(value)
42            .map_err(|e| SpiderError::HeaderValueError(format!("Invalid header value '{}': {}", value, e)))?;
43
44        self.headers.insert(header_name, header_value);
45        Ok(self)
46    }
47
48    pub fn with_body(mut self, body: Bytes) -> Self {
49        self.body = Some(body);
50        self
51    }
52
53    pub fn with_meta(mut self, key: String, value: serde_json::Value) -> Self {
54        self.meta.insert(key, value);
55        self
56    }
57}