0
-%w[tempfile uri].map{|l|require l};class Object;def meta_def m,&b
0
-(class<<self;self end).send(:define_method,m,&b)end end
0
-module Camping;C=self;S=IO.read(__FILE__)rescue nil;P="Cam\ping Problem!"
0
-class H<Hash;def method_missing m,*a
0
-m.to_s=~/=$/?self[$`]=a[0]:a==[]?self[m.to_s]:super end;alias u merge!
0
-module Helpers def R c,*g;p,h=/\(.+?\)/,g.grep(Hash);g-=h;
0
-raise"bad route"unless u=c.urls.find{|x|break x if x.scan(p).size==g.size&&
0
-/^#{x}\/?$/=~(x=g.inject(x){|x,a|x.sub p,C.escape((a[a.class.primary_key
0
-h.any?? u+"?"+h[0].map{|x|x.map{|z|C.escape z}*"="}*"&":u end
0
-def /(p);p[/^\//]?@root+p:p;end;def URL c='/',*a
0
-c=R(c,*a)if c.respond_to?:urls;c=self/c;c="//"+@env.HTTP_HOST+c if c[/^\//]
0
-URI(c) end end;module Base;attr_accessor:input,:cookies,:env,:headers,:body,
0
-:status,:root;Z="\r\n";def method_missing*a,&b;a.shift if a[0]==:render
0
-m=Mab.new({},self);s=m.capture{send(*a,&b)};s=m.capture{send(:layout){s}}if
0
-/^_/!~a[0].to_s and m.respond_to?:layout;s end;def redirect*a
0
-r 302,'','Location'=>URL(*a)end;def r s,b,h={};@status=s;headers.u h
0
-@body=b end;def to_a;[status,body,headers]end;def initialize r,e,m
0
-@status,@method,@env,@headers,@root=200,m.downcase,e,H[
0
-'Content-Type',"text/html"],e.SCRIPT_NAME.sub(/\/$/,'');@k=C.kp e.HTTP_COOKIE
0
-q=C.qsp e.QUERY_STRING;@in=r;case e.CONTENT_TYPE
0
-when %r|\Amultipart/form-.*boundary=\"?([^\";,]+)|n
0
-b=/(?:\r?\n|\A)#{Regexp::quote"--#$1"}(?:--)?\r$/;until
0
-@in.eof?;fh=H[];for l in@in;case l;when Z;break;when/^Content-D.+?: form-data;/
0
-fh.u H[*$'.scan(/(?:\s(\w+)="([^"]+)")/).flatten];when
0
-/^Content-Type: (.+?)(\r$|\Z)/m;fh.type=$1;end;end;fn=fh.name;o=if fh.
0
-filename;o=fh.tempfile=Tempfile.new(:C);o.binmode;else;fh=""end;s=8192;k=''
0
-l=@in.read(s*2);while l;if(k<<l)=~b;o<<$`.chomp;@in.seek(-$'.size,IO::SEEK_CUR)
0
-break;end;o<<k.slice!(0...s);l=@in.read(s);end;C.qsp(fn,'&;',fh,q)if fn;fh.
0
-tempfile.rewind if fh.is_a?H;end;when "application/x-www-form-urlencoded"
0
-q.u C.qsp(@in.read)end;@cookies,@input=@k.dup,q.dup end;def service*a
0
-@body=send(@method,*a)if respond_to?@method
0
-headers["Set-Cookie"]=cookies.map{|k,v|"#{k}=#{C.escape v}; path=#{self/'/'}"if
0
-v!=@k[k]}-[nil];self end;def to_s;"Status: #@status#{Z+headers.map{|k,v|[*v].
0
-map{|x|[k,v]*": "}}*Z+Z}#@body"end;end;X=module Controllers;@r=[];class<<
0
-self;def r;@r;end;def R*u;r=@r;Class.new{meta_def(:urls){u};meta_def(:inherited
0
-){|x|r<<x}}end;def D p;r.map{|k|k.urls.map{|x|return k,$~[1..-1]if p=~/^#{x
0
-}\/?$/}};[NotFound,[p]]end;def M;def M;end;constants.map{|c|k=const_get(c);k.
0
-send:include,C,Base,Helpers,Models;r[0,0]=k if !r.include?k;k.meta_def(:urls){[
0
-"/#{c.downcase}"]}if !k.respond_to?:urls}end;end;class NotFound<R();def get p
0
-r(404,"<h1>#{P}</h1><h2>#{p} not found</h2>")end end;class ServerError<R()
0
-def get k,m,e;r(500,"<h1>#{P}</h1><h2>#{k}.#{m}</h2><h3>#{e.class} #{e.message
0
-}:<ul>#{e.backtrace.map{ |b| "<li>#{b}</li>" } }")end end;self;end;class<<self
0
-def goes m;eval S.gsub(/Camping/,m.to_s),TOPLEVEL_BINDING;end;def escape s
0
-s.to_s.gsub(/[^ \w.-]+/n){'%'+($&.unpack('H2'*$&.size)*'%').upcase}.tr(' ','+')
0
-end;def un s;s.tr('+',' ').gsub(/%([\da-f]{2})/in){[$1].pack('H*')}end
0
+%w[tempfile uri].map{|l|require l};class Object;def meta_def m,&b;(class<<self
0
+self end).send:define_method,m,&b end end;module Camping;C=self
0
+S=IO.read(__FILE__)rescue nil;P="<h1>Cam\\ping Problem!</h1><h2>%s</h2>"
0
+def method_missing m,*a;m.to_s=~/=$/?self[$`]=a[0]:a==[]?self[m.to_s]:super end
0
+alias u merge!;undef id,type;end;module Helpers;def R c,*g
0
+p,h=/\(.+?\)/,g.grep(Hash);g-=h;raise"bad route"unless u=c.urls.find{|x|
0
+break x if x.scan(p).size==g.size&&/^#{x}\/?$/=~(x=g.inject(x){|x,a|
0
+x.sub p,C.escape((a[a.class.primary_key]rescue a))})}
0
+h.any?? u+"?"+h[0].map{|x|x.map{|z|C.escape z}*"="}*"&":u end;def / p
0
+p[/^\//]?@root+p:p end;def URL c='/',*a;c=R(c, *a) if c.respond_to?:urls
0
+c=self/c;c="//"+@env.HTTP_HOST+c if c[/^\//];URI c end end;module Base
0
+attr_accessor:input,:cookies,:env,:headers,:body,:status,:root;Z="\r\n"
0
+def method_missing *a,&b;a.shift if a[0]==:render;m=Mab.new({},self)
0
+s=m.capture{send(*a,&b)};s=m.capture{send(:layout){s}}if/^_/!~a[0].to_s and
0
+m.respond_to?:layout;s end;def r s,b,h={};@status=s;headers.u(h);@body=b
0
+end;def redirect *a;r 302,'','Location'=>URL(*a)end;def r404 p=env.PATH
0
+r 404,P%"#{p} not found"end;def r500 k,m,x
0
+r 500,P%"#{k}.#{m}"+"<h3>#{x.class} #{x.message}: <ul>#{x.
0
+backtrace.map{|b|"<li>#{b}</li>"}}</ul></h3>"end;def r501 m=@method
0
+r 501,P%"#{m.upcase} not implemented"end;def to_a
0
+[status,body,headers]end;def initialize r,e,m;@status,@method,@env,@headers,
0
+@root=200,m,e,H['Content-Type','text/html'],e.SCRIPT_NAME.sub(/\/$/,'')
0
+@k=C.kp e.HTTP_COOKIE;q=C.qsp e.QUERY_STRING;@in=r;case e.CONTENT_TYPE
0
+when%r|\Amultipart/form-.*boundary=\"?([^\";,]+)|n
0
+b=/(?:\r?\n|\A)#{Regexp.quote"--#$1"}(?:--)?\r$/;until@in.eof?;fh=H[]
0
+for l in@in;case l;when Z;break;when/^Content-D.+?: form-data;/
0
+fh.u H[*$'.scan(/(?:\s(\w+)="([^"]+)")/).flatten]
0
+when/^Content-Type: (.+?)(\r$|\Z)/m: fh.type = $1 end end;fn=fh.name
0
+o=if fh.filename;o=fh.tempfile=Tempfile.new(:C);o.binmode;else;fh="";end;s=8192
0
+k='';l=@in.read(s*2);while l;if(k<<l)=~b;o<<$`.chomp
0
+@in.seek(-$'.size,IO::SEEK_CUR);break end;o<<k.slice!(0...s);l=@in.read(s) end
0
+C.qsp(fn,'&;',fh,q)if fn;fh.tempfile.rewind if fh.is_a?H end;when
0
+"application/x-www-form-urlencoded": q.u(C.qsp(@in.read))end
0
+@cookies,@input=@k.dup,q.dup end;def service *a;@body=send @method,*a
0
+headers['Set-Cookie']=cookies.map{|k,v|"#{k}=#{C.escape(v)}; path=#{self/
0
+"/"}"if v!=@k[k]}-[nil];self end;def to_s
0
+"Status: #@status#{Z+headers.map{|k,v|[*v].map{|x|[k,v]*": "}}*Z+Z}#@body"end
0
+end;X=module Controllers;@r=[];class<<self;def r;@r end;def R *u;r=@r
0
+Class.new{meta_def(:urls){u};meta_def(:inherited){|x|r<<x}}end
0
+def D p,m;r.map{|k|k.urls.map{|x|return(k.instance_method(m)rescue nil)?
0
+[k,m,*$~[1..-1]]:[I,'r501',m]if p=~/^#{x}\/?$/}};[I,'r404',p]
0
+end;def M;def M;end;constants.map{|c|k=const_get(c)
0
+k.send:include,C,Base,Helpers,Models;@r=[k]+r if r-[k]==r
0
+k.meta_def(:urls){["/#{c.downcase}"]}if !k.respond_to?:urls}end end;class I<R()
0
+end;self end;class<<self;def goes m
0
+eval S.gsub(/Camping/,m.to_s),TOPLEVEL_BINDING end;def escape s
0
+s.to_s.gsub(/[^ \w.-]+/n){'%'+($&.unpack('H2'*$&.size)*'%').upcase}.tr' ','+'
0
+end;def un s;s.tr('+',' ').gsub(/%([\da-f]{2})/in){[$1].pack'H*'}end
0
def qsp q,d='&;',y=nil,z=H[];m=proc{|_,o,n|o.u(n,&m)rescue([*o]<<n)}
0
-(q.to_s.split(/[#{d}]+ */n)-['']).inject((b,z=z,H[])[0]){|h,p|k,v=un(p).
0
-split('=',2);h.u k.split(/[\]\[]+/).reverse.inject(y||v){|x,i|H[i,x]},&m}end
0
-def kp s;c=qsp(s,';,')end;def run r=$stdin,e=ENV;X.M;e=H[e.to_hash]
0
-k,a=X.D e.PATH_INFO=un("/#{e.PATH_INFO}".gsub(/\/+/,'/'));k.new(
0
-r,e,(m=e.REQUEST_METHOD||"GET")).Y.service(*a);rescue=>x;X::ServerError.new(
0
-r,e,'get').service(k,m,x)end;def method_missing m,c,*a;X.M;k=X.const_get(c).
0
-new(StringIO.new,H['HTTP_HOST','','SCRIPT_NAME','','HTTP_COOKIE',''],m.to_s)
0
-H[a.pop].each{|e,f|k.send("#{e}=",f)}if Hash===a[-1];k.service(*a);end;end
0
-module Views;include X,Helpers;end;module Models;autoload:Base,'camping/db';def
0
-Y;self;end;end;autoload:Mab,'camping/mab'end
0
+(q.to_s.split(/[#{d}]+ */n)-[""]).inject((b,z=z,H[])[0]){|h,p|k,v=un(p).
0
+split'=',2;h.u k.split(/[\]\[]+/).reverse.inject(y||v){|x,i|H[i,x]},&m}end
0
+def kp s;c=qsp s,';,'end;def run r=$stdin,e=ENV;X.M;e=H[e.to_hash];k,m,*a=X.D e.
0
+PATH_INFO=un("/#{e.PATH_INFO}".gsub(/\/+/,'/')),
0
+(e.REQUEST_METHOD||'get').downcase
0
+k.new(r,e,m).Y.service(*a);rescue=>x;X::I.new(r,e,'r500').service k,m,x
0
+end;def method_missing m,c,*a;X.M;k=X.const_get(c).new StringIO.new,
0
+H['HTTP_HOST','','SCRIPT_NAME','','HTTP_COOKIE',''],m.to_s
0
+H[a.pop].each{|e,f|k.send"#{e}=",f}if Hash===a[-1];k.service(*a)end end
0
+module Views;include X,Helpers end;module Models;autoload:Base,'camping/db'
0
+def Y;self;end end;autoload:Mab,'camping/mab'end
Comments
No one has commented yet.