#shell #http #http-server #bash #http-request #server

bin+lib http-sh

执行 Shell 脚本的 HTTP 服务器

1 个不稳定版本

0.1.0 2023 年 10 月 6 日

#96#bash

MIT 许可证

29KB
546

http-sh

CI

概述

GET: Hello world

$ http-sh :5000 -- echo Hello world
$ curl -s localhost:5000
Hello world

POST: echo

$ http-sh :5000 -- cat
$ curl -s -d Hai localhost:5000
Hai

请求元数据

请求元数据以 JSON 格式在文件描述符 3 上提供。

jq 配合良好

$ http-sh :5000 -- bash -c 'jq <&3'
$ curl -s localhost:5000
{
  "headers": {
    "accept": "*/*",
    "host": "localhost:5000",
    "user-agent": "curl/7.79.1"
  },
  "method": "GET",
  "path": "/",
  "proto": "HTTP/1.1",
  "query": {},
  "remote_ip": "127.0.0.1",
  "remote_port": 51435,
  "request_id": "0391ND23LWW4KVCZ00G30BZAG",
  "uri": "/"
}

$ http-sh :5000 -- bash -c 'echo hello: $(jq -r .path <&3)'
$ curl -s localhost:5000/yello
hello: /yello

响应元数据

您可以通过在文件描述符 4 上写入 JSON 来设置响应元数据。目前您可以设置响应 statusheaders

jo 配合良好

$ http-sh :5000 -- bash -c 'jo status=404 >&4; echo sorry, eh'
$ curl -si localhost:5000
HTTP/1.1 404 Not Found
content-type: text/plain
transfer-encoding: chunked
date: Sat, 25 Feb 2023 05:20:48 GMT

sorry, eh

注意,对于流式响应,您需要关闭文件描述符 4,以便启动响应。

$ http-sh :5000 -- bash -c 'exec 4>&-; while true ; do date; sleep 1; done'
$ curl -s localhost:5000
Sat Feb 25 00:31:41 EST 2023
Sat Feb 25 00:31:43 EST 2023
Sat Feb 25 00:31:44 EST 2023
Sat Feb 25 00:31:45 EST 2023
Sat Feb 25 00:31:46 EST 2023
...

服务器发送事件

xcat 配合良好

$ http-sh :5000 -- bash -c '
    jo headers="$(jo "content-type"="text/event-stream")" >&4
    exec 4>&-
    tail -F source.json | xcat -- bash -c "sed '\''s/^/data: /g'\''; echo;"
'

# simulate generating events in a seperate process
$ while true; do jo date="$(date)" ; sleep 1 ; done >> source.json

$ curl -si localhost:5000/
HTTP/1.1 200 OK
content-type: text/event-stream
transfer-encoding: chunked
date: Sat, 25 Feb 2023 18:13:37 GMT

data: {"date":"Sat Feb 25 13:13:35 EST 2023"}

data: {"date":"Sat Feb 25 13:13:36 EST 2023"}

data: {"date":"Sat Feb 25 13:13:37 EST 2023"}

data: {"date":"Sat Feb 25 13:13:38 EST 2023"}

data: {"date":"Sat Feb 25 13:13:39 EST 2023"}

...

直接测试脚本

虽然 http-sh 提供了一种方便的方式来处理 HTTP 请求和与相关元数据交互,但在某些时候,您可能希望在不涉及 HTTP 层的情况下直接测试打算与 http-sh 一起使用的脚本。

要模拟 http-sh 调用您的脚本的环境,您可以使用以下命令

echo "Hai" | ./root.sh 3</tmp/req.json 4>&1

以下是对发生情况的分解

  1. echo "Hai":模拟发送请求体。
  2. ./root.sh:处理输入的您的脚本。
  3. 3</tmp/req.json:模拟 http-sh 在文件描述符 3 上提供的 JSON 元数据。为了测试而获取此 JSON 元数据,请检查 http-sh 日志中特定请求的日志行,这些日志是按 JSON 格式组织的。
  4. 4>&1:将文件描述符 4 的输出重定向到 stdout,以便您可以在终端中一起查看响应元数据和主要响应。

此方法允许您在开发和测试阶段绕过 http-sh,确保在将其集成到 HTTP 服务器之前,您的脚本表现符合预期。

依赖项

~20–32MB
~625K SLoC