0.7.0 |
|
---|
#41 in #hyper-client
15KB
206 代码行
hyperlocal
Hyper 是一个稳固的 Rust HTTP 客户端和服务器工具包。 Unix域套接字 提供了一种主机本地进程间通信的机制。 hyperlocal
基于 Hyper 的接口,用于构建 Unix域套接字 HTTP 客户端和服务器。
这在需要限制对当前主机的访问,而不需要打开和公开 tcp 端口的情况下很有用。提供此类主机本地接口的 Unix 守护程序示例包括 Docker,一个进程容器管理器。
安装
将以下内容添加到您的 Cargo.toml
文件中
[dependencies]
hyperlocal = "0.7-alpha.1"
用法
服务器
典型的服务器可以使用 hyperlocal::server::UnixServerExt
构建。
use std::{error::Error, fs, path::Path};
use hyper::{
service::{make_service_fn, service_fn},
Body, Response, Server,
};
use hyperlocal::UnixServerExt;
const PHRASE: &'static str = "It's a Unix system. I know this.";
#[tokio::main]
async fn main() -> Result<(), Box<dyn Error + Send + Sync>> {
let path = Path::new("/tmp/hyperlocal.sock");
if path.exists() {
fs::remove_file(path)?;
}
let make_service = make_service_fn(|_| async {
Ok::<_, hyper::Error>(service_fn(|_req| async {
Ok::<_, hyper::Error>(Response::new(Body::from(PHRASE)))
}))
});
Server::bind_unix(path)?.serve(make_service).await?;
Ok(())
}
客户端
您可以使用 Hyper 的 Client
接口通过 Unix域套接字服务器进行 HTTP 通信。使用 Client::builder()
配置您的 Hyper 客户端。
Hyper的客户端接口使得通过工厂方法(如GET
、POST
、DELETE
等)轻松发出典型的HTTP方法。这些方法需要一个可以转换成hyper::Uri
的参数。由于Unix域套接字不是用解析到IP地址和网络端口的域名表示的,所以标准的URL字符串是不够用的。相反,应使用hyperlocal::Uri
,它表示域名套接字的文件路径以及资源URI路径和查询字符串。
use std::error::Error;
use std::path::Path;
use futures_util::stream::TryStreamExt;
use hyper::{Body, Client};
use hyperlocal::{Uri, UnixClientExt};
#[tokio::main]
async fn main() -> Result<(), Box<dyn Error + Send + Sync>> {
let path = Path::new("/tmp/hyperlocal.sock");
let url = Uri::new(path, "/").into();
let client = Client::unix();
let response_body = client.get(url).await?.into_body;
let bytes = response_body
.try_fold(Vec::default(), |mut buf, bytes| async {
buf.extend(bytes);
Ok(buf)
})
.await?;
println!("{}", String::from_utf8(bytes)?);
Ok(())
}
Doug Tangren (softprops) 2015-2018
依赖项
~10MB
~167K SLoC