Skip to content

Commit 23bb4fd

Browse files
author
Sami Vänttinen
authored
Merge pull request #16 from WhyNotHugo/remove-unwraps
Clean up `unwrap`s everywhere except `main()`
2 parents ee769d0 + 22c65c0 commit 23bb4fd

File tree

2 files changed

+46
-29
lines changed

2 files changed

+46
-29
lines changed

src/main.rs

Lines changed: 42 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,69 +1,85 @@
11
extern crate byteorder;
2-
extern crate nix;
32
#[cfg(windows)]
43
extern crate named_pipe;
4+
extern crate nix;
55

6+
use byteorder::{ByteOrder, NativeEndian, WriteBytesExt};
67
use std::convert::TryInto;
7-
use std::io::{self, Read, Write};
8+
use std::io::{stdin, stdout, Error, ErrorKind, Read, Result, Write};
89
use std::thread;
9-
use byteorder::{ByteOrder, NativeEndian, WriteBytesExt};
1010

1111
mod proxy_socket;
1212

1313
use proxy_socket::ProxySocket;
1414

15-
const BUFFER_SIZE: usize = 1024 ^ 2; // 1024 ^ 2 is the maximum
15+
const BUFFER_SIZE: usize = 1024 ^ 2; // 1024 ^ 2 is the maximum
1616

1717
fn valid_length(length: usize) -> bool {
1818
length > 0 && length <= BUFFER_SIZE
1919
}
2020

21-
fn read_header() -> usize {
22-
let stdin = io::stdin();
21+
// Read a header (message size) from stdin (e.g.: from the browser).
22+
fn read_header() -> Result<usize> {
23+
let stdin = stdin();
2324
let mut buf = vec![0; 4];
2425
let mut handle = stdin.lock();
2526

26-
handle.read_exact(&mut buf).unwrap();
27-
NativeEndian::read_u32(&buf).try_into().unwrap()
27+
handle.read_exact(&mut buf)?;
28+
29+
NativeEndian::read_u32(&buf)
30+
.try_into()
31+
.map_err(|err| Error::new(ErrorKind::InvalidData, err))
2832
}
2933

30-
fn read_body<T: Read + Write>(length: usize, socket: &mut ProxySocket<T>) {
34+
// Handle a whole request/response cycle
35+
//
36+
// Read a message body from stdin (e.g.: from the browser), and echo it back to the browser's
37+
// socket. Then await a response from the socket and relay that back to the browser.
38+
fn read_body<T: Read + Write>(length: usize, socket: &mut ProxySocket<T>) -> Result<()> {
3139
let mut buffer = vec![0; length];
32-
let stdin = io::stdin();
40+
let stdin = stdin();
3341
let mut handle = stdin.lock();
3442

35-
if handle.read_exact(&mut buffer).is_ok() && valid_length(length) {
36-
socket.write_all(&buffer).unwrap();
37-
socket.flush().unwrap();
38-
read_response(socket);
43+
handle.read_exact(&mut buffer)?;
44+
45+
if valid_length(length) {
46+
socket.write_all(&buffer)?;
47+
socket.flush()?;
48+
read_response(socket)?;
3949
}
50+
51+
Ok(())
4052
}
4153

42-
fn read_response<T: Read>(socket: &mut ProxySocket<T>) {
54+
// Read a response (from KP's socket) and echo it back to the browser.
55+
fn read_response<T: Read>(socket: &mut ProxySocket<T>) -> Result<()>{
4356
let mut buf = vec![0; BUFFER_SIZE];
4457
if let Ok(len) = socket.read(&mut buf) {
45-
write_response(&buf[0..len]);
58+
write_response(&buf[0..len])?;
4659
}
60+
61+
Ok(())
4762
}
4863

49-
fn write_response(buf: &[u8]) {
50-
let stdout = io::stdout();
64+
// Write a response to stdout (e.g.: to the browser).
65+
fn write_response(buf: &[u8]) -> Result<()> {
66+
let stdout = stdout();
5167
let mut out = stdout.lock();
5268

53-
out.write_u32::<NativeEndian>(buf.len() as u32).unwrap();
54-
out.write_all(buf).unwrap();
55-
out.flush().unwrap();
69+
out.write_u32::<NativeEndian>(buf.len() as u32)?;
70+
out.write_all(buf)?;
71+
out.flush()?;
72+
73+
Ok(())
5674
}
5775

5876
fn main() {
5977
let mut socket = proxy_socket::connect(BUFFER_SIZE).unwrap();
6078

6179
// Start thread for user input reading
62-
let ui = thread::spawn(move || {
63-
loop {
64-
let length = read_header();
65-
read_body(length, &mut socket);
66-
}
80+
let ui = thread::spawn(move || loop {
81+
let length = read_header().unwrap();
82+
read_body(length, &mut socket).unwrap();
6783
});
6884

6985
let _ui_res = ui.join().unwrap();

src/proxy_socket.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ fn get_socket_dirs() -> Vec<PathBuf> {
4949
let mut dirs = Vec::new();
5050

5151
if !cfg!(target_os = "macos") {
52-
if let Ok(dir) = env::var("XDG_RUNTIME_DIR") {
52+
if let Ok(dir) = env::var("XDG_RUNTIME_DIR") {
5353
let xdg_runtime_dir: PathBuf = dir.into();
5454

5555
// Sandbox-friendly path.
@@ -79,8 +79,9 @@ pub fn connect(buffer_size: usize) -> io::Result<ProxySocket<UnixStream>> {
7979
.find_map(|dir| UnixStream::connect(dir.join(socket_name)).ok())
8080
.ok_or_else(|| io::Error::from(io::ErrorKind::NotFound))?;
8181

82-
socket::setsockopt(s.as_raw_fd(), SndBuf, &buffer_size).expect("setsockopt for SndBuf failed");
83-
socket::setsockopt(s.as_raw_fd(), RcvBuf, &buffer_size).expect("setsockopt for RcvBuf failed");
82+
socket::setsockopt(s.as_raw_fd(), SndBuf, &buffer_size)?;
83+
socket::setsockopt(s.as_raw_fd(), RcvBuf, &buffer_size)?;
84+
8485
let timeout: Option<Duration> = Some(Duration::from_secs(1));
8586
s.set_read_timeout(timeout)?;
8687
Ok(ProxySocket { inner: s })

0 commit comments

Comments
 (0)