# Code Review: ironruby-rack

**URL:** <https://www.ruby-forum.com/t/code-review-ironruby-rack/168027>\
**Category:** IronRuby\
**Created:** [May 15, 2009, 4:54am UTC](https://www.ruby-forum.com/t/code-review-ironruby-rack/168027 "2009-05-15T04:54:19Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![jsoho](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/8baadc/32.png) [@jsoho](https://www.ruby-forum.com/u/jsoho)\
**Post date:** [May 15, 2009, 4:54am UTC](https://www.ruby-forum.com/t/code-review-ironruby-rack/168027/1 "2009-05-15T04:54:19Z")

</div>

[http://github.com/jschementi/ironruby/tree/f57b6adec5fcb2896ed850683c0b1fd39ded23f0/Merlin/Main/Hosts/IronRuby.Rack](http://github.com/jschementi/ironruby/tree/f57b6adec5fcb2896ed850683c0b1fd39ded23f0/Merlin/Main/Hosts/IronRuby.Rack)

ironruby-rack: Run Rack-based web applications on IIS with IronRuby  
What it is:  
[http://blog.jimmy.schementi.com/2009/05/ironruby-at-railsconf-2009.html#iis](http://blog.jimmy.schementi.com/2009/05/ironruby-at-railsconf-2009.html#iis)

Uses [ASP.NET](http://ASP.NET)’s HttpHandlers to:

Â· Registering IronRuby.Rack in the Rack-based application’s  
Web.config[http://github.com/jschementi/ironruby/blob/92932a672921a03210c8aefe23ac0a7d6996ed2d/Merlin/Main/Hosts/IronRuby.Rack/IronRuby.Rack.Example/Web.config](http://github.com/jschementi/ironruby/blob/92932a672921a03210c8aefe23ac0a7d6996ed2d/Merlin/Main/Hosts/IronRuby.Rack/IronRuby.Rack.Example/Web.config)

Â· Load a Rack[http://rack.rubyforge.org/](http://rack.rubyforge.org/)-based application on  
startup  
(HttpHandlerFactory[http://github.com/jschementi/ironruby/blob/92932a672921a03210c8aefe23ac0a7d6996ed2d/Merlin/Main/Hosts/IronRuby.Rack/HttpHandlerFactory.cs](http://github.com/jschementi/ironruby/blob/92932a672921a03210c8aefe23ac0a7d6996ed2d/Merlin/Main/Hosts/IronRuby.Rack/HttpHandlerFactory.cs)  
and  
Application[http://github.com/jschementi/ironruby/blob/92932a672921a03210c8aefe23ac0a7d6996ed2d/Merlin/Main/Hosts/IronRuby.Rack/Application.cs](http://github.com/jschementi/ironruby/blob/92932a672921a03210c8aefe23ac0a7d6996ed2d/Merlin/Main/Hosts/IronRuby.Rack/Application.cs)  
constructor).

o Initializes Rack and runs the application’s  
[config.ru](http://config.ru)[http://github.com/jschementi/ironruby/blob/92932a672921a03210c8aefe23ac0a7d6996ed2d/Merlin/Main/Hosts/IronRuby.Rack/IronRuby.Rack.Example/config.ru](http://github.com/jschementi/ironruby/blob/92932a672921a03210c8aefe23ac0a7d6996ed2d/Merlin/Main/Hosts/IronRuby.Rack/IronRuby.Rack.Example/config.ru),  
which tells Rack what application (any Ruby object that responds to  
“call”)

Â· Intercept web requests  
(HttpHandler.ProcessRequest[http://github.com/jschementi/ironruby/blob/92932a672921a03210c8aefe23ac0a7d6996ed2d/Merlin/Main/Hosts/IronRuby.Rack/HttpHandler.cs](http://github.com/jschementi/ironruby/blob/92932a672921a03210c8aefe23ac0a7d6996ed2d/Merlin/Main/Hosts/IronRuby.Rack/HttpHandler.cs))

o Creates a  
Request[http://github.com/jschementi/ironruby/blob/92932a672921a03210c8aefe23ac0a7d6996ed2d/Merlin/Main/Hosts/IronRuby.Rack/Request.cs](http://github.com/jschementi/ironruby/blob/92932a672921a03210c8aefe23ac0a7d6996ed2d/Merlin/Main/Hosts/IronRuby.Rack/Request.cs)  
and a  
Response[http://github.com/jschementi/ironruby/blob/92932a672921a03210c8aefe23ac0a7d6996ed2d/Merlin/Main/Hosts/IronRuby.Rack/Response.cs](http://github.com/jschementi/ironruby/blob/92932a672921a03210c8aefe23ac0a7d6996ed2d/Merlin/Main/Hosts/IronRuby.Rack/Response.cs),  
and passes it off to  
IIS.Handle[http://github.com/jschementi/ironruby/blob/92932a672921a03210c8aefe23ac0a7d6996ed2d/Merlin/Main/Hosts/IronRuby.Rack/IIS.cs#L31](http://github.com/jschementi/ironruby/blob/92932a672921a03210c8aefe23ac0a7d6996ed2d/Merlin/Main/Hosts/IronRuby.Rack/IIS.cs#L31)  
which:

Â§ Set up the environment according to the Rack  
specification[http://rack.rubyforge.org/doc/SPEC.html](http://rack.rubyforge.org/doc/SPEC.html)

Â§ Calls  
Application.Call[http://github.com/jschementi/ironruby/blob/92932a672921a03210c8aefe23ac0a7d6996ed2d/Merlin/Main/Hosts/IronRuby.Rack/Application.cs#L32](http://github.com/jschementi/ironruby/blob/92932a672921a03210c8aefe23ac0a7d6996ed2d/Merlin/Main/Hosts/IronRuby.Rack/Application.cs#L32)  
with the prepared environment, which delegates to the Rack application’s  
“call” method (registered in the [config.ru](http://config.ru) file). All C# ↔ Ruby  
interaction happens in the  
RubyEngine[http://github.com/jschementi/ironruby/blob/92932a672921a03210c8aefe23ac0a7d6996ed2d/Merlin/Main/Hosts/IronRuby.Rack/RubyEngine.cs](http://github.com/jschementi/ironruby/blob/92932a672921a03210c8aefe23ac0a7d6996ed2d/Merlin/Main/Hosts/IronRuby.Rack/RubyEngine.cs)

Â§ Rack application does its thing (process Rails/Sinatra request, or  
deal with things  
itself[http://github.com/jschementi/ironruby/blob/92932a672921a03210c8aefe23ac0a7d6996ed2d/Merlin/Main/Hosts/IronRuby.Rack/IronRuby.Rack.Example/app.rb](http://github.com/jschementi/ironruby/blob/92932a672921a03210c8aefe23ac0a7d6996ed2d/Merlin/Main/Hosts/IronRuby.Rack/IronRuby.Rack.Example/app.rb))  
and returns a response according to the Rack  
specification[http://rack.rubyforge.org/doc/SPEC.html](http://rack.rubyforge.org/doc/SPEC.html)

Â§ Takes the Rack response and pass the appropriate data to the IIS  
response (response body, status, headers)
