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.
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.
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!