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
+%>