non vorrei lavorare

ブログ名の通りです。javascript three.js mruby rust OCaml golang julialang blender

mrubyのHTTP2サーバー(trusterd)をRack APIに対応させる その1

はじめに

この記事は、@kjunichiの2015年パーソナルアドベントカレンダーの16日目の記事です。

Rack APIとは

初めて知った書き方は以下

Proc.new do |env|
  [200, {"content-type" => "text/html; charset=utf-8"},
    ["<html><body><h1>こんにちは</h1><p>libh2oでmruby動いたよ。</p></body></html>"]]
end

ruby力低いから、違ってるかもだが、CGI環境変数的なオブジェクトがハッシュ形式でブロックの引数で渡ってきて、 これを参照して、あれこれ処理して、配列を返す

参考資料

返却する配列の形式

[HTTPステータスコード,コンテントタイプ,コンテンツそのもの]

という理解

Trusterdでうごかしてみた

trusterd.conf.rbに以下の関数を追加。

def LibTrasterdRackApi(env,filename)
  f = File.open(filename, "r")
  script = f.read
  f.close
  #puts script
  p env
  ro = eval(script)
  #e={}
  ro.call(env)
end

s.set_map_to_storage_cbに以下を追加

if s.request.uri =~ /rack\/(.*)/
  s.set_content_cb {
    #puts "/rack/ start" + $1 + ".rb"
    response = LibTrasterdRackApi(s.request_headers.all, $1+".rb")
    p response
    #s.set_status response[0]
    response[2].each{|line| s.rputs line}
    s.rputs "rack end"
  }
end
https://127.0.0.1/rack/tiny

Proc.new do |env|
  [200, {"content-type" => "text/html; charset=utf-8"},
    ["<html><body><h1>こんにちは</h1><p>trusterdでRack APIのrubyスクリプトが動いたよ。</p></body></html>"]]
end

が動いた

わかったこと

  • envに渡すハッシュを実装する必要がありそう
  • hibariはPOSTを扱えるが、これには、envのquery_stringにPOSTパラメータもセットする必要がありそう

追記

www.youtube.com

動かせた