diff --git a/Fix-handling-of-default-ports-on-ruby-3.1.patch b/Fix-handling-of-default-ports-on-ruby-3.1.patch new file mode 100644 index 0000000..846ac8b --- /dev/null +++ b/Fix-handling-of-default-ports-on-ruby-3.1.patch @@ -0,0 +1,140 @@ +From 716f19d79e94541bd525f228bfe184420c7c44ad Mon Sep 17 00:00:00 2001 +From: James Coglan +Date: Sat, 10 Sep 2022 15:37:55 +0100 +Subject: [PATCH] Fix handling of default ports on Ruby 3.1 + +--- + lib/websocket/driver.rb | 9 ++++++ + lib/websocket/driver/client.rb | 3 +- + lib/websocket/driver/proxy.rb | 4 +-- + spec/websocket/driver/client_spec.rb | 48 ++++++++++++++++++++++++++++ + 4 files changed, 59 insertions(+), 5 deletions(-) + +diff --git a/lib/websocket/driver.rb b/lib/websocket/driver.rb +index d568e91..7033a82 100644 +--- a/lib/websocket/driver.rb ++++ b/lib/websocket/driver.rb +@@ -42,6 +42,7 @@ module WebSocket + end + + MAX_LENGTH = 0x3ffffff ++ PORTS = { 'ws' => 80, 'wss' => 443 } + STATES = [:connecting, :open, :closing, :closed] + + BINARY = 'ASCII-8BIT' +@@ -178,6 +179,14 @@ module WebSocket + string.valid_encoding? ? string : nil + end + ++ def self.host_header(uri) ++ host = uri.host ++ if uri.port and uri.port != PORTS[uri.scheme] ++ host += ":#{uri.port}" ++ end ++ host ++ end ++ + def self.validate_options(options, valid_keys) + options.keys.each do |key| + unless valid_keys.include?(key) +diff --git a/lib/websocket/driver/client.rb b/lib/websocket/driver/client.rb +index 0a45534..68e10eb 100644 +--- a/lib/websocket/driver/client.rb ++++ b/lib/websocket/driver/client.rb +@@ -23,11 +23,10 @@ module WebSocket + raise URIError, "#{socket.url} is not a valid WebSocket URL" + end + +- host = uri.host + (uri.port ? ":#{uri.port}" : '') + path = (uri.path == '') ? '/' : uri.path + @pathname = path + (uri.query ? '?' + uri.query : '') + +- @headers['Host'] = host ++ @headers['Host'] = Driver.host_header(uri) + @headers['Upgrade'] = 'websocket' + @headers['Connection'] = 'Upgrade' + @headers['Sec-WebSocket-Key'] = @key +diff --git a/lib/websocket/driver/proxy.rb b/lib/websocket/driver/proxy.rb +index e4891e3..69f59a5 100644 +--- a/lib/websocket/driver/proxy.rb ++++ b/lib/websocket/driver/proxy.rb +@@ -4,8 +4,6 @@ module WebSocket + class Proxy + include EventEmitter + +- PORTS = {'ws' => 80, 'wss' => 443} +- + attr_reader :status, :headers + + def initialize(client, origin, options) +@@ -20,7 +18,7 @@ module WebSocket + @state = 0 + + @headers = Headers.new +- @headers['Host'] = @origin.host + (@origin.port ? ":#{@origin.port}" : '') ++ @headers['Host'] = Driver.host_header(@origin) + @headers['Connection'] = 'keep-alive' + @headers['Proxy-Connection'] = 'keep-alive' + +diff --git a/spec/websocket/driver/client_spec.rb b/spec/websocket/driver/client_spec.rb +index 75b7f4f..abdde2c 100644 +--- a/spec/websocket/driver/client_spec.rb ++++ b/spec/websocket/driver/client_spec.rb +@@ -121,6 +121,54 @@ describe WebSocket::Driver::Client do + end + end + ++ describe "with an explicit port" do ++ let(:url) { "ws://www.example.com:3000/socket" } ++ ++ it "includes the port in the Host header" do ++ expect(socket).to receive(:write).with( ++ "GET /socket HTTP/1.1\r\n" + ++ "Host: www.example.com:3000\r\n" + ++ "Upgrade: websocket\r\n" + ++ "Connection: Upgrade\r\n" + ++ "Sec-WebSocket-Key: 2vBVWg4Qyk3ZoM/5d3QD9Q==\r\n" + ++ "Sec-WebSocket-Version: 13\r\n" + ++ "\r\n") ++ driver.start ++ end ++ end ++ ++ describe "with a wss: URL" do ++ let(:url) { "wss://www.example.com/socket" } ++ ++ it "does not include the port in the Host header" do ++ expect(socket).to receive(:write).with( ++ "GET /socket HTTP/1.1\r\n" + ++ "Host: www.example.com\r\n" + ++ "Upgrade: websocket\r\n" + ++ "Connection: Upgrade\r\n" + ++ "Sec-WebSocket-Key: 2vBVWg4Qyk3ZoM/5d3QD9Q==\r\n" + ++ "Sec-WebSocket-Version: 13\r\n" + ++ "\r\n") ++ driver.start ++ end ++ end ++ ++ describe "with a wss: URL and explicit port" do ++ let(:url) { "wss://www.example.com:3000/socket" } ++ ++ it "includes the port in the Host header" do ++ expect(socket).to receive(:write).with( ++ "GET /socket HTTP/1.1\r\n" + ++ "Host: www.example.com:3000\r\n" + ++ "Upgrade: websocket\r\n" + ++ "Connection: Upgrade\r\n" + ++ "Sec-WebSocket-Key: 2vBVWg4Qyk3ZoM/5d3QD9Q==\r\n" + ++ "Sec-WebSocket-Version: 13\r\n" + ++ "\r\n") ++ driver.start ++ end ++ end ++ + describe "with custom headers" do + before do + driver.set_header "User-Agent", "Chrome" +-- +2.27.0 + diff --git a/rubygem-websocket-driver.spec b/rubygem-websocket-driver.spec index 9c19ad0..5ba18bc 100644 --- a/rubygem-websocket-driver.spec +++ b/rubygem-websocket-driver.spec @@ -1,12 +1,13 @@ %global gem_name websocket-driver Name: rubygem-%{gem_name} Version: 0.6.5 -Release: 1 +Release: 2 Summary: WebSocket protocol handler with pluggable I/O License: MIT URL: http://github.com/faye/websocket-driver-ruby Source0: https://rubygems.org/gems/websocket-driver-%{version}.gem Source1: https://github.com/faye/websocket-driver-ruby/archive/%{version}.tar.gz +Patch0: Fix-handling-of-default-ports-on-ruby-3.1.patch BuildRequires: ruby(release) rubygems-devel ruby-devel gcc rubygem(websocket-extensions) BuildRequires: rubygem(rspec) %description @@ -26,7 +27,7 @@ Documentation for %{name}. %prep gem unpack %{SOURCE0} -%setup -q -D -T -n %{gem_name}-%{version} +%setup -q -D -T -n %{gem_name}-%{version} -b1 gem spec %{SOURCE0} -l --ruby > %{gem_name}.gemspec %build @@ -46,6 +47,7 @@ pushd .%{gem_instdir} tar xf %{SOURCE1} cd %{gem_name}-ruby-%{version} sed -i '/bundler/ s/^/#/' spec/spec_helper.rb +cat %{PATCH0} | patch -p1 rspec -I$(dirs +1)%{gem_extdir_mri} spec popd @@ -64,5 +66,8 @@ popd %{gem_instdir}/examples %changelog +* Tue Jan 17 2023 wulei - 0.6.5-2 +- Fix handling of default ports on Ruby 3.1 + * Sat Aug 8 2020 yanan li - 0.6.5-1 - Package init