diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..a3b16d6 --- /dev/null +++ b/Gemfile @@ -0,0 +1,5 @@ +source 'http://rubygems.org' + +gem 'sinatra' +gem 'sinatra-reloader' +gem 'logger' diff --git a/app.rb b/app.rb new file mode 100644 index 0000000..3d6a1ad --- /dev/null +++ b/app.rb @@ -0,0 +1,46 @@ +require 'sinatra' +require 'sinatra/reloader' +require 'logger' +require 'timeout' +require 'open3' +require "cgi/escape" + +#logger = Logger.new(STDOUT) + +get '/' do + erb :index +end + +post '/' do + if params[:codes] + codes=params[:codes].split("\n") + cmd="ruby -e '#{codes.join("\n")}'" + stdin=params[:stdin].split("\n") + stdout=Array.new + stderr=Array.new + Open3.popen3(cmd) do |i, o, e, w| #=>|stdin, stdout, stderr, wait_thr(status)| + begin + Timeout.timeout(5) do + i.write stdin.join("\n") + i.close + o.each do |line| + stdout.push(line.chomp!.to_s) + end + e.each do |line| + stderr.push(line.chomp!.to_s) + end + status=w.value + @stdout=CGI.escapeHTML(stdout.join("\n")) + @stderr=CGI.escapeHTML(stderr.join("\n")) + @status=CGI.escapeHTML(status.to_s) + end + rescue Timeout::Error => error + Process.kill("KILL", w.pid) + @stderr="Fatal error: Maximum execution time of 5 seconds exceeded\n#{error}" + end + end + @codes=CGI.escapeHTML(codes.join("\n")) + @stdin=CGI.escapeHTML(stdin.join("\n")) + end + erb :index +end diff --git a/views/index.erb b/views/index.erb new file mode 100644 index 0000000..5eaaa9a --- /dev/null +++ b/views/index.erb @@ -0,0 +1,28 @@ + + + + + + Sinatra Rubyブラウザエディタ + + + + + + +
+

↓ここにコードを書く

+ + +

↓ここに標準入力をかく(改行区切り)

+ + + +
+ +

↓実行結果

+ +

↓ステータスコード

+

<%= @status%>

+ +