Документация предоставляет пример - к сожалению, он не компилируется; многие вещи были переименованы, а интерфейс конструктора 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 секунд с ошибкой «Установленное соединение было прервано программным обеспечением на вашем хост-компьютере».
Я ожидал, что он напечатает некоторые данные на стандартный вывод, что это не так.