mikabytes
mikabytes

Reputation: 2169

Ruby readline fails if process started with arguments

I'm having the strangest issue. This code below works fine:

require 'json'
require 'net/http'
h = Net::HTTP.new("localhost", 4567) 
while(l = gets.chomp!)
   res = h.post("/api/v1/service/general",l)
   puts res.body
end

However, with the small modification of getting host/port from parameters:

require 'json'
require 'net/http'
h = Net::HTTP.new(ARGV[0], ARGV[1]) 
while(l = gets.chomp!)
   res = h.post("/api/v1/service/general",l)
   puts res.body
end

..and starting with ruby service.rb localhost 4567 ...

I get this error:

service.rb:4:in `gets': No such file or directory - localhost (Errno::ENOENT)

Using ruby 1.9.2p0 on Ubuntu 11.04

Upvotes: 6

Views: 866

Answers (2)

Michael Kohl
Michael Kohl

Reputation: 66837

Have you tried while (l = $stdin.gets.chomp!)? Otherwise Kernel#gets reads from ARGV.

Upvotes: 12

Mat
Mat

Reputation: 206689

Try it like this:

h = Net::HTTP.new(ARGV.shift, ARGV.shift) 
while(l = gets.chomp!)

It will still fail if you pass in more than two arguments. You should call ARGV.clear after constructing h if you want to deal with that.

Upvotes: 1

Related Questions