2024 年 Clojure 状态调查中分享您的想法!

欢迎!请查看关于页面以获得更多关于如何使用本站的信息。

+1

我想在 UNIX 套接字上执行 HTTP 请求,就像以下示例使用 curl 和 docker 那样

$ curl --unix-socket /var/run/docker.sock https://127.0.0.1/images/json
[
  {
    "Containers": -1,
    "Created": 1577395270,
    "Id": "sha256:ce6c1e7ac56533e2742030f033cf0d8cf0adc996c7bb87453eb5adc266b2ef2e",
    "Labels": null,
    "ParentId": "",
    "RepoDigests": [
      "busybox@sha256:7fe0cb3632d9ea7b2a9ab4427e339e01f7cdfeff50674804cb8946664976c610"
    ],
    "RepoTags": [
      "busybox:musl"
    ],
    "SharedSize": -1,
    "Size": 1461385,
    "VirtualSize": 1461385
  }
]

据我所知,clj-http 似乎不支持这一点。

在 Clojure 中推荐或惯用的方法是什么?

3 回答

+1

已选中
 
最佳答案

简短的回答是:你无法这么做。

Java 没有写入 UNIX 套接字的支持(至少我找不到/看到)。

更详细的答案是

你可以向套接字发送和管道传递。netcat "nc" 工具可以在这里使用,例如,你可以用以下方式打开一个 TCP 套接字:

选项 A
使用 netcat

nc -lk localhost 8787

然后找到将 nc 重定向到所需套接字的方法

选项 B.

你可以使用 ProcessBuilder 调用 curl 作为上述示例使用外部进程。

选项 C.

有一些库允许你从 Java 创建 UNIX 套接字,例如 https://github.com/mcfunley/juds。这涉及到使用 JNI,而 "juds" 将其抽象化

我在这开始工作:https://github.com/into-docker/clj-docker-client,并通过https://square.github.io/okhttp/建立了连接

但现在我们有一个专门的库来做这件事
https://github.com/into-docker/unixsocket-http

希望这也能帮助别人!
0投票

编辑

Http 网络客户端不支持 Unix 套接字。

我提交了 JDK 的一个 bug/改进(如果得到批准的话: https://bugs.openjdk.java.net/browse/JDK-8275838

我还发推文提到了这件事 -也许会有人更关注这块代码: https://twitter.com/ieugen222/status/1451877192766574592

第一个问题出在 jdk.internal.net.http.HttpRequestBuilderImpl#checkURI(可能还有其他问题)

    static void checkURI(URI uri) {
    String scheme = uri.getScheme();
    if (scheme == null)
        throw newIAE("URI with undefined scheme");
    scheme = scheme.toLowerCase(Locale.US);
    if (!(scheme.equals("https") || scheme.equals("http"))) {
        throw newIAE("invalid URI scheme %s", scheme);
    }
    if (uri.getHost() == null) {
        throw newIAE("unsupported URI %s", uri);
    }
}
0投票

据说他们在JDK 16中引入了对Unix域套接字的支持: https://openjdk.java.net/jeps/380

这是一篇关于它们的优秀博客文章
https://inside.java-lang.cn/2021/02/03/jep380-unix-domain-sockets-channels/

...