#!/usr/bin/env ruby require "optparse" require "pp" require "rexml/document" $:.unshift(File.join(File.dirname(__FILE__), "/../lib")) require "httparty" opts = { :action => :get, :headers => {}, :verbose => false } def die(msg) STDERR.puts(msg) exit 1 end OptionParser.new do |o| o.banner = "USAGE: #{$0} [options] [url]" o.on("-f", "--format [FORMAT]", "Output format to use instead of pretty-print ruby: " + "plain, json or xml") do |f| opts[:output_format] = f.downcase.to_sym end o.on("-a", "--action [ACTION]", "HTTP action: get (default), post, put or delete") do |a| opts[:action] = a.downcase.to_sym end o.on("-d", "--data [BODY]", "Data to put in request body (prefix with '@' for file)") do |d| if d =~ /^@/ opts[:data] = open(d).read else opts[:data] = d end end o.on("-H", "--header [NAME=VALUE]", "Additional HTTP headers in NAME=VALUE form") do |h| die "Invalid header specification, should be Name:Value" unless h =~ /.+:.+/ name, value = h.split(':') opts[:headers][name.strip] = value.strip end o.on("-v", "--verbose", "If set, print verbose output") do |v| opts[:verbose] = true end o.on("-u", "--user [CREDS]", "Use basic authentication. Value should be user:password") do |u| die "Invalid credentials format. Must be user:password" unless u =~ /.+:.+/ user, password = u.split(':') opts[:basic_auth] = { :username => user, :password => password } end o.on("-h", "--help", "Show help documentation") do |h| puts o exit end end.parse! puts "Querying #{ARGV.first} with options: #{opts.inspect}" if opts[:verbose] if ARGV.empty? STDERR.puts "You need to provide a URL" STDERR.puts "USAGE: #{$0} [options] [url]" end # 1.8.6 has mistyping of transitive in if statement module REXML class Document < Element def write( output=$stdout, indent=-1, transitive=false, ie_hack=false ) if xml_decl.encoding != "UTF-8" && !output.kind_of?(Output) output = Output.new( output, xml_decl.encoding ) end formatter = if indent > -1 if transitive REXML::Formatters::Transitive.new( indent, ie_hack ) else REXML::Formatters::Pretty.new( indent, ie_hack ) end else REXML::Formatters::Default.new( ie_hack ) end formatter.write( self, output ) end end end if opts[:output_format].nil? response = HTTParty.send(opts[:action], ARGV.first, opts) puts "Status: #{response.code}" pp response else print_format = opts[:output_format] response = HTTParty.send(opts[:action], ARGV.first, opts) puts "Status: #{response.code}" case opts[:output_format] when :json puts JSON.pretty_generate(response) when :xml REXML::Document.new(response.body).write(STDOUT, 2) puts else puts response end end