Commit 0545189
Changed files (4)
spec
minbox
lib/minbox/client.rb
@@ -0,0 +1,45 @@
+module Minbox
+ class Client
+ attr_reader :host, :socket, :mail
+
+ def initialize(host, socket)
+ @host = host
+ @socket = socket
+ @mail = { headers: [], body: [] }
+ end
+
+ def mail_message
+ socket.puts "220"
+ ehlo, _client_domain = socket.gets.split(" ")
+
+ if ["HELO", "EHLO"].include?(ehlo)
+ socket.puts "250-#{host}"
+ socket.puts "250 OK"
+ else
+ logger.error 'Ooops...'
+ socket.close
+ return
+ end
+
+ data = socket.gets
+ until data.start_with?("DATA")
+ mail[:headers] << data
+ socket.puts "250 OK"
+ data = socket.gets
+ end
+ socket.puts "354 End data with <CR><LF>.<CR><LF>"
+
+ data = socket.gets
+ until data.match(/^\.\r\n$/)
+ mail[:body] << data
+ data = socket.gets
+ end
+
+ socket.puts "250 OK"
+ socket.puts "221 Bye"
+ socket.close
+
+ Mail.new(mail[:body].join)
+ end
+ end
+end
lib/minbox/server.rb
@@ -2,7 +2,7 @@ module Minbox
class Server
attr_reader :host, :port, :logger
- def initialize(host, port, logger = Minbox.logger)
+ def initialize(host = 'localhost', port = 25, logger = Minbox.logger)
@host = host
@port = port
@logger = logger
@@ -19,40 +19,8 @@ module Minbox
end
end
- def handle(client)
- mail = { headers: [], body: [] }
-
- client.puts "220"
- ehlo, _client_domain = client.gets.split(" ")
-
- if ["HELO", "EHLO"].include?(ehlo)
- client.puts "250-#{host}"
- client.puts "250 OK"
- else
- logger.error 'Ooops...'
- client.close
- return
- end
-
- data = client.gets
- until data.start_with?("DATA")
- mail[:headers] << data
- client.puts "250 OK"
- data = client.gets
- end
- client.puts "354 End data with <CR><LF>.<CR><LF>"
-
- data = client.gets
- until data.match(/^\.\r\n$/)
- mail[:body] << data
- data = client.gets
- end
-
- client.puts "250 OK"
- client.puts "221 Bye"
- client.close
-
- Mail.new(mail[:body].join)
+ def handle(socket)
+ Client.new(host, socket).mail_message
end
end
end
lib/minbox.rb
@@ -3,6 +3,7 @@ require 'logger'
require "minbox/core"
require "minbox/publisher"
+require "minbox/client"
require "minbox/server"
require "minbox/version"
spec/minbox/server_spec.rb
@@ -0,0 +1,14 @@
+RSpec.describe Minbox::Server do
+ subject { described_class.new }
+
+ describe "#handle" do
+ context "when handling a simple client" do
+ let(:client) { StringIO.new }
+
+ specify do
+ client.puts("EHLO localhost")
+ subject.handle(client)
+ end
+ end
+ end
+end