web-dev-qa-db-ja.com

Sinatra内からHTTPリクエストをダンプする方法は?

アプリケーションがデータを受信するのとまったく同じ方法で、すべての着信要求をSinatraアプリケーションにダンプする方法はありますか?たぶん、ある種のラックミドルウェア?

23
t6d

'things'をデバッグしたいときに、-Dフラグと-Vフラグを使用してシンを実行します。

$ thin start -p 3000 -R config.ru -D -V

-D, --debug                      Set debbuging on
-V, --trace                      Set tracing on (log raw request/response)

リクエストから生の出力を取得しようとしている場合は、次のようなリクエストメソッドを使用します。

  # app running on http://example.com/example
  get '/foo' do
    request.body              # request body sent by the client (see below)
    request.scheme            # "http"
    request.script_name       # "/example"
    request.path_info         # "/foo"
    request.port              # 80
    request.request_method    # "GET"
    request.query_string      # ""
    request.content_length    # length of request.body
    request.media_type        # media type of request.body
    request.Host              # "example.com"
    request.get?              # true (similar methods for other verbs)
    request.form_data?        # false
    request["SOME_HEADER"]    # value of SOME_HEADER header
    request.referer           # the referer of the client or '/'
    request.user_agent        # user agent (used by :agent condition)
    request.cookies           # hash of browser cookies
    request.xhr?              # is this an ajax request?
    request.url               # "http://example.com/example/foo"
    request.path              # "/example/foo"
    request.ip                # client IP address
    request.secure?           # false
    request.env               # raw env hash handed in by Rack
  end

詳細については、「 はじめに "」を参照してください。

51
include

これはあなたが求めているものではないかもしれませんが、私はここに到着し、SinatraのすべてのHTTPリクエストヘッダーを表示する方法を探しました(プロキシされたリクエストをデバッグするために、実際に列挙する必要はありません)。私はこれが非常に便利だと思いました:

get "/my_route" do
  puts "#{ request.env }"
end

または、応答でそのblobを読みやすいjson形式で返すには:

require 'json'
get "/my_route" do
  content_type :text
  return JSON.pretty_generate(request.env)
end

そして出来上がり、すべてのリクエストの詳細:

{
  "SERVER_SOFTWARE": "thin 1.6.2 codename Doc Brown",
  "SERVER_NAME": "10.0.1.3",
  "rack.input": "#<StringIO:0x00000002bf82c0>",
  "rack.version": [
    1,
    0
  ],
  "rack.errors": "#<IO:0x00000002549b90>",
  "rack.multithread": false,
  "rack.multiprocess": false,
  "rack.run_once": false,
  "REQUEST_METHOD": "GET",
  "REQUEST_PATH": "/my_route",
  "PATH_INFO": "/my_route",
  "REQUEST_URI": "/my_route",
  "HTTP_VERSION": "HTTP/1.0",
  "HTTP_X_FORWARDED_FOR": "10.0.1.3, 127.0.0.1, 127.0.0.1, 127.0.0.1",
  "HTTP_Host": "10.0.1.3:9393",
  "HTTP_CONNECTION": "close",
  "HTTP_X_REAL_IP": "10.0.1.3",
  "HTTP_X_FE_SCHEME": "http",
  "HTTP_X_FE_Host": "10.0.10.145",
  "HTTP_X_FE_ROUTE": "/my_route",
  "HTTP_ACCEPT": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
  "HTTP_USER_AGENT": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36",
  "HTTP_ACCEPT_LANGUAGE": "en-US,en;q=0.8",
  "HTTP_X_VARNISH": "917254702",
  "HTTP_ACCEPT_ENCODING": "gzip",
  "GATEWAY_INTERFACE": "CGI/1.2",
  "SERVER_PORT": "9393",
  "QUERY_STRING": "",
  "SERVER_PROTOCOL": "HTTP/1.1",
  "rack.url_scheme": "http",
  "SCRIPT_NAME": "",
  "REMOTE_ADDR": "10.0.10.145",
  "async.callback": "#<Method: Thin::Connection#post_process>",
  "async.close": "#<EventMachine::DefaultDeferrable:0x00000002a60070>",
  "rack.logger": "#<Rack::NullLogger:0x00000004154ad8>",
  "rack.request.query_string": "",
  "rack.request.query_hash": {
  },
  "sinatra.route": "GET (?-mix:^\\/my_route$)"
}
22
Jeff Ward