Class: Protocol::Rack::Response

Inherits:
HTTP::Response
  • Object
show all
Defined in:
lib/protocol/rack/response.rb

Overview

A wrapper for a ‘Rack` response.

A Rack response consisting of ‘[status, headers, body]` includes various rack-specific elements, including:

  • A ‘headers` callback which bypasses normal response handling.

  • Potentially invalid content length.

  • Potentially invalid body when processing a ‘HEAD` request.

  • Newline-separated header values.

  • Other ‘rack.` specific header key/value pairs.

This wrapper takes those issues into account and adapts the rack response tuple into a HTTP::Response.

Constant Summary collapse

HOP_HEADERS =

HTTP hop headers which should not be passed through the proxy.

[
  "connection",
  "keep-alive",
  "public",
  "proxy-authenticate",
  "transfer-encoding",
  "upgrade",
]

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(status, headers, body, protocol = nil) ⇒ Response

Initialize the response wrapper.



71
72
73
# File 'lib/protocol/rack/response.rb', line 71

def initialize(status, headers, body, protocol = nil)
  super(nil, status, headers, body, protocol)
end

Class Method Details

.wrap(env, status, headers, meta, body, request = nil) ⇒ Object

Wrap a rack response.



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/protocol/rack/response.rb', line 42

def self.wrap(env, status, headers, meta, body, request = nil)
  ignored = headers.extract(HOP_HEADERS)
  
  unless ignored.empty?
    Console.warn(self, "Ignoring hop headers!", ignored: ignored)
  end
  
  if hijack_body = meta["rack.hijack"]
    body = hijack_body
  end
  
  body = Body.wrap(env, status, headers, body, request&.body, request&.head?)
  
  protocol = meta[RACK_PROTOCOL]
  
  # https://tools.ietf.org/html/rfc7231#section-7.4.2
  # headers.add('server', "falcon/#{Falcon::VERSION}")
  
  # https://tools.ietf.org/html/rfc7231#section-7.1.1.2
  # headers.add('date', Time.now.httpdate)
  
  return self.new(status, headers, body, protocol)
end