libsubconverter/parser/explodes/
http.rs

1use crate::models::{Proxy, HTTP_DEFAULT_GROUP};
2use crate::utils::url::url_decode;
3use url::Url;
4
5/// Parse an HTTP/HTTPS link into a Proxy object
6/// Matches C++ explodeHTTP implementation
7pub fn explode_http(link: &str, node: &mut Proxy) -> bool {
8    // Try to parse as URL if it has a scheme, otherwise add a dummy scheme
9    let url_str = if link.contains("://") {
10        link.to_string()
11    } else {
12        format!("http://_dummy_host_/?{}", link)
13    };
14
15    // Parse URL
16    let url = match Url::parse(&url_str) {
17        Ok(u) => u,
18        Err(_) => return false,
19    };
20
21    // Extract query parameters
22    let mut server = String::new();
23    let mut port = String::new();
24    let mut username = String::new();
25    let mut password = String::new();
26    let mut remarks = String::new();
27    let mut group = String::new();
28
29    // Parse query parameters
30    for (key, value) in url.query_pairs() {
31        match key.as_ref() {
32            "server" => server = url_decode(&value),
33            "port" => port = url_decode(&value),
34            "user" => username = url_decode(&value),
35            "pass" => password = url_decode(&value),
36            "remarks" => remarks = url_decode(&value),
37            "group" => group = url_decode(&value),
38            _ => {}
39        }
40    }
41
42    // Use default group if none specified
43    let group = if group.is_empty() {
44        HTTP_DEFAULT_GROUP
45    } else {
46        &group
47    };
48
49    // Use server:port as remark if none specified
50    let remarks = if remarks.is_empty() {
51        format!("{}:{}", server, port)
52    } else {
53        remarks
54    };
55
56    // Skip invalid port
57    if port == "0" {
58        return false;
59    }
60
61    // Determine if TLS is enabled
62    let is_https = link.contains("/https");
63
64    // Parse port to u16
65    let port_num = match port.parse::<u16>() {
66        Ok(p) => p,
67        Err(_) => return false,
68    };
69
70    // Create the proxy object
71    *node = Proxy::http_construct(
72        group, &remarks, &server, port_num, &username, &password, is_https, None, None, None, "",
73    );
74
75    true
76}