Missing timeout for the CAPABILITY command
还没有人认领这个 Issue。
评估
- 难度
- 4/5
- 预计耗时
- 3-5 天
- 新手友好度
- 35/100
- Issue 类型
- 功能
- 描述清晰度
- 需要澄清
- 活跃度
- 停滞
- 技术栈
- ruby
- 领域
- api, networking
调研方向
从 lib/net/imap.rb 中的 capability、send_command 和 get_tagged_response 开始,它们出现在报告的回溯中。使用示例服务器重现挂起的 CAPABILITY 交换,并检查周围的命令和响应处理。为受影响的操作指定并强制执行适当的可配置超时后,即视为完成。
由索引模型根据 Issue 内容生成。
描述
Version: net-imap (0.4.8)
Ruby: 3.2.2
Description
I'm using net-imap for fetching emails in some background jobs. There are rare cases where the email provider Microsoft Exchange returns no or an unexpected answer for the CAPABILITY command. This blocks my background jobs for a long time, sometimes more than 30 minutes. At some point of time a Errno::ECONNRESET (Connection reset by peer) exception is thrown, I assume when Microsoft Exchange closes the connection.
Backtrace
/home/foo/.rbenv/versions/3.2.2/lib/ruby/3.2.0/monitor.rb:108:in `sleep'
/home/foo/.rbenv/versions/3.2.2/lib/ruby/3.2.0/monitor.rb:108:in `wait'
/home/foo/.rbenv/versions/3.2.2/lib/ruby/3.2.0/monitor.rb:108:in `wait_for_cond'
/home/foo/.rbenv/versions/3.2.2/lib/ruby/3.2.0/monitor.rb:108:in `wait'
/var/www/foo/shared/bundle/ruby/3.2.0/gems/net-imap-0.4.8/lib/net/imap.rb:2701:in `get_tagged_response'
/var/www/foo/shared/bundle/ruby/3.2.0/gems/net-imap-0.4.8/lib/net/imap.rb:2794:in `block in send_command'
/home/foo/.rbenv/versions/3.2.2/lib/ruby/3.2.0/monitor.rb:202:in `synchronize'
/home/foo/.rbenv/versions/3.2.2/lib/ruby/3.2.0/monitor.rb:202:in `mon_synchronize'
/var/www/foo/shared/bundle/ruby/3.2.0/gems/net-imap-0.4.8/lib/net/imap.rb:2776:in `send_command'
/var/www/foo/shared/bundle/ruby/3.2.0/gems/net-imap-0.4.8/lib/net/imap.rb:1077:in `block in capability'
/home/foo/.rbenv/versions/3.2.2/lib/ruby/3.2.0/monitor.rb:202:in `synchronize'
/home/foo/.rbenv/versions/3.2.2/lib/ruby/3.2.0/monitor.rb:202:in `mon_synchronize'
/var/www/foo/shared/bundle/ruby/3.2.0/gems/net-imap-0.4.8/lib/net/imap.rb:1076:in `capability'
/var/www/foo/shared/bundle/ruby/3.2.0/gems/net-imap-0.4.8/lib/net/imap.rb:987:in `capabilities'
/var/www/foo/shared/bundle/ruby/3.2.0/gems/net-imap-0.4.8/lib/net/imap.rb:972:in `capable?'
/var/www/foo/shared/bundle/ruby/3.2.0/gems/net-imap-0.4.8/lib/net/imap.rb:1310:in `authenticate'
Feature request
Does it make sense, that one can configure a global timeout or a timeout for individual actions (e.g. https://github.com/ruby/net-imap/blob/v0.4.8/lib/net/imap.rb#L2689) within this gem? Or do you recommend e.g. wrapping gem code into own Timeout blocks?
Example
require 'ostruct'
require 'net/imap'
require 'socket'
require 'active_support/all'
class MailServer
CRLF = "\r\n".freeze
def initialize(port)
@server = TCPServer.new(port)
puts "Mail server started on port #{port}"
end
def start
loop do
Thread.start(@server.accept) do |client|
puts "Connection established with #{client.peeraddr[2]}"
client.puts "* OK The Microsoft Exchange IMAP4 service is ready.#{CRLF}"
loop do
request = client.gets&.chomp
break if request.blank?
case request
when 'RUBY0001 CAPABILITY'
client.puts "* CAPABILITY IMAP4 IMAP4rev1 AUTH=PLAIN AUTH=XOAUTH2 SASL-IR UIDPLUS ID UNSELECT CHILDREN IDLE NAMESPACE LITERAL+#{CRLF}"
client.puts "RUBY0001 OK CAPABILITY completed.#{CRLF}"
when 'RUBY0002 AUTHENTICATE XOAUTH2 dXNlcj11c2VyAWF1dGg9QmVhcmVyIHRlc3QxMjMBAQ=='
client.puts "RUBY0002 OK AUTHENTICATE completed.#{CRLF}"
else
client.puts "* ERR Unknown command #{request}" + CRLF
end
end
client.close
puts "Connection closed with #{client.peeraddr[2]}"
end
end
end
def stop
@server&.close
puts 'Mail server stopped'
end
end
server = MailServer.new(2000)
Thread.new { server.start }
sleep 1
Net::IMAP.new('localhost', port: 2000).authenticate('XOAUTH2', 'user', 'test123')
Dropping the line client.puts "RUBY0001 OK CAPABILITY completed.#{CRLF}" will block the script for unlimited time.
- 主要语言
- Ruby
- 星标
- 121
- 派生
- 47
- 平均合并
- 19 小时 25 分钟
- 30 天内合并 PR
- 3
环境准备
这个项目没有提供开发容器、Dockerfile 或贡献指南,环境需要你自己搭建:先看它的 README,通用步骤见我们的新手贡献指南。
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
ruby/net-imap 的其他 Issue
-
难度 2/5 1-3 小时 新手友好度 77/100
-
bug
难度 5/5 一周以上 新手友好度 30/100
-
难度 3/5 1-2 天 新手友好度 25/100
-
难度 5/5 一周以上 新手友好度 15/100
-
难度 5/5 一周以上 新手友好度 20/100
相似的 Issue
-
难度 2/5 1-3 小时 新手友好度 74/100
维护者通常 1 天内回复
-
Websockify heartbeat for vnc_container可能已有人在做 @robinkar 今天认领。 未关闭
难度 2/5 1-3 小时 新手友好度 76/100
维护者通常 1 天内回复
-
needs verification
难度 2/5 1-3 小时 新手友好度 68/100
维护者通常 7 天内回复
-
难度 1/5 1 小时以内 新手友好度 88/100
akitaonrails/ai-book-2026#13 ·
-
Mend: dependency security vulnerability
难度 2/5 1-3 小时 新手友好度 63/100
维护者通常 1 天内回复