diff --git a/lib/logstash/web/public/js/logstash.js b/lib/logstash/web/public/js/logstash.js index a63fadcf2..60681020f 100644 --- a/lib/logstash/web/public/js/logstash.js +++ b/lib/logstash/web/public/js/logstash.js @@ -7,6 +7,11 @@ }, search: function(query) { + if (query == undefined || query == "") { + return; + } + var display_query = query.replace("<", "<").replace(">", ">") + $("#querystatus").html("Loading query '" + display_query + "'") logstash.params.q = query; document.location.hash = escape(JSON.stringify(logstash.params)); $("#results").load("/search/ajax", logstash.params); diff --git a/lib/logstash/web/server.rb b/lib/logstash/web/server.rb index e4da165fc..8ac0f10fe 100755 --- a/lib/logstash/web/server.rb +++ b/lib/logstash/web/server.rb @@ -32,17 +32,51 @@ class LogStash::Web::Server < Sinatra::Base end # '/' aget '/search' do - headers({"Content-Type" => "text/html" }) + result_callback = proc do + status 500 if @error + + params[:format] ||= "html" + case params[:format] + when "html" + headers({"Content-Type" => "text/html" }) + body haml :"search/results", :layout => !request.xhr? + when "text" + headers({"Content-Type" => "text/plain" }) + body erb :"search/results.txt", :layout => false + when "txt" + headers({"Content-Type" => "text/plain" }) + body erb :"search/results.txt", :layout => false + when "json" + headers({"Content-Type" => "text/plain" }) + hits = @hits.collect { |h| h["_source"] } + response = { + "hits" => hits, + "facets" => (@results["facets"] rescue nil), + } + + response["error"] = @error if @error + body response.to_json + end # case params[:format] + end # proc result_callback + + # We'll still do a search query here even though most users + # have javascript enabled, we need to show the results in + # case a user doesn't have javascript. if params[:q] and params[:q] != "" elasticsearch.search(params) do |@results| @hits = (@results["hits"]["hits"] rescue []) - body haml :"search/results", :layout => !request.xhr? + begin + result_callback.call + rescue => e + puts e + end end else + #@error = "No query given." @hits = [] - body haml :"search/results", :layout => !request.xhr? + result_callback.call end - end + end # aget '/search' apost '/search/ajax' do headers({"Content-Type" => "text/html" }) diff --git a/lib/logstash/web/views/search/ajax.haml b/lib/logstash/web/views/search/ajax.haml index 7f11fc4fd..97ca46735 100644 --- a/lib/logstash/web/views/search/ajax.haml +++ b/lib/logstash/web/views/search/ajax.haml @@ -31,9 +31,9 @@ last - if @hits.length == 0 - if !params[:q] - No query given. How about this? + %h3#querystatus No query given. How about this? - else - No results for query '#{params[:q]}' + %h3#querystatus No results for query '#{params[:q]}' - else %table.results %tr diff --git a/lib/logstash/web/views/search/results.txt.erb b/lib/logstash/web/views/search/results.txt.erb new file mode 100644 index 000000000..d6d71db94 --- /dev/null +++ b/lib/logstash/web/views/search/results.txt.erb @@ -0,0 +1,10 @@ +<% + # Sinatra currently doesn't do ERB with newline trimming, so we + # have to write this funky mishmosh that is hard to read. +if @error %>Error: <%= @error %><% else + @hits.each do |hit| + event = LogStash::Event.new(hit["_source"]) +%><%= event.message || event.to_hash.to_json %> +<% end + end +%>