请在 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

选项 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 的一个错误/增强(如果被批准的话: 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/

...