Commit 0545189

mokha <mokha@cisco.com>
2019-03-03 19:06:30
extract client class.
1 parent 884a94c
Changed files (4)
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