https://github.com/imanel/websocket-ruby/commit/736a7515aff808a5c268b87066e928b59aed769e From 736a7515aff808a5c268b87066e928b59aed769e Mon Sep 17 00:00:00 2001 From: Bernard Potocki Date: Thu, 17 Feb 2022 20:02:21 +0100 Subject: [PATCH] Ensure correct port is always specified (#48) --- a/lib/websocket/handshake/base.rb +++ b/lib/websocket/handshake/base.rb @@ -7,7 +7,7 @@ class Base include ExceptionHandler include NiceInspect - attr_reader :host, :port, :path, :query, + attr_reader :host, :path, :query, :state, :version, :secure, :headers, :protocols @@ -66,6 +66,20 @@ def leftovers (@leftovers.to_s.split("\n", reserved_leftover_lines + 1)[reserved_leftover_lines] || '').strip end + # Return default port for protocol (80 for ws, 443 for wss) + def default_port + secure ? 443 : 80 + end + + # Check if provided port is a default one + def default_port? + port == default_port + end + + def port + @port || default_port + end + # URI of request. # @return [String] Full URI with protocol # @example @@ -73,7 +87,7 @@ def leftovers def uri uri = String.new(secure ? 'wss://' : 'ws://') uri << host - uri << ":#{port}" if port + uri << ":#{port}" unless default_port? uri << path uri << "?#{query}" if query uri --- a/lib/websocket/handshake/client.rb +++ b/lib/websocket/handshake/client.rb @@ -61,7 +61,7 @@ def initialize(args = {}) uri = URI.parse(@url || @uri) @secure ||= (uri.scheme == 'wss') @host ||= uri.host - @port ||= uri.port + @port ||= uri.port || default_port @path ||= uri.path @query ||= uri.query end --- a/lib/websocket/handshake/handler/client04.rb +++ b/lib/websocket/handshake/handler/client04.rb @@ -21,7 +21,7 @@ def handshake_keys %w[Connection Upgrade] ] host = @handshake.host - host += ":#{@handshake.port}" if @handshake.port + host += ":#{@handshake.port}" unless @handshake.default_port? keys << ['Host', host] keys += super keys << ['Sec-WebSocket-Origin', @handshake.origin] if @handshake.origin --- a/lib/websocket/handshake/handler/client75.rb +++ b/lib/websocket/handshake/handler/client75.rb @@ -18,7 +18,7 @@ def handshake_keys %w[Connection Upgrade] ] host = @handshake.host - host += ":#{@handshake.port}" if @handshake.port + host += ":#{@handshake.port}" unless @handshake.default_port? keys << ['Host', host] keys << ['Origin', @handshake.origin] if @handshake.origin keys << ['WebSocket-Protocol', @handshake.protocols.first] if @handshake.protocols.any? --- a/lib/websocket/handshake/server.rb +++ b/lib/websocket/handshake/server.rb @@ -129,13 +129,13 @@ def should_respond? # Host of server according to client header # @return [String] host def host - @headers['host'].to_s.split(':')[0].to_s + @host || @headers['host'].to_s.split(':')[0].to_s end # Port of server according to client header - # @return [String] port + # @return [Integer] port def port - @headers['host'].to_s.split(':')[1] + (@port || @headers['host'].to_s.split(':')[1] || default_port).to_i end private --- a/spec/support/all_client_drafts.rb +++ b/spec/support/all_client_drafts.rb @@ -38,6 +38,10 @@ def validate_request expect(handshake.query).to eql('aaa=bbb') end + it 'returns default port' do + expect(handshake.port).to be(80) + end + it 'returns valid port' do @request_params = { port: 123 } expect(handshake.port).to be(123) --- a/spec/support/all_server_drafts.rb +++ b/spec/support/all_server_drafts.rb @@ -47,11 +47,17 @@ def validate_request expect(handshake.query).to eql('aaa=bbb') end + it 'returns default port' do + handshake << client_request + + expect(handshake.port).to be(80) + end + it 'returns valid port' do @request_params = { port: 123 } handshake << client_request - expect(handshake.port).to eql('123') + expect(handshake.port).to be(123) end it 'returns valid response' do