diff options
Diffstat (limited to 'spec/ruby/library/net/ftp/fixtures/server.rb')
-rw-r--r-- | spec/ruby/library/net/ftp/fixtures/server.rb | 277 |
1 files changed, 0 insertions, 277 deletions
diff --git a/spec/ruby/library/net/ftp/fixtures/server.rb b/spec/ruby/library/net/ftp/fixtures/server.rb deleted file mode 100644 index ecbed591d5..0000000000 --- a/spec/ruby/library/net/ftp/fixtures/server.rb +++ /dev/null @@ -1,277 +0,0 @@ -module NetFTPSpecs - class DummyFTP - attr_accessor :connect_message - attr_reader :login_user, :login_pass, :login_acct - - # hostname or IP address - attr_reader :hostname - # port number - attr_reader :server_port - - def initialize - @hostname = "localhost" - @server = TCPServer.new(@hostname, 0) - @server_port = @server.addr[1] - - @handlers = {} - @commands = [] - @connect_message = nil - end - - def serve_once - @thread = Thread.new do - @socket = @server.accept - @socket.setsockopt(Socket::SOL_SOCKET, Socket::SO_OOBINLINE, 1) - begin - handle_request - ensure - @socket.close - end - end - end - - def handle_request - # Send out the welcome message. - response @connect_message || "220 Dummy FTP Server ready!" - - begin - while command = @socket.gets - command, argument = command.chomp.split(" ", 2) - - if command == "QUIT" - self.response("221 OK, bye") - break - elsif proc_handler = @handlers[command.downcase.to_sym] - if argument.nil? - proc_handler.call(self) - else - proc_handler.call(self, argument) - end - else - if argument.nil? - self.send(command.downcase.to_sym) - else - self.send(command.downcase.to_sym, argument) - end - end - end - rescue => e - self.error_response("Exception: #{e} #{e.backtrace.inspect}") - end - end - - def error_response(text) - self.response("451 #{text}") - end - - def response(text) - @socket.puts(text) unless @socket.closed? - end - - def stop - @datasocket.close unless @datasocket.nil? || @datasocket.closed? - @server.close - @thread.join - end - - - ## - def handle(sym, &block) - @handlers[sym] = block - end - - def should_receive(method) - @handler_for = method - self - end - - def and_respond(text) - @handlers[@handler_for] = -> s, *args { s.response(text) } - end - - ## - # FTP methods - ## - - def abor - self.response("226 Closing data connection. (ABOR)") - end - - def acct(account) - @login_acct = account - self.response("230 User '#{account}' logged in, proceed. (ACCT)") - end - - def cdup - self.response("200 Command okay. (CDUP)") - end - - def cwd(dir) - self.response("200 Command okay. (CWD #{dir})") - end - - def dele(file) - self.response("250 Requested file action okay, completed. (DELE #{file})") - end - - def eprt(arg) - _, _, host, port = arg.split("|") - - @datasocket = TCPSocket.new(host, port) - self.response("200 port opened") - end - - def help(param = :default) - if param == :default - self.response("211 System status, or system help reply. (HELP)") - else - self.response("211 System status, or system help reply. (HELP #{param})") - end - end - - def list(folder) - self.response("150 opening ASCII connection for file list") - @datasocket.puts("-rw-r--r-- 1 spec staff 507 17 Jul 18:41 last_response_code.rb") - @datasocket.puts("-rw-r--r-- 1 spec staff 50 17 Jul 18:41 list.rb") - @datasocket.puts("-rw-r--r-- 1 spec staff 48 17 Jul 18:41 pwd.rb") - @datasocket.close() - self.response("226 transfer complete (LIST #{folder})") - end - - def mdtm(filename) - self.response("213 19980705132316") - end - - def mkd(foldername) - self.response(%Q{257 "#{foldername.gsub('"', '""')}" created.}) - end - - def nlst(folder = nil) - self.response("150 opening ASCII connection for file list") - @datasocket.puts("last_response_code.rb") - @datasocket.puts("list.rb") - @datasocket.puts("pwd.rb") - @datasocket.close() - self.response("226 transfer complete (NLST#{folder ? " #{folder}" : ""})") - end - - def noop - self.response("200 Command okay. (NOOP)") - end - - def pass(password) - @login_pass = password - self.response("230 User logged in, proceed. (PASS #{password})") - end - - def port(arg) - nums = arg.split(",") - - if nums[0] == "::1" - # IPv6 - port = nums[1].to_i * 256 + nums[2].to_i - host = nums[0] - else - # IPv4 - port = nums[4].to_i * 256 + nums[5].to_i - host = nums[0..3].join(".") - end - - @datasocket = TCPSocket.new(host, port) - self.response("200 port opened") - end - - def pwd - self.response('257 "/some/dir/" - current directory') - end - - def retr(file) - self.response("125 Data transfer starting") - if @restart_at && @restart_at == 20 - @datasocket.puts("of the file named '#{file}'.") - @restart_at = nil - else - @datasocket.puts("This is the content") - @datasocket.puts("of the file named '#{file}'.") - end - @datasocket.close() - self.response("226 Closing data connection. (RETR #{file})") - end - - def rest(at_bytes) - @restart_at = at_bytes.to_i - self.response("350 Requested file action pending further information. (REST)") - end - - def rmd(folder) - self.response("250 Requested file action okay, completed. (RMD #{folder})") - end - - def rnfr(from) - @rename_from = from - self.response("350 Requested file action pending further information.") - end - - def rnto(to) - self.response("250 Requested file action okay, completed. (Renamed #{@rename_from} to #{to})") - @rename_from = nil - end - - def site(param) - self.response("200 Command okay. (SITE #{param})") - end - - def size(filename) - if filename == "binary" - self.response("213 24") - else - self.response("213 1024") - end - end - - def stat(param = :default) - if param == :default - self.response("211 System status, or system help reply. (STAT)") - else - self.response("211 System status, or system help reply. (STAT #{param})") - end - end - - def stor(file) - tmp_file = tmp("#{file}file", false) - - self.response("125 Data transfer starting.") - - mode = @restart_at ? "a" : "w" - - File.open(tmp_file, mode + "b") do |f| - loop do - data = @datasocket.recv(1024) - break if !data || data.empty? - f << data - end - end - - @datasocket.close() - self.response("200 OK, Data received. (STOR #{file})") - end - - def appe(file) - @restart_at = true - stor(file) - end - - def syst - self.response("215 FTP Dummy Server (SYST)") - end - - def type(type) - self.response("200 TYPE switched to #{type}") - end - - def user(name) - @login_user = name - self.response("230 User logged in, proceed. (USER #{name})") - end - end -end |