How to dump an HTTP request from within Sinatra?

后端 未结 2 1979
-上瘾入骨i
-上瘾入骨i 2020-12-23 12:08

Is there a way to dump all incoming requests to a Sinatra application in the exact way the application receives the data? Maybe some sort of Rack middleware?

相关标签:
2条回答
  • 2020-12-23 12:48

    Maybe this is not what you're asking, but I arrived here looking for a way to see all the HTTP request headers in Sinatra (without actually having to enumerate them, to debug a proxied request). I found this quite useful:

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

    Or, to return that blob in the response in a legible json format:

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

    And voila, all the request details:

    {
      "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$)"
    }
    
    0 讨论(0)
  • 2020-12-23 13:02

    I run thin with the -D and -V flags when I want to debug 'things':

    $ thin start -p 3000 -R config.ru -D -V
    
    -D, --debug                      Set debbuging on
    -V, --trace                      Set tracing on (log raw request/response)
    

    If you are trying to get the raw output from a request, use the request method like:

      # 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
    

    See "GETTING STARTED" for more information.

    0 讨论(0)
提交回复
热议问题