Class: Mrt::Ingest::OneTimeServer
- Inherits:
-
Object
- Object
- Mrt::Ingest::OneTimeServer
- Defined in:
- lib/mrt/ingest/one_time_server.rb
Instance Method Summary collapse
-
#add_file(sourcefile = nil) ⇒ Object
Add a file to this server.
-
#finished? ⇒ Boolean
Return true if each file has been served.
-
#get_open_port(start = 8080) ⇒ Object
Find an open port, starting with start and adding one until we get an open port.
- #get_temppath ⇒ Object
-
#initialize ⇒ OneTimeServer
constructor
A new instance of OneTimeServer.
-
#join_server ⇒ Object
Wait for server to finish serving all files.
-
#run ⇒ Object
Run the server and wait until each file has been served once.
- #start_server ⇒ Object
-
#stop_server ⇒ Object
Stop server unconditionally.
Constructor Details
#initialize ⇒ OneTimeServer
Returns a new instance of OneTimeServer.
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
# File 'lib/mrt/ingest/one_time_server.rb', line 25 def initialize @dir = Dir.mktmpdir @mutex = Mutex.new @known_paths = {} @requested = {} @port = get_open_port() @file_callback = lambda do |req, res| @requested[req.path] ||= true end config = { :Port => @port } @server = WEBrick::HTTPServer.new(config) @server.mount("/", WEBrick::HTTPServlet::FileHandler, @dir, { :FileCallback=>@file_callback }) end |
Instance Method Details
#add_file(sourcefile = nil) ⇒ Object
Add a file to this server. Returns the URL to use to fetch the file & the file path
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
# File 'lib/mrt/ingest/one_time_server.rb', line 69 def add_file(sourcefile=nil) fullpath = get_temppath() path = File.basename(fullpath) if !sourcefile.nil? then @server.mount("/#{path}", WEBrick::HTTPServlet::FileHandler, sourcefile.path, { :FileCallback=>@file_callback }) else File.open(fullpath, 'w+') do |f| yield f end end return "http://#{Socket.gethostname}:#{@port}/#{path}", fullpath end |
#finished? ⇒ Boolean
Return true if each file has been served.
42 43 44 45 46 47 48 49 50 |
# File 'lib/mrt/ingest/one_time_server.rb', line 42 def finished? Dir.entries(@dir).each do |entry| next if (entry == "." || entry == "..") if @requested["/#{entry}"].nil? then return false end end return true end |
#get_open_port(start = 8080) ⇒ Object
Find an open port, starting with start and adding one until we get an open port
12 13 14 15 16 17 18 19 20 21 22 23 |
# File 'lib/mrt/ingest/one_time_server.rb', line 12 def get_open_port(start=8080) try_port = start while (true) begin s = TCPServer.open(try_port) s.close return try_port rescue Errno::EADDRINUSE try_port = try_port + 1 end end end |
#get_temppath ⇒ Object
52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
# File 'lib/mrt/ingest/one_time_server.rb', line 52 def get_temppath tmpfile = Tempfile.new("tmp", @dir) tmppath = tmpfile.path tmpfile.close! @mutex.synchronize do if !@known_paths.has_key?(tmppath) then # no collision @known_paths[tmppath] = true return tmppath end end # need to retry, there was a collision return get_temppath end |
#join_server ⇒ Object
Wait for server to finish serving all files.
99 100 101 102 103 104 |
# File 'lib/mrt/ingest/one_time_server.rb', line 99 def join_server # ensure that each file is requested once before shutting down while (!self.finished?) do sleep(1) end @server.shutdown @thread.join end |
#run ⇒ Object
Run the server and wait until each file has been served once. Cleans up files before it returns.
108 109 110 111 112 113 |
# File 'lib/mrt/ingest/one_time_server.rb', line 108 def run start_server() join_server() # FileUtils.rm_rf(@dir) return end |
#start_server ⇒ Object
85 86 87 88 89 90 |
# File 'lib/mrt/ingest/one_time_server.rb', line 85 def start_server @thread = Thread.new do @server.start end return @thread end |
#stop_server ⇒ Object
Stop server unconditionally.
93 94 95 96 |
# File 'lib/mrt/ingest/one_time_server.rb', line 93 def stop_server @server.shutdown @thread.join end |