#webhook #请求URL #服务器 #http-post #http #http请求

app webhook-httpd

接收webhooks并运行命令的简单HTTP(S)服务器

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日

#66HTTP服务器

BSD-2-Clause许可

40KB
929

webhook-httpd tests

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_TYPEContent-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