Get response headers from Curb

后端 未结 1 954
自闭症患者
自闭症患者 2021-01-02 01:24

I intend to make a call from a Ruby on Rails application:

c = Curl::Easy.http_post(\"https://example.com\", json_string_goes_here) do |curl|
  curl.headers[\         


        
1条回答
  •  有刺的猬
    2021-01-02 02:30

    Using Curl::Easy's header_str you can access the returned headers as a string. From the documentation:

    Return the response header from the previous call to perform. This is populated by the default on_header handler - if you supply your own header handler, this string will be empty.

    To test this I turned on the built-in Gem server using:

    gem server
    

    Here's some code to test this:

    curl = Curl::Easy.http_get('http://0.0.0.0:8808')
    curl.header_str
    => "HTTP/1.1 200 OK \r\nDate: 2013-01-10 09:07:42 -0700\r\nContent-Type: text/html\r\nServer: WEBrick/1.3.1 (Ruby/1.9.3/2012-11-10)\r\nContent-Length: 62164\r\nConnection: Keep-Alive\r\n\r\n"
    

    Capturing the response, and breaking the remaining string into a hash making it easier to use, is simple:

    http_response, *http_headers = curl.header_str.split(/[\r\n]+/).map(&:strip)
    http_headers = Hash[http_headers.flat_map{ |s| s.scan(/^(\S+): (.+)/) }]
    
    http_response # => "HTTP/1.1 200 OK"
    
    http_headers 
    => {
                      "Date" => "2013-01-10 09:07:42 -0700",
              "Content-Type" => "text/html",
                    "Server" => "WEBrick/1.3.1 (Ruby/1.9.3/2012-11-10)",
            "Content-Length" => "62164",
                "Connection" => "Keep-Alive"
        }
    

    Testing again, in Pry:

    [27] (pry) main: 0> curl = Curl::Easy.http_get('http://www.example.com')
    #
    [28] (pry) main: 0> curl.header_str
    "HTTP/1.0 302 Found\r\nLocation: http://www.iana.org/domains/example/\r\nServer: BigIP\r\nConnection: Keep-Alive\r\nContent-Length: 0\r\n\r\n"
    [29] (pry) main: 0> http_response, *http_headers = curl.header_str.split(/[\r\n]+/).map(&:strip)
    [
        [0] "HTTP/1.0 302 Found",
        [1] "Location: http://www.iana.org/domains/example/",
        [2] "Server: BigIP",
        [3] "Connection: Keep-Alive",
        [4] "Content-Length: 0"
    ]
    [30] (pry) main: 0> http_headers = Hash[http_headers.flat_map{ |s| s.scan(/^(\S+): (.+)/) }]
    {
              "Location" => "http://www.iana.org/domains/example/",
                "Server" => "BigIP",
            "Connection" => "Keep-Alive",
        "Content-Length" => "0"
    }
    

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