diff options
| author | Fuwn <[email protected]> | 2024-03-24 14:24:20 +0000 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2024-03-24 14:34:09 +0000 |
| commit | 3970616451ab4336e37a7ddfdc67f51e01e55926 (patch) | |
| tree | 6bf9fa01811004ff408ac5da40354bc34ddabc26 /src/request/sync.rs | |
| parent | feat(crate): bump version (diff) | |
| download | germ-3970616451ab4336e37a7ddfdc67f51e01e55926.tar.xz germ-3970616451ab4336e37a7ddfdc67f51e01e55926.zip | |
refactor: module for blocking, default to non-blocking
Diffstat (limited to 'src/request/sync.rs')
| -rw-r--r-- | src/request/sync.rs | 83 |
1 files changed, 0 insertions, 83 deletions
diff --git a/src/request/sync.rs b/src/request/sync.rs deleted file mode 100644 index 56950fb..0000000 --- a/src/request/sync.rs +++ /dev/null @@ -1,83 +0,0 @@ -// This file is part of Germ <https://github.com/gemrest/germ>. -// Copyright (C) 2022-2023 Fuwn <[email protected]> -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 3. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see <http://www.gnu.org/licenses/>. -// -// Copyright (C) 2022-2022 Fuwn <[email protected]> -// SPDX-License-Identifier: GPL-3.0-only - -use { - crate::request::Response, - tokio::io::{AsyncReadExt, AsyncWriteExt}, -}; - -/// Make a request to a Gemini server -/// -/// The `url` **should** be prefixed with a scheme (e.g. "gemini://"). -/// -/// # Example -/// -/// ```rust -/// #[tokio::main] -/// async fn main() { -/// match germ::request::sync::request( -/// &url::Url::parse("gemini://fuwn.me").unwrap(), -/// ) -/// .await -/// { -/// Ok(response) => println!("{:?}", response), -/// Err(_) => {} -/// } -/// } -/// ``` -/// -/// # Errors -/// -/// - May error if the URL is invalid -/// - May error if the server is unreachable -/// - May error if the TLS write fails -/// - May error if the TLS read fails -pub async fn request(url: &url::Url) -> anyhow::Result<Response> { - let mut tls = tokio_rustls::TlsConnector::from(std::sync::Arc::new( - rustls::ClientConfig::builder() - .with_safe_defaults() - .with_custom_certificate_verifier(std::sync::Arc::new( - crate::request::GermVerifier::new(), - )) - .with_no_client_auth(), - )) - .connect( - rustls::ServerName::try_from(url.domain().unwrap_or_default())?, - tokio::net::TcpStream::connect(format!( - "{}:{}", - url.domain().unwrap_or(""), - url.port().unwrap_or(1965) - )) - .await?, - ) - .await?; - let cipher_suite = tls.get_mut().1.negotiated_cipher_suite(); - - tls.write_all(format!("{url}\r\n").as_bytes()).await?; - - Ok(Response::new( - &{ - let mut plain_text = Vec::new(); - - tls.read_to_end(&mut plain_text).await?; - - plain_text - }, - cipher_suite, - )) -} |