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

王林
Release: 2024-02-14 21:06:09
forward
1278 people have browsed it

对于 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)
    }))
Copy after login

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
}
Copy after login

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 {
          ...
        }
        ...
    }
Copy after login

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
Copy after login

Server response:

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

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!

Related labels:
source:stackoverflow.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template