diff --git a/lib/net/nntp.rb b/lib/net/nntp.rb index dadb2b7..84eb65b 100644 --- a/lib/net/nntp.rb +++ b/lib/net/nntp.rb @@ -10,6 +10,8 @@ class NNTP include Socket::Constants + attr_reader :response + def initialize(server, port = 119) @server = server @port = port @@ -24,7 +26,8 @@ def initialize(server, port = 119) retry end - response = _response + response = Net::NNTP::Response.parse(@socket.readline) + if response.code == 400 || response.code == 502 raise ServiceUnavailableException.new(response_code.to_s) end @@ -48,16 +51,13 @@ def reconnect retry end - response = _response + response = Net::NNTP::Response.parse(@socket.readline) + if response.code == 400 || response.code == 502 raise ServiceUnavailableException.new(response_code.to_s) end end - def _response - Net::NNTP::Response.parse(@socket.readline) - end - def read_multiline(limit = nil) lines, buffer = 0, "" while true @@ -81,13 +81,11 @@ def self.start(server, port = 119) end def mode_reader - @socket.write("MODE READER\r\n"); - _response + ask('MODE READER') end def listgroup(newsgroup = nil, limit = nil) - @socket.write("LISTGROUP #{newsgroup}\r\n") - response = _response + ask("LISTGROUP #{newsgroup}") if response.code == 211 return read_multiline(limit).split("\n").map {|n| n.strip.to_i} @@ -97,8 +95,7 @@ def listgroup(newsgroup = nil, limit = nil) end def article(message_id) - @socket.write("ARTICLE #{message_id}\r\n") - response = _response + ask("ARTICLE #{message_id}") if response.code == 220 return Net::NNTP::Article.parse(read_multiline) @@ -108,8 +105,7 @@ def article(message_id) end def head(message_id) - @socket.write("HEAD #{message_id}\r\n") - response = _response + ask("HEAD #{message_id}") if response.code == 221 return Net::NNTP::Article.parse(read_multiline) @@ -119,21 +115,17 @@ def head(message_id) end def group(newsgroup) - @socket.write("GROUP #{newsgroup}\r\n") - response = _response - + ask("GROUP #{newsgroup}") response.code == 211 end def auth(username, password) - @socket.write("AUTHINFO USER #{username}\r\n") - response = _response + ask("AUTHINFO USER #{username}") if response.code == 281 return true elsif response.code == 381 - @socket.write("AUTHINFO PASS #{password}\r\n") - response = _response + ask("AUTHINFO PASS #{password}") if response.code == 281 return true end @@ -141,5 +133,12 @@ def auth(username, password) false end + + private + + def ask(message) + @socket.write("#{message}\r\n") + @response = Net::NNTP::Response.parse(@socket.readline) + end end end