The 文档 https://docs.rs/rustls/0.10.0/rustls/提供了一个例子——不幸的是它不能编译;很多东西都被重命名了,界面也被重命名了ClientSession
构造函数改变了。我设法将错误修复到可以编译的程度,但没有修复到可以工作的程度。
这是我让最小示例发挥作用的最佳尝试:
extern crate rustls;
use io::Read;
use io::Write;
use rustls::Session;
use std::io;
fn main() {
let mut socket = std::net::TcpStream::connect("www.google.com:443").unwrap();
let mut config = rustls::ClientConfig::new();
config
.root_store
.add_server_trust_anchors(&webpki_roots::TLS_SERVER_ROOTS);
let arc = std::sync::Arc::new(config);
let dns_name = webpki::DNSNameRef::try_from_ascii_str("www.google.com").unwrap();
let mut client = rustls::ClientSession::new(&arc, dns_name);
client.write(b"GET https://www.google.com\r\n\r\n").unwrap();
loop {
if client.wants_read() {
client.read_tls(&mut socket).unwrap();
client.process_new_packets().unwrap();
let mut plaintext = Vec::new();
client.read_to_end(&mut plaintext).unwrap();
io::stdout().write(&plaintext).unwrap();
}
if client.wants_write() {
client.write_tls(&mut socket).unwrap();
}
// For testing purposes only
std::thread::sleep_ms(1000);
}
}
所发生的情况是,程序开始运行,并在 10 秒后中止,并显示错误“已建立的连接被主机中的软件中止”。
我本希望它能将一些数据打印到标准输出,但事实并非如此。
有一个结构体叫做rustls::Stream
将会话用作普通流。它记录在docs.rs https://docs.rs/rustls/0.17.0/rustls/struct.Stream.html。你还可以找到一个例子在他们的 GitHub 存储库上 https://github.com/ctz/rustls/blob/master/rustls-mio/examples/simpleclient.rs.
您可以将您的代码转换为使用rustls::Stream
像这样:
extern crate rustls; // 0.17.0
use io::Read;
use io::Write;
use std::io;
fn main() {
let mut socket = std::net::TcpStream::connect("www.google.com:443").unwrap();
let mut config = rustls::ClientConfig::new();
config
.root_store
.add_server_trust_anchors(&webpki_roots::TLS_SERVER_ROOTS);
let arc = std::sync::Arc::new(config);
let dns_name = webpki::DNSNameRef::try_from_ascii_str("www.google.com").unwrap();
let mut client = rustls::ClientSession::new(&arc, dns_name);
let mut stream = rustls::Stream::new(&mut client, &mut socket); // Create stream
// Instead of writing to the client, you write to the stream
stream
.write(b"GET / HTTP/1.1\r\nConnection: close\r\n\r\n")
.unwrap();
let mut plaintext = Vec::new();
stream.read_to_end(&mut plaintext).unwrap();
io::stdout().write_all(&plaintext).unwrap();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)