#reqwest #stream

reqwest-websocket

WebSocket connections with reqwest

8 unstable releases (3 breaking)

0.4.4 Dec 15, 2024
0.4.3 Oct 24, 2024
0.4.2 Aug 19, 2024
0.4.1 Jul 9, 2024
0.1.0 Feb 14, 2024

#23 in WebSocket

Download history 1908/week @ 2024-09-27 2140/week @ 2024-10-04 1543/week @ 2024-10-11 1932/week @ 2024-10-18 2190/week @ 2024-10-25 2023/week @ 2024-11-01 2115/week @ 2024-11-08 2253/week @ 2024-11-15 2147/week @ 2024-11-22 2245/week @ 2024-11-29 1986/week @ 2024-12-06 3093/week @ 2024-12-13 1577/week @ 2024-12-20 1055/week @ 2024-12-27 2242/week @ 2025-01-03 2948/week @ 2025-01-10

8,415 downloads per month
Used in 9 crates (5 directly)

MIT license

53KB
964 lines

reqwest-websocket

crates.io Documentation MIT Build

Extension for reqwest to allow websocket connections.

This crate contains the extension trait RequestBuilderExt, which adds an upgrade method to reqwest::RequestBuilder that prepares the HTTP request to upgrade the connection to a WebSocket. After you call upgrade(), you can send your upgraded request as usual with send(), which will return an UpgradeResponse. The UpgradeResponse wraps reqwest::Response (and also dereferences to it), so you can inspect the response if needed. Finally, you can use into_websocket() on the response to turn it into an async stream and sink for messages. Both text and binary messages are supported.

Example

For a full example take a look at hello_world.rs.

// Extends the `reqwest::RequestBuilder` to allow WebSocket upgrades.
use reqwest_websocket::RequestBuilderExt;

// Creates a GET request, upgrades and sends it.
let response = Client::default()
    .get("wss://echo.websocket.org/")
    .upgrade() // Prepares the WebSocket upgrade.
    .send()
    .await?;

// Turns the response into a WebSocket stream.
let mut websocket = response.into_websocket().await?;

// The WebSocket implements `Sink<Message>`.
websocket.send(Message::Text("Hello, World".into())).await?;

// The WebSocket is also a `TryStream` over `Message`s.
while let Some(message) = websocket.try_next().await? {
    if let Message::Text(text) = message {
        println!("received: {text}")
    }
}

Support for WebAssembly

reqwest-websocket uses the HTTP upgrade functionality built into reqwest, which is not available on WebAssembly. When you use reqwest-websocket in WebAssembly, it falls back to using web_sys::WebSocket. This means that everything except the URL (including query parameters) is not used for your request.

Dependencies

~4–17MB
~215K SLoC