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}