Как Ruby веб-фреймворки обучают оперировать заголовками?
==========================================================

 В стандартном Ruby, насколько мне известно, нет никаких встроенных инструментов для оперирования веб-заголовками, как, например, в PHP. Так как же тогда пишутся все эти многочисленные веб-фреймворки типа Rails, Padrino, Sinatra? Ведь их основная суть - оперирование заголовками с последующей обработкой роутов.  
  

Вот создал я, например, файл hi.rb. Что мне нужно в него написать (пускай у меня стоит Passenger как application-server), чтобы дать ему понять, что, если кто-то ввел в строке mysite/hi, мне нужно вывести "Hello World", а если mysite/signup, то нужно вывести форму заголовка?  
  

Хоть убей, не могу двигаться в изучении фреймворков дальше, пока не узнаю, как же все-таки организована логика их работы.  
  

Есть мысль, что эти методы предоставляют сами веб- и application-серверы, но где найти документацию по аспектам работы с ними, скажем?  
  

Если заглянуть в исходники Sinatra, то в середине класса Base модуля Sinatra откуда-то возникают методы header() (может я что-то упустил или неправильно понял, поправьте меня), которые как раз и занимаются обработкой запросов.  
  

Как такое организовать самому?  

И еще. В Rails можно использовать различные application-серверы, такие как Unicorn, Passenger, стандартный WEBrick, thin. Неужели в самом Rails коде заложена поддержка всех серверов? Или все-таки каждый из них предоставляет одни и те же конечные методы работы?  
  

Хотелось бы услышать подробный ответ, конкретно объясняющий суть работы такого рода приложений. 

 Думаю Вам нужен [Rack](http://rack.github.io) 

 У руби есть скажем так "дефолтный" вебсервер интерфейс - [rack.](http://rack.github.io/)  

Ответ на Ваш вопрос кроется в короткой документации этой штуки. Если я конечно все правильно понимаю :)  
  

p.s. а все сервера поддерживают не рельсы, а этот самый rack  

[www.rubydoc.info/github/rack/rack/#Supported\_web\_s...](http://www.rubydoc.info/github/rack/rack/#Supported_web_servers)