【发布时间】:2020-07-05 02:13:37
【问题描述】:
我正在使用来自How do I make a TLS connection using the rustls library? 的代码创建一个带有 TLS 的套接字并向 Google 发送一个 GET 请求。
当我运行cargo run 时,程序不会在屏幕上打印任何内容。
use rustls;
use rustls::{ClientConfig, ClientSession, Session, TLSError};
use std::env;
use std::error::Error;
use std::fmt;
use std::fs::File;
use std::io;
use std::io::prelude::*;
use std::net::TcpStream;
use std::process;
use std::str;
use std::sync::Arc;
use webpki;
use webpki_roots;
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();
}
在我的Cargo.toml 文件中:
[package]
name = "X"
version = "0.1.0"
authors = ["Behdad"]
edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
rustls = "0.17.0"
webpki = "0.21.2"
webpki-roots = "0.19.0"
serde_derive = "1.0.105"
serde = "1.0.105"
【问题讨论】:
-
很难在一篇文章中回答多个问题。请将它们分成多个问题,以便我们可以更好地帮助您,并且您的问题将在未来帮助其他与您有相同问题的人! I've removed 单独的问题。
-
很难回答您的问题,因为它不包含minimal reproducible example。我们无法分辨代码中存在哪些 crate(及其版本)、类型、特征、字段等。如果您尝试在Rust Playground 上重现您的错误,如果可能的话,这将使我们更容易为您提供帮助,否则在全新的 Cargo 项目中,然后在edit 您的问题中包含附加信息。您可以使用Rust-specific MRE tips 来减少您在此处发布的原始代码。谢谢!
-
看来Why is a raw HTTP request extremely slow?的答案可能会回答您的问题; Get Request to a Website with vanilla Rust。如果没有,请edit您的问题解释差异。否则,我们可以将此问题标记为已回答。
-
minimal reproducible example 示例的一个重要部分是它最小。您包含了似乎没有使用过的板条箱,这是一个很好的迹象,表明您还没有完全减少问题。您甚至可以删除 TLS 方面并看到同样的问题。
-
@Shepmaster 您删除的第二个问题不是单独的问题,只需要非常快速地更改代码即可。这是我在 Stackoverflow 上找到的代码,它被标记为答案(问题也与我的相同),但它不起作用。无论如何,我也包含了
Cargo.toml文件。对于您的第三条评论,我应该说这与您提到的问题不同,因为我在这里使用的是 TLS 库,而持久连接在这里不是一个交易。还是谢谢你。