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

欢迎!有关如何工作的更多信息,请参阅关于页面

+1
Libs

我想发送一个通过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
by
selected by
 
最佳回答

简短的回答是:你做不到。

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" 将其抽象出来。

by
我开始在这个方面的工作是在 https://github.com/into-docker/clj-docker-client 并能够通过 https://square.github.io/okhttp/ 建立连接。

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

希望这也能帮助到其他人!
0
by
编辑 by

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/

...