|
|
|
@ -1,3 +1,4 @@
|
|
|
|
|
use std::error::Error;
|
|
|
|
|
use std::io;
|
|
|
|
|
use std::io::{Read, Write};
|
|
|
|
|
use std::net::TcpStream;
|
|
|
|
@ -37,18 +38,19 @@ impl Page {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn load(host: &str, port: &str, selector: &str) -> Option<Page> {
|
|
|
|
|
pub fn load(host: &str, port: &str, selector: &str) -> io::Result<Page> {
|
|
|
|
|
let mut page = Self::new();
|
|
|
|
|
if let Some(res) = Self::fetch(host, port, selector) {
|
|
|
|
|
page.raw = res;
|
|
|
|
|
Some(page)
|
|
|
|
|
} else {
|
|
|
|
|
None
|
|
|
|
|
match Self::fetch(host, port, selector) {
|
|
|
|
|
Ok(res) => {
|
|
|
|
|
page.raw = res;
|
|
|
|
|
Ok(page)
|
|
|
|
|
}
|
|
|
|
|
Err(e) => Err(e),
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Fetches a URL and returns a raw Gopher response.
|
|
|
|
|
fn fetch(host: &str, port: &str, selector: &str) -> Option<String> {
|
|
|
|
|
fn fetch(host: &str, port: &str, selector: &str) -> io::Result<String> {
|
|
|
|
|
let mut body = String::new();
|
|
|
|
|
let stream = TcpStream::connect(format!("{}:{}", host, port))
|
|
|
|
|
.and_then(|mut stream| {
|
|
|
|
@ -60,10 +62,9 @@ impl Page {
|
|
|
|
|
Ok(())
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
if let Ok(()) = stream {
|
|
|
|
|
Some(body)
|
|
|
|
|
} else {
|
|
|
|
|
None
|
|
|
|
|
match stream {
|
|
|
|
|
Ok(_) => Ok(body),
|
|
|
|
|
Err(e) => Err(e),
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|