-- 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