class LogStash::Outputs::Http

Public Instance Methods

encode(hash) click to toggle source
# File lib/logstash/outputs/http.rb, line 137
def encode(hash)
  return hash.collect do |key, value|
    CGI.escape(key) + "=" + CGI.escape(value)
  end.join("&")
end
receive(event) click to toggle source
# File lib/logstash/outputs/http.rb, line 85
def receive(event)
  return unless output?(event)

  if @mapping
    evt = Hash.new
    @mapping.each do |k,v|
      evt[k] = event.sprintf(v)
    end
  else
    evt = event.to_hash
  end

  case @http_method
  when "put"
    request = @agent.put(event.sprintf(@url))
  when "post"
    request = @agent.post(event.sprintf(@url))
  else
    @logger.error("Unknown verb:", :verb => @http_method)
  end
  
  if @headers
    @headers.each do |k,v|
      request.headers[k] = event.sprintf(v)
    end
  end

  request["Content-Type"] = @content_type

  begin
    if @format == "json"
      request.body = evt.to_json
    elsif @format == "message"
      request.body = event.sprintf(@message)
    else
      request.body = encode(evt)
    end
    #puts "#{request.port} / #{request.protocol}"
    #puts request
    #puts
    #puts request.body
    response = @agent.execute(request)

    # Consume body to let this connection be reused
    rbody = ""
    response.read_body { |c| rbody << c }
    #puts rbody
  rescue Exception => e
    @logger.warn("Unhandled exception", :request => request, :response => response, :exception => e, :stacktrace => e.backtrace)
  end
end
register() click to toggle source
# File lib/logstash/outputs/http.rb, line 59
def register
  require "ftw"
  require "uri"
  @agent = FTW::Agent.new
  # TODO(sissel): SSL verify mode?

  if @content_type.nil?
    case @format
      when "form" ; @content_type = "application/x-www-form-urlencoded"
      when "json" ; @content_type = "application/json"
    end
  end
  if @format == "message"
    if @message.nil?
      raise "message must be set if message format is used"
    end
    if @content_type.nil?
      raise "content_type must be set if message format is used"
    end
    unless @mapping.nil?
      @logger.warn "mapping is not supported and will be ignored if message format is used"
    end
  end
end