请在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 Web 客户端不能与 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


...