sa_token_plugin_tide/
adapter.rs

1// Author: 金书记
2//
3// 中文 | English
4// Tide 请求/响应适配器 | Tide request/response adapter
5
6use tide::{Request, Response, StatusCode};
7use sa_token_adapter::{SaRequest, SaResponse, CookieOptions, build_cookie_string};
8use serde::Serialize;
9
10/// 中文 | English
11/// Tide 请求适配器 | Tide request adapter
12pub struct TideRequestAdapter<'a, State> {
13    request: &'a Request<State>,
14}
15
16impl<'a, State> TideRequestAdapter<'a, State> {
17    /// 中文 | English
18    /// 创建新的请求适配器 | Create a new request adapter
19    pub fn new(request: &'a Request<State>) -> Self {
20        Self { request }
21    }
22}
23
24impl<'a, State> SaRequest for TideRequestAdapter<'a, State> {
25    fn get_header(&self, name: &str) -> Option<String> {
26        self.request
27            .header(name)
28            .and_then(|v| v.as_str().parse().ok())
29    }
30    
31    fn get_cookie(&self, name: &str) -> Option<String> {
32        // 先尝试使用 cookie 方法 | First try using cookie method
33        if let Some(cookie) = self.request.cookie(name) {
34            return Some(cookie.value().to_string());
35        }
36        
37        // 如果没有找到,手动解析 Cookie 头 | If not found, manually parse Cookie header
38        if let Some(cookie_header) = self.request.header("cookie") {
39            if let Some(cookie_str) = cookie_header.get(0) {
40                let cookies = sa_token_adapter::utils::parse_cookies(cookie_str.as_str());
41                if let Some(value) = cookies.get(name) {
42                    return Some(value.to_string());
43                }
44            }
45        }
46        
47        None
48    }
49    
50    fn get_param(&self, name: &str) -> Option<String> {
51        // 先尝试使用 query_pairs 方法 | First try using query_pairs method
52        if let Some((_, value)) = self.request.url().query_pairs()
53            .find(|(k, _)| k == name) {
54            return Some(value.to_string());
55        }
56        
57        // 如果没有找到,手动解析查询字符串 | If not found, manually parse query string
58        if let Some(query) = self.request.url().query() {
59            let params = sa_token_adapter::utils::parse_query_string(query);
60            if let Some(value) = params.get(name) {
61                return Some(value.to_string());
62            }
63        }
64        
65        None
66    }
67    
68    fn get_path(&self) -> String {
69        self.request.url().path().to_string()
70    }
71    
72    fn get_method(&self) -> String {
73        self.request.method().to_string()
74    }
75}
76
77/// 中文 | English
78/// Tide 响应适配器 | Tide response adapter
79pub struct TideResponseAdapter {
80    response: Response,
81}
82
83impl TideResponseAdapter {
84    /// 中文 | English
85    /// 创建新的响应适配器 | Create a new response adapter
86    pub fn new(response: Response) -> Self {
87        Self { response }
88    }
89    
90    /// 中文 | English
91    /// 获取内部响应对象 | Get inner response object
92    pub fn into_response(self) -> Response {
93        self.response
94    }
95}
96
97impl SaResponse for TideResponseAdapter {
98    fn set_header(&mut self, name: &str, value: &str) {
99        self.response.insert_header(name, value);
100    }
101    
102    fn set_cookie(&mut self, name: &str, value: &str, options: CookieOptions) {
103        let cookie_string = build_cookie_string(name, value, options);
104        self.set_header("Set-Cookie", &cookie_string);
105    }
106    
107    fn set_status(&mut self, status: u16) {
108        // Tide 使用自己的 StatusCode 类型
109        let status_code = StatusCode::try_from(status).unwrap_or(StatusCode::Ok);
110        self.response.set_status(status_code);
111    }
112    
113    fn set_json_body<U: Serialize>(&mut self, body: U) -> Result<(), serde_json::Error> {
114        match serde_json::to_string(&body) {
115            Ok(json) => {
116                self.response.set_body(json);
117                self.response.set_content_type("application/json");
118                Ok(())
119            }
120            Err(e) => Err(e),
121        }
122    }
123}
124