diff --git a/trunk/ripnews/news/article.rb b/trunk/ripnews/news/article.rb index 8286c1e..3482b75 100644 --- a/trunk/ripnews/news/article.rb +++ b/trunk/ripnews/news/article.rb @@ -71,19 +71,9 @@ end def get_articles(cachedir=false) for server in @connections.keys - begin - resp, count, first, last, name = @connections[server]["nntp"].group(@group) - @connections[server]["first"] = first ? first : 0 - @connections[server]["last"] = last ? last : 0 - rescue Net::NNTP::RuntimeError - print "Couldn't open group: #{@group}\n" - return false - rescue Errno::EPIPE, Errno::ECONNRESET - print "Caught Errno::EPIPE reading from server #{server}\n" - print "Error: #{$!}\n" - reconnect(server) - retry - end + first, last = get_group_info(server, @group) + @connections[server]["first"] = first ? first : 0 + @connections[server]["last"] = last ? last : 0 end read_cache(cachedir) for server in @connections.keys @@ -102,45 +92,97 @@ def get_articles(cachedir=false) unless rangelist == nil or rangelist =~ /^$/ for i in rangelist.split(',') print "i: #{i}\n" if Debuglevel > 1 - begin - resp, subj_lines = @connections[server]["nntp"].xhdr("subject", i) - unless resp.to_i >= 200 and resp.to_i < 300 - print "got response #{resp} while reading group #{@group} from #{server}\n" - return false + resp, subj_lines = get_xhdr(server, i, "subject") + next unless resp + resp, messid_lines = get_xhdr(server, i, "message-id") + next unless resp + + art = {} + subj_lines.collect{|x| + art[x[0]] = {} unless art.has_key?(x[0]) + art[x[0]]["subject"] = x[1] + print "art id: #{x[0]} subj: #{x[1]}\n" if Debuglevel > 1 + } + messid_lines.collect{|x| + art[x[0]] = {} unless art.has_key?(x[0]) + art[x[0]]["messid"] = x[1] + print "art id: #{x[0]} messid: #{x[1]}\n" if Debuglevel > 1 + } + for id in art.keys + if art[id].has_key?("subject") and art[id].has_key?("messid") + print "adding: #{art[id]["messid"]}, #{id}, #{server}, #{art[id]["subject"]}\n" if Debuglevel > 1 + add(art[id]["messid"], id, server, art[id]["subject"]) end - resp, messid_lines = @connections[server]["nntp"].xhdr("message-id", i) - unless resp.to_i >=200 and resp.to_i < 300 - print "got response #{resp} while reading group #{@group} from #{server}\n" - return false - end - art = {} - subj_lines.collect{|x| - art[x[0]] = {} unless art.has_key?(x[0]) - art[x[0]]["subject"] = x[1] - print "art id: #{x[0]} subj: #{x[1]}\n" if Debuglevel > 1 - } - messid_lines.collect{|x| - art[x[0]] = {} unless art.has_key?(x[0]) - art[x[0]]["messid"] = x[1] - print "art id: #{x[0]} messid: #{x[1]}\n" if Debuglevel > 1 - } - for id in art.keys - if art[id].has_key?("subject") and art[id].has_key?("messid") - print "adding: #{art[id]["messid"]}, #{id}, #{server}, #{art[id]["subject"]}\n" if Debuglevel > 1 - add(art[id]["messid"], id, server, art[id]["subject"]) - end - end - rescue Net::NNTP::RuntimeError - print "Caught Net::NNTP::RuntimeError reading from server #{server}\n" - print "Error: #{$!}\n" - rescue Errno::EPIPE, Errno::ECONNRESET - print "Caught Errno::EPIPE reading from server #{server}\n" - print "Error: #{$!}\n" - reconnect(server) - retry end end end + end + save_cache(cachedir) +end + +def get_group_info(server, group) + timedout = 0 + resp = "" + first = "" + last = "" + begin + if timedout > 1 + print "Too many timeouts!\n" + return false + end + timeout(180) do + begin + resp, count, first, last, name = @connections[server]["nntp"].group(group) + rescue Net::NNTP::RuntimeError + print "Couldn't open group: #{group}\n" + return false + rescue Errno::EPIPE, Errno::ECONNRESET + print "Caught Errno::EPIPE reading from server #{server}\n" + print "Error: #{$!}\n" + retry if reconnect(server) + end + end + return first, last if resp + rescue TimeoutError + print "Time out, reconnecting to server\n" + timedout += 1 + retry if reconnect(server) + end + return false +end + +def get_xhdr(server, range, header) + timedout = 0 + resp = "" + lines = [] + begin + if timedout > 1 + print "Too many timeouts!\n" + return false + end + timeout(180) do + begin + resp, lines = @connections[server]["nntp"].xhdr(header, range) + unless resp.to_i >= 200 and resp.to_i < 300 + print "got response #{resp} while reading group #{@group} from #{server}\n" + return false + end + rescue Net::NNTP::RuntimeError + print "Caught Net::NNTP::RuntimeError reading from server #{server}\n" + print "Error: #{$!}\n" + rescue Errno::EPIPE, Errno::ECONNRESET + print "Caught Errno::EPIPE reading from server #{server}\n" + print "Error: #{$!}\n" + retry if reconnect(server) + end + end + return resp, lines + rescue TimeoutError + print "Time out, reconnecting to server\n" + timedout += 1 + retry if reconnect(server) + end +end # if xhdr doesn't work, this should be used # for i in (range.diff(@connections[server]["skip_ids"]).elements) @@ -161,9 +203,6 @@ def get_articles(cachedir=false) # print "whoopsie couldn't stat #{i}\n" if Debuglevel > 1 # end # end - end - save_cache(cachedir) -end def get_groups group_subjects unless @grouped @@ -189,7 +228,7 @@ def get_body(server, message) begin resp, id, messid, list = @connections[server]["nntp"].body(message) rescue Net::NNTPReplyError - print "Caught Net::NNTPReplyError reading article #{messid} from #{server}\n" + print "Caught Net::NNTPReplyError reading article #{message} from #{server}\n" print "Error: #{$!}\n" return false rescue Errno::EPIPE, Errno::ECONNRESET @@ -202,9 +241,8 @@ def get_body(server, message) return resp, id, messid, list rescue TimeoutError print "Time out, reconnecting to server\n" - reconnect(server) timedout += 1 - retry + retry if reconnect(server) end end