document.write('<link rel="stylesheet" href="http://flowcoder.com/stylesheets/pygment_trac.css" />');
document.write('<link rel="stylesheet" href="http://flowcoder.com/stylesheets/embed.css" />');
document.write('<div class="flowcoder_post flowcoder_clearfix">');
document.write('<div class="flowcoder_posttitle"><a href=\"http://flowcoder.com/93\">Rack::Branch, a very simple routing middleware<\/a></div>');
document.write('<div class="flowcoder_postbody flowcoder_syntax"><div class=\"highlight\"><pre><span class=\"c1\"># Rack::Branch lets you conditionally re-route the Rack stack at runtime to<\/span>\n<span class=\"c1\"># an alternate endpoint.<\/span>\n<span class=\"c1\">#<\/span>\n<span class=\"c1\"># You initialize this middleware with a block, which should either 1. return a<\/span>\n<span class=\"c1\"># valid rack endpoint, when want to branch away from the current Rack pipeline, <\/span>\n<span class=\"c1\"># or 2. nil/false, when you want to continue on. The block is passed the current<\/span>\n<span class=\"c1\"># Rack env hash.<\/span>\n<span class=\"c1\">#<\/span>\n<span class=\"c1\"># config.ru usage example:<\/span>\n<span class=\"c1\">#<\/span>\n<span class=\"c1\">#   use Rack::Branch do |env|<\/span>\n<span class=\"c1\">#     ApiApp if env[&quot;PATH_INFO&quot;] =~ /\\.xml$/<\/span>\n<span class=\"c1\">#   end<\/span>\n<span class=\"c1\">#<\/span>\n<span class=\"c1\">#   run MyEndpointApp<\/span>\n<span class=\"c1\">#<\/span>\n<span class=\"c1\"># A slightly more complex example with multiple endpoints:<\/span>\n<span class=\"c1\">#<\/span>\n<span class=\"c1\">#   use Rack::Branch do |env|<\/span>\n<span class=\"c1\">#     if env[&#39;PATH_INFO&#39;] =~ %r{^\\/foo\\/(bar|baz)(.*)$/}<\/span>\n<span class=\"c1\">#       env[&#39;PATH_INFO&#39;] = $2<\/span>\n<span class=\"c1\">#       {&#39;bar&#39; =&gt; BarApp, &#39;baz&#39; =&gt; BazApp}[$1]<\/span>\n<span class=\"c1\">#     end<\/span>\n<span class=\"c1\">#   end<\/span>\n<span class=\"c1\">#<\/span>\n<span class=\"c1\">#   run MyEndpointApp<\/span>\n<span class=\"k\">module<\/span> <span class=\"nn\">Rack<\/span>\n  <span class=\"k\">class<\/span> <span class=\"nc\">Branch<\/span>\n    <span class=\"k\">def<\/span> <span class=\"nf\">initialize<\/span><span class=\"p\">(<\/span><span class=\"n\">app<\/span><span class=\"p\">,<\/span> <span class=\"o\">&amp;<\/span><span class=\"n\">block<\/span><span class=\"p\">)<\/span>\n      <span class=\"vi\">@app<\/span> <span class=\"o\">=<\/span> <span class=\"n\">app<\/span>\n      <span class=\"vi\">@block<\/span> <span class=\"o\">=<\/span> <span class=\"n\">block<\/span>\n    <span class=\"k\">end<\/span>\n\n    <span class=\"k\">def<\/span> <span class=\"nf\">call<\/span><span class=\"p\">(<\/span><span class=\"n\">env<\/span><span class=\"p\">)<\/span>\n      <span class=\"n\">app<\/span> <span class=\"o\">=<\/span> <span class=\"vi\">@block<\/span><span class=\"o\">.<\/span><span class=\"n\">call<\/span><span class=\"p\">(<\/span><span class=\"n\">env<\/span><span class=\"p\">)<\/span> <span class=\"o\">||<\/span> <span class=\"vi\">@app<\/span>\n      <span class=\"n\">app<\/span><span class=\"o\">.<\/span><span class=\"n\">call<\/span><span class=\"p\">(<\/span><span class=\"n\">env<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">end<\/span>\n  <span class=\"k\">end<\/span>\n<span class=\"k\">end<\/span>\n<\/pre><\/div>\n</div>');
document.write('<div class="flowcoder_bottombar flowcoder_clearfix">');
document.write('<div class="flowcoder_postedby">Posted by <a href=\"http://flowcoder.com/gbuesing\">gbuesing<\/a> on <a href=\"http://flowcoder.com/\">Flowcoder<\/a></div>');
document.write('<div class="flowcoder_viewraw"><a href=\"http://flowcoder.com/93.txt\">view raw<\/a></div>');
document.write('</div></div>');
