#unix-socket #unix #hyper #sockets #http #hyper-client #client-server

已删除 hyperlocal-v07

Unix域套接字Hyper绑定

0.7.0 2020年3月17日

#41 in #hyper-client

MIT 许可证

15KB
206 代码行

hyperlocal 构建状态 覆盖状态 crates.io docs.rs 主API文档

Hyper 客户端和服务器绑定,用于 Unix域套接字

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的客户端接口使得通过工厂方法(如GETPOSTDELETE等)轻松发出典型的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