njh / ruby-mqtt

Pure Ruby gem that implements the MQTT protocol, a lightweight protocol for publish/subscribe messaging.
http://www.rubydoc.info/gems/mqtt
MIT License
541 stars 135 forks source link

`client.connected?` returns even if the connection was refused with an exception #81

Closed spidergears closed 8 years ago

spidergears commented 8 years ago

Steps to reproduce:

require 'mqtt'
 => true 
2.3.0 :002 > client = MQTT::Client.new('localhost', 1883)
 => #<MQTT::Client:0x007ff321a03c98 @host="localhost", @port=1883, @version="3.1.0", @keep_alive=15, @clean_session=true, @client_id=nil, @ack_timeout=5, @username=nil, @password=nil, @will_topic=nil, @will_payload=nil, @will_qos=0, @will_retain=false, @ssl=false, @last_ping_request=2016-07-22 22:57:40 +0530, @last_ping_response=2016-07-22 22:57:40 +0530, @socket=nil, @read_queue=#<Thread::Queue:0x007ff3218867d0>, @pubacks={}, @read_thread=nil, @write_semaphore=#<Thread::Mutex:0x007ff321886438>, @pubacks_semaphore=#<Thread::Mutex:0x007ff321886410>> 
2.3.0 :003 > client.connect('wa')
MQTT::ProtocolException: Connection refused: not authorised
    from /Users/spidergears/.rvm/gems/ruby-2.3.0/gems/mqtt-0.4.0/lib/mqtt/client.rb:533:in `block in receive_connack'
    from /Users/spidergears/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/timeout.rb:91:in `block in timeout'
    from /Users/spidergears/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/timeout.rb:33:in `block in catch'
    from /Users/spidergears/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/timeout.rb:33:in `catch'
    from /Users/spidergears/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/timeout.rb:33:in `catch'
    from /Users/spidergears/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/timeout.rb:106:in `timeout'
    from /Users/spidergears/.rvm/gems/ruby-2.3.0/gems/mqtt-0.4.0/lib/mqtt/client.rb:523:in `receive_connack'
    from /Users/spidergears/.rvm/gems/ruby-2.3.0/gems/mqtt-0.4.0/lib/mqtt/client.rb:290:in `connect'
    from (irb):3
    from /Users/spidergears/.rvm/rubies/ruby-2.3.0/bin/irb:11:in `<main>'
2.3.0 :004 > client.connected?
 => true 
spidergears commented 8 years ago

I am running mosquitto mqtt broker with protocol version 3.1.1

njh commented 8 years ago

Thanks for reporting, I will take a look

njh commented 8 years ago

Reproduced this using:

#!/usr/bin/env ruby
$:.unshift File.dirname(__FILE__)+'/lib'

require 'mqtt'

client = MQTT::Client.new
client.host = 'test.mosquitto.org'
client.username = 'root'
client.password = 'toor'

begin 
  client.connect
rescue MQTT::ProtocolException => exp
  p exp
end

p client.connected?