首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用unix域套接字在使用Gin时发出请求?

如何使用unix域套接字在使用Gin时发出请求?
EN

Stack Overflow用户
提问于 2022-07-20 08:17:02
回答 2查看 404关注 0票数 1

我在做爆竹的包装纸。

要在命令行上使用鞭炮启动VM,您必须将一个套接字文件传递给firecracker可执行文件。就像这样:

代码语言:javascript
复制
firecracker --api-sock /path/to/file.socket

然后,您可以从另一个终端向此服务器/套接字发出请求,如下所示:

代码语言:javascript
复制
curl --unix-socket /tmp/firecracker.socket -XPUT 'http://localhost/actions' -d '{"action_type": "SendCtrlAltDel"}'

我正在尝试从Gin服务器中复制相同的东西。

我有一个端点,它执行第一项工作,即启动服务器。最小的代码如下所示:

代码语言:javascript
复制
cmd := exec.Command("firecracker", "--api-sock", "/path/to/file.socket")

err := cmd.Start()

此端点启动服务器并侦听任何命令。问题是,我不知道如何使用套接字文件向这个服务器发出PUT请求。我在网上找到了,但这对我来说没有多大意义。

以下是不使用任何套接字文件的初学者代码。

代码语言:javascript
复制
func BootSource(c *gin.Context) {
    var body models.BootSource
    c.BindJSON(&body)
    bodyJson, _ := json.Marshal(body)

    // initialize http client
    client := &http.Client{}

    // set the HTTP method, url, and request body
    req, err := http.NewRequest(http.MethodPut, "http://localhost/boot-source", bytes.NewBuffer(bodyJson))
    if err != nil {
        panic(err)
    }

    // set the request header Content-Type for json
    _, err = client.Do(req)
    if err != nil {
        panic(err)
    }
}

如何使这个PUT请求使用套接字文件?

还请注意,我使用的是Gin框架。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-07-20 11:37:49

要做到这一点,您需要覆盖http.Client使用的传输,为其配置一个函数,用于创建到套接字的连接:

代码语言:javascript
复制
client := http.Client{
  Transport: &http.Transport{
    DialContext: func(ctx context.Context, _, _ string) (net.Conn, error) {
      return net.DialContext(ctx, "unix", "/path/to/socket") 
    }
  }
}

然后,您可以使用该客户端,它发出的所有请求都将使用该连接。通常,对于通过套接字公开的HTTP服务,请求中使用的主机并不重要,因此您可以只使用对您有意义的任何值,例如

代码语言:javascript
复制
client.Get("http://firecracker/some/api/path")

然而,在您尝试使用Firecracker时,为什么不直接使用它们的SDK:https://github.com/firecracker-microvm/firecracker-go-sdk呢?

这将为您处理连接的设置,并防止您需要手工处理所有请求。

票数 2
EN

Stack Overflow用户

发布于 2022-07-20 12:27:08

扩展到此回答,可以通过克隆默认传输来保留http默认值。

代码语言:javascript
复制
    defaultTransport, ok := http.DefaultTransport.(*http.Transport)
    if !ok {
            panic("http.DefaultTransport is not a *http.Transport")
    }
    unixTransport := defaultTransport.Clone()
    defaultDialContext := unixTransport.DialContext
    unixTransport.DialContext = func(ctx context.Context, _, _ string) (net.Conn, error) {
            return defaultDialContext(ctx, "unix", "/path/to/socket")
    }
    client := http.Client{Transport: unixTransport}
    client.Get("http://example.com")
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73048137

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档