-- Leo's gemini proxy
-- Connecting to typed-hole.org:1965...
-- Connected
-- Sending request
-- Meta line: 20 text/gemini
commit 7df8dda9a680c53a469f67638e3c6df343ffb18d
Author: Julien Blanchard <julien@sideburns.eu>
Date: Sat Jan 4 16:57:38 2020 +0100
[gopher] add timeout
diff --git a/src/gopher/client.rs b/src/gopher/client.rs
index 5a3c03a..36833b3 100644
--- a/src/gopher/client.rs
+++ b/src/gopher/client.rs
@@ -1,6 +1,8 @@
use percent_encoding::percent_decode;
use std::io::{Read, Write};
use std::net::TcpStream;
+use std::net::ToSocketAddrs;
+use std::time::Duration;
use crate::Protocol;
@@ -9,38 +11,45 @@ pub fn get_data<T: Protocol>(url: T) -> Result<(Option<Vec<u8>>, Vec<u8>), Strin
let host = url.host_str().unwrap().to_string();
let port = match url.port() {
Some(port) => port,
- None => 70
+ None => 70,
};
let urlf = format!("{}:{}", host, port);
+ let socket = match urlf.to_socket_addrs() {
+ Ok(mut iter) => iter.next(),
+ Err(_) => None,
+ };
- match TcpStream::connect(&urlf) {
- Ok(mut stream) => {
- let mut url_s = url.path().to_string();
- let path = if url_s.starts_with("/") {
- url_s.split_off(1)
- } else {
- url_s
- };
-
- let mut url = match url.query() {
- Some(query) => format!("{}?{}\n", path, query),
- None => format!("{}\n", path),
- };
-
- let url = if url.starts_with("0/") || url.starts_with("1/") {
- url.split_off(1)
- } else {
- url
- };
-
- let url = percent_decode(url.as_bytes()).decode_utf8().unwrap();
-
- stream.write_all(url.as_bytes()).unwrap();
- let mut res = vec![];
- stream.read_to_end(&mut res).unwrap();
-
- Ok((None, res))
- }
- Err(e) => Err(format!("Could not connect to {}\n{}", urlf, e)),
+ match socket {
+ Some(socket) => match TcpStream::connect_timeout(&socket, Duration::new(5, 0)) {
+ Ok(mut stream) => {
+ let mut url_s = url.path().to_string();
+ let path = if url_s.starts_with('/') {
+ url_s.split_off(1)
+ } else {
+ url_s
+ };
+
+ let mut url = match url.query() {
+ Some(query) => format!("{}?{}\n", path, query),
+ None => format!("{}\n", path),
+ };
+
+ let url = if url.starts_with("0/") || url.starts_with("1/") {
+ url.split_off(1)
+ } else {
+ url
+ };
+
+ let url = percent_decode(url.as_bytes()).decode_utf8().unwrap();
+
+ stream.write_all(url.as_bytes()).unwrap();
+ let mut res = vec![];
+ stream.read_to_end(&mut res).unwrap();
+
+ Ok((None, res))
+ }
+ Err(e) => Err(format!("Could not connect to {}\n{}", urlf, e)),
+ },
+ None => Err(format!("Could not connect to {}\n", urlf)),
}
}
---
Served by Pollux Gemini Server.
-- Response ended
-- Page fetched on Sun May 19 06:33:26 2024