質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Sinatra

Sinatraは、Rubyで作られた オープンソースのWebアプリケーションフレームワークです。

Q&A

解決済

1回答

1699閲覧

Sinatraの標示の仕組みを知りたい

momijiMac

総合スコア39

Sinatra

Sinatraは、Rubyで作られた オープンソースのWebアプリケーションフレームワークです。

0グッド

0クリップ

投稿2018/02/06 00:46

前提・実現したいこと

sinatraの標示の仕組みを勉強しています。
下記のコードを実行すると標示されるweb pageが
どのように生成され、標示される仕組みを知りたいです。

該当のソースコード

ruby

1get '/' do 2 'hello' 3end 4

発生している問題

sinatraのソースを読んでみました。
Sinatra::Base.get
Sinatra::Base.route
Sinatra::Base.compile!
とデータ('hello')が渡っているとおもうのですが、
ここから先が理解できません。
そもそも間違っていますかね

def compile!(verb, path, block, **options) # Because of self.options.host host_name(options.delete(:host)) if options.key?(:host) # Pass Mustermann opts to compile() route_mustermann_opts = options.key?(:mustermann_opts) ? options.delete(:mustermann_opts) : {}.freeze options.each_pair { |option, args| send(option, *args) } pattern = compile(path, route_mustermann_opts) method_name = "#{verb} #{path}" unbound_method = generate_method(method_name, &block) conditions, @conditions = @conditions, [] wrapper = block.arity != 0 ? proc { |a, p| unbound_method.bind(a).call(*p) } : proc { |a, p| unbound_method.bind(a).call } [ pattern, conditions, wrapper ] end

補足情報(FW/ツールのバージョンなど)

sinatra (2.0.0)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Sinatra を含む Ruby のウェブアプリケーションフレームワークの多くは Rack というウェブサーバの仕組みを利用しています。

https://qiita.com/higuma/items/838f4f58bc4a0645950a

ウェブアプリケーションフレームワークはリクエストを受けとり、Rack 形式のレスポンスを返します。中身はステータスコード、ヘッダ、ボディを配列にした物です。

[ステータスコード, ヘッダ, ボディ]

以下は例です。

['200', {'Content-Type' => 'text/html'}, ['A barebones rack app.']]

Sinatra や Rails はこの Rack 形式のレスポンスを返す所まで行います。あとはこのレスポンスを受け取った Rack 準拠のウェブサーバが以下の様なレスポンスをブラウザに返します。

HTTP/1.1 200 OK <= ステータスコード Date: Sat, 12 May 2012 16:47:26 GMT ~ ヘッダ ~ Content-Type: text/html; charset=UTF-8 ボディ

Rack を実装したウェブサーバによっては、ボディが File オブジェクトの場合はそのファイルを読み取ってブラウザに返す物もあります。

この様に、担当が分割されている事で、ウェブサーバとして rackup を使ったり thin を使ったり用途によって使い分けられる様になっています。Sinatra の例で言うと

ruby

1get '/' do 2 'hello' 3end

これは Sinatra::Base の get が route を呼び出します。ここでは実際には単に階層上にコンパイルされ、スタックとして積み上げられます。これとは別にサーバからリクエストを受け取ると、このスタックを順に処理します。sinatra の lib/sinatra/base.rb の def call(env) を見て貰うと良いです。
ここで Resopnse を作成し、最後に以下を返しているのが分かるかと思います。

[status.to_i, headers, result]

これが Rack 形式です。あとは前述の通り、ウェブサーバ層がこのレスポンスをソケット上に書き込みブラウザに届けられます。

投稿2018/02/06 02:15

編集2018/02/06 04:42
mattn

総合スコア5030

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問