Skip to content

Instantly share code, notes, and snippets.

@progrium
Created January 6, 2011 04:59
Show Gist options
  • Select an option

  • Save progrium/767521 to your computer and use it in GitHub Desktop.

Select an option

Save progrium/767521 to your computer and use it in GitHub Desktop.
require 'rubygems'
require 'sinatra'
require 'ruby2ruby'
require 'pony'
require 'uri'
def base64_url_decode(str)
str += '=' * (4 - str.length.modulo(4))
Base64.decode64(str.gsub("-", "+").gsub("_", "/"))
end
def base64_url_encode(str)
Base64.encode64(str).gsub("+", "-").gsub("/", "_").gsub(/\s/, '').gsub('=', '')
end
def dumpstate(b)
vars = eval("local_variables", b).reject{|v| v == '_' }
state = {}
vars.each do |var|
val = eval(var, b)
begin
Marshal::dump(val)
state[var] = val
rescue
end
end
[base64_url_encode(Marshal::dump(state)), vars]
end
def loadstate(s, b)
state = Marshal::load(base64_url_decode(s))
state.each do |k,v|
eval("#{k} = Marshal::load(#{Marshal::dump(v).inspect})", b)
end
end
class EvalBug < Exception; end
def run(code)
eval(code)
rescue EvalBug
eval(code)
end
def sproc(b, &block)
return nil unless block_given?
c = Class.new
c.class_eval do
define_method :serializable, &block
end
s = Ruby2Ruby.translate(c, :serializable)
dumped, vars = dumpstate(b)
s.sub(/^def \S+(\(([^\)]*)\))?/, "loadstate(#{dumped.inspect}, binding); "+vars.map{|v| "#{v} rescue raise EvalBug; "}.join).sub(/end$/, '')
end
get '/print' do
puts "hello"
'ok'
end
get '/hi' do
email = 'progrium@gmail.com'
url = URI.parse("http://google.com/hello")
code = sproc(binding) do
Pony.mail(:to => email,
:from => email,
:subject => 'Howdy, Partna!',
:body => url.to_s,
:via => :sendmail)
puts "#{email}: #{url}"
end
redirect '/run/'+base64_url_encode(code)
end
get '/run/:code' do
code = base64_url_decode(params[:code])
run(code)
code
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment