7个版本
0.1.6 | 2023年9月30日 |
---|---|
0.1.5 | 2023年9月27日 |
0.1.4 | 2022年10月11日 |
0.1.3 | 2022年4月26日 |
0.1.1 | 2020年12月20日 |
#66 在 HTTP服务器 中
40KB
929 行
webhook-httpd
webhook-httpd
是一个简单的使用Rust编写的HTTP(S)服务器,用于接收webhooks。
功能
- 根据请求URL在POST请求上运行命令。
- 可选地验证
X-Hub-Signature-256
头。 - 可选地限制每个hook的作业并发数量。
- 支持使用OpenSSL的TLS。
Hook作为在为特定URL发起POST请求时执行的命令序列进行配置。一个hook可以运行任意数量的命令,并且可以为不同的URL配置任意数量的hook。对于hook运行的每个命令,您可以配置它是否应该从标准输入接收请求体。
调度
服务器支持限制每个hook的并发运行作业的数量。当达到并发限制时,作业可以被放入先进先出或后进先出队列。每个hook可以有不同的并发限制、队列类型和最大队列大小。
默认情况下,hook将只并发运行一个作业,并且将在后进先出队列中最多排队一个作业(这意味着当队列满时,较老的作业将被丢弃)。这对于只想根据最新的请求更新内容的hook来说是一个好的配置,但所有参数都可以在每个hook中单独更改。
命令环境
每个命令都在设置了一些环境变量的情况下执行。这些变量提供了一些关于已发出的HTTP请求的信息
URL_PATH
:请求URL的路径部分。URL_QUERY
:请求URL的查询部分。REMOTE_ADDR
:远程对等方的IP地址。REMOTE_PORT
:远程对等方的端口号。
您还可以配置一个命令以接收请求体作为其标准输入。在这种情况下,将设置一些额外的环境变量
CONTENT_TYPE
:Content-Type
头的值。CONTENT_LENGTH
:请求体的大小(字节)。
示例配置
以下是一个小型配置示例。有关带有注释的更详细示例,请参阅 example-config.yaml
或运行 webhook-httpd --print-example-config
。
port: 8091
tls:
private-key: /etc/letsencrypt/live/example.com/privkey.pem
certificate-chain: /etc/letsencrypt/live/example.com/fullchain.pem
hooks:
- url: "/make-release-tarball"
commands:
- cmd: ["make-release-tarball"]
stdin: request-body
working-dir: "/path/to/repository/"
max-concurrent: 1
queue-size: unlimited
queue-type: fifo
secret: "some-randomly-generated-secret"
- url: "/update-daemon-config"
commands:
- cmd: ["git", "fetch"]
- cmd: ["git", "reset", "--hard", "origin/main"]
- cmd: ["systemctl", "reload", "my-little-service"]
working-dir: "/etc/my-little-service/"
secret: "some-randomly-generated-secret"
功能
该软件包有一个可选功能:static-openssl
。当启用此功能时,openssl
会与本地编译的 OpenSSL 静态链接。这可以用于创建具有最少运行时依赖的二进制文件,并且可以在没有 readily 可用的 OpenSSL 最新版本的系统上简化编译过程。
有关如何使用本地安装的 OpenSSL 版本进行构建的更多信息,请参阅:https://docs.rs/openssl/latest/openssl/#building
示例
multipart-stdin
示例展示了如何从 stdin 处理 multipart/form-data
以及如何从配置文件中传递额外的环境变量到您的钩子。
构建示例
cargo build --example multipart-stdin --features static-openssl
添加钩子
- url: "/multipart-stdin"
commands:
- cmd: [""target/debug/examples/multipart-stdin"]
stdin: request-body
environment:
OUTPUT_FOLDER: uploads
PREFIX_TIMESTAMP: 1
运行服务器
cargo run --features static-openssl -- --config example-config.yaml
您可以使用带有 -F
选项的 curl
测试端点
curl -X POST -F "key1=value1" -F "key2=value2" -F "[email protected]" https://127.0.0.1:8091/multipart-stdin
依赖项
~14–29MB
~399K SLoC