Skip to content

Commit

Permalink
Merge pull request async-rs#3 from briansmith/fix-win
Browse files Browse the repository at this point in the history
Merge std-client.rs into client.rs to unbreak Windows build.
  • Loading branch information
quininer authored Mar 31, 2017
2 parents 4bf7cb8 + 22fbb74 commit 4843c68
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 85 deletions.
9 changes: 8 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,14 @@ TcpStream::connect(&addr, &handle)
See [examples/client.rs](examples/client.rs). You can run it with:

```sh
cargo run --example client google.com
cargo run --example client hsts.badssl.com
```

Currently on Windows the example client reads from stdin and writes to stdout using
blocking I/O. Until this is fixed, do something this on Windows:

```sh
echo | cargo run --example client hsts.badssl.com
```

### Server Example Program
Expand Down
59 changes: 47 additions & 12 deletions examples/client.rs
Original file line number Diff line number Diff line change
@@ -1,27 +1,34 @@
#![cfg(unix)]

extern crate clap;
extern crate rustls;
extern crate futures;
extern crate tokio_io;
extern crate tokio_core;
extern crate webpki_roots;
extern crate tokio_file_unix;
extern crate tokio_rustls;

#[cfg(unix)]
extern crate tokio_file_unix;

use std::sync::Arc;
use std::net::ToSocketAddrs;
use std::io::{ BufReader, stdout, stdin };
use std::fs;
use futures::Future;
use tokio_io::{ io, AsyncRead };
use tokio_core::net::TcpStream;
use tokio_core::reactor::Core;
use tokio_io::io;
use clap::{ App, Arg };
use rustls::ClientConfig;
use tokio_file_unix::{ StdFile, File };
use tokio_rustls::ClientConfigExt;

#[cfg(unix)]
use tokio_io::AsyncRead;

#[cfg(unix)]
use tokio_file_unix::{ StdFile, File };

#[cfg(not(unix))]
use std::io::{Read, Write};

fn app() -> App<'static, 'static> {
App::new("client")
Expand Down Expand Up @@ -52,13 +59,6 @@ fn main() {
.to_socket_addrs().unwrap()
.next().unwrap();

let stdin = stdin();
let stdin = File::new_nb(StdFile(stdin.lock())).unwrap()
.into_io(&handle).unwrap();
let stdout = stdout();
let stdout = File::new_nb(StdFile(stdout.lock())).unwrap()
.into_io(&handle).unwrap();

let mut config = ClientConfig::new();
if let Some(cafile) = cafile {
let mut pem = BufReader::new(fs::File::open(cafile).unwrap());
Expand All @@ -69,6 +69,24 @@ fn main() {
let arc_config = Arc::new(config);

let socket = TcpStream::connect(&addr, &handle);

// Use async non-blocking I/O for stdin/stdout on Unixy platforms.

#[cfg(unix)]
let stdin = stdin();

#[cfg(unix)]
let stdin = File::new_nb(StdFile(stdin.lock())).unwrap()
.into_io(&handle).unwrap();

#[cfg(unix)]
let stdout = stdout();

#[cfg(unix)]
let stdout = File::new_nb(StdFile(stdout.lock())).unwrap()
.into_io(&handle).unwrap();

#[cfg(unix)]
let resp = socket
.and_then(|stream| arc_config.connect_async(domain, stream))
.and_then(|stream| io::write_all(stream, text.as_bytes()))
Expand All @@ -80,5 +98,22 @@ fn main() {
.map_err(|(e, _)| e)
});

// XXX: For now, just use blocking I/O for stdin/stdout on other platforms.
// The network I/O will still be asynchronous and non-blocking.

#[cfg(not(unix))]
let mut input = Vec::new();

#[cfg(not(unix))]
stdin().read_to_end(&mut input).unwrap();

#[cfg(not(unix))]
let resp = socket
.and_then(|stream| arc_config.connect_async(domain, stream))
.and_then(|stream| io::write_all(stream, text.as_bytes()))
.and_then(|(stream, _)| io::write_all(stream, &input))
.and_then(|(stream, _)| io::read_to_end(stream, Vec::new()))
.and_then(|(_, output)| stdout().write_all(&output));

core.run(resp).unwrap();
}
72 changes: 0 additions & 72 deletions examples/std-client.rs

This file was deleted.

0 comments on commit 4843c68

Please sign in to comment.