如何在Sinatra内转储HTTP请求?

23

有没有一种方法可以将所有进入Sinatra应用程序的请求以应用程序接收数据的确切方式转储出来?也许是某种Rack中间件?

2个回答

51

当我想要调试“事情”时,我使用-D-V标志来运行thin:

$ 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

请参考更多信息,请查看"GETTING STARTED"。


最终我使用em-proxy构建了一个代理,该代理将每个HTTP请求原样转储到日志文件中。 - t6d
很酷,听起来不错。你会发布你的代码吗?我也想学:D - include
config.ru在哪里? - evandrix

22

也许这不是你想问的,但我来到这里是为了找到一种在Sinatra中查看所有HTTP请求头的方法(而不必枚举它们以调试代理请求)。我发现这非常有用:

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

或者,为了以可读的 JSON 格式在响应中返回该 blob:

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$)"
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接