Skip to content

Commit 39c75ba

Browse files
Support custom headers on websocket connection
1 parent f682a68 commit 39c75ba

2 files changed

Lines changed: 35 additions & 2 deletions

File tree

lib/s2/connection.rb

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,14 @@ class Connection
99

1010
attr_reader :connected_at, :status
1111

12-
def initialize(resource_id:, task:, ws_url:)
12+
def initialize(resource_id:, task:, ws_url:, headers: {})
1313
@connected_at = nil
1414
@queue = nil
1515
@resource_id = resource_id
1616
@session = nil
1717
@task = task
1818
@ws_url = ws_url
19+
@headers = headers
1920
@status = :initialized
2021
@stopping = false
2122
@backoff = INITIAL_BACKOFF
@@ -81,7 +82,7 @@ def connect_and_run
8182
def connect_websocket(&)
8283
@status = :connecting
8384

84-
Async::WebSocket::Client.connect(@endpoint) do |ws|
85+
Async::WebSocket::Client.connect(@endpoint, headers: @headers) do |ws|
8586
ActiveSupport::Notifications.instrument(
8687
"connected.session.s2",
8788
resource_id: @resource_id,

spec/s2/connection_spec.rb

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,38 @@
3535
expect(sleep_durations).to eq([5, 10, 20, 40, 80, 160, 320, 640, 1280, 2560, 3600, 3600, 3600, 3600])
3636
end
3737

38+
it "passes headers to the websocket client" do
39+
ws = FakeWebSocket.new
40+
received_headers = nil
41+
42+
allow(Async::WebSocket::Client).to receive(:connect) do |_endpoint, headers:, &block|
43+
received_headers = headers
44+
block.call(ws)
45+
end
46+
47+
resource_id = SecureRandom.uuid
48+
ws_url = "ws://example.com/#{resource_id}"
49+
headers = {"authorization" => "Basic dXNlcjpwYXNz"}
50+
51+
connection = described_class.new(
52+
resource_id:,
53+
task: Async::Task.current,
54+
ws_url:,
55+
headers:,
56+
)
57+
58+
task = Async do
59+
connection.connect
60+
end
61+
62+
Async::Task.current.sleep 0.1
63+
64+
connection.disconnect
65+
task.stop
66+
67+
expect(received_headers).to eq(headers)
68+
end
69+
3870
it "reuses the same endpoint across reconnection attempts" do
3971
ws = FakeWebSocket.new
4072
connection_attempts = []

0 commit comments

Comments
 (0)