Home >Backend Development >Golang >For Golang Fiber's WebSocket client, how to convert HTTP client/connection to WebSocket?

For Golang Fiber's WebSocket client, how to convert HTTP client/connection to WebSocket?

王林
王林forward
2024-02-14 21:06:091294browse

对于 Golang Fiber 的 WebSocket 客户端,如何将 HTTP 客户端/连接转变为 WebSocket?

php editor Xinyi brings you answers to the questions about the transformation of Golang Fiber's WebSocket client. When developing with Golang Fiber, sometimes we need to convert the HTTP client or connection to a WebSocket client. This enables two-way communication between HTTP and WebSocket on the same connection. Next, we will detail how to achieve this transformation process. With the following steps, you will be able to easily develop using WebSocket client in Golang Fiber.

Question content

For background information, see this recent stackoverflow article.

I am setting up a WebSockets service using Golang Fiber as follows:

app.Use("/ws", handler.UpgradeHandler)
    app.Get("/ws/:id", websocket.New(func(ws *websocket.Conn) {
        handler.MediaStreamHandler(ws)
    }))

Use UpgradeHandler middleware as follows:

func UpgradeHandler(c *fiber.Ctx) error {
    // IsWebSocketUpgrade returns true if the client
    // requested upgrade to the WebSocket protocol.
    if websocket.IsWebSocketUpgrade(c) {
        log.Info("request to open WebSockets channel")
        return c.Next()
    }
    return fiber.ErrUpgradeRequired
}

Expect the service's HTTP client to make an HTTP GET request to http://chat.acme.ai:80/ws/123 etc. and force the Fiber server to open the WebSockets service. For example:

func MediaStreamHandler(c *websocket.Conn) {
    ...
    for {
        if mt, buf, err = c.ReadMessage(); err != nil {
          ...
        }
        ...
    }

We ingest streaming media in it until the WebSocket is closed.

Question: If a client makes an HTTP GET request to the Fiber service to start a WebSockets service on the Fiber side, how does the client logic turn its HTTP client into a WebSockets client?

Intuitively, we just have a socket somewhere, and upgrading an HTTP client to a WebSockets client is just a matter of adding the correct "glue" to the HTTP client. But from the perspective of using a fixed solution like Java WebSockets, it's not at all clear how to turn an HTTP client into a WebSockets client.

Workaround

Golang/Fiber is accidental here. By definition, the WebSockets protocol initiates an HTTP GET request to a service endpoint; during the handshake, the transport protocol is upgraded from HTTP to WebSockets. Part of this upgrade is that HTTP headers in both requests and responses are modified. See the chat-related examples below.

Upgraded request headers:

GET /chat HTTP/1.1
  Host: server.example.com
  Upgrade: websocket
  Connection: Upgrade
  Sec-WebSocket-Key: x3JJHmbDL1EzLkh9GBhXDw==
  Sec-WebSocket-Protocol: chat, superchat
  Sec-WebSocket-Version: 13
  Origin: http://example.com

Server response:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sM1YUkAGmm50PpG2HaGWk=
Sec-WebSocket-Protocol: chat

These examples come from this article about WebSockets .

The above is the detailed content of For Golang Fiber's WebSocket client, how to convert HTTP client/connection to WebSocket?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete