Class: Falcon::Adapters::Response

Inherits:
Async::HTTP::Response
  • Object
show all
Defined in:
lib/falcon/adapters/response.rb

Constant Summary collapse

IGNORE_HEADERS =
Proxy::HOP_HEADERS

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(status, headers, body) ⇒ Response

Returns a new instance of Response.



77
78
79
# File 'lib/falcon/adapters/response.rb', line 77

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

Class Method Details

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



53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/falcon/adapters/response.rb', line 53

def self.wrap(status, headers, body, request = nil, env = nil)
  headers, meta = wrap_headers(headers)
  
  if block = meta['rack.hijack'] and request and env
    body = Hijack.for(env, block, request.hijack? ? request.hijack! : nil)
  else
    sliced = headers.slice!(IGNORE_HEADERS)
    
    unless sliced.empty?
      Async.logger.warn("Ignoring protocol-level headers: #{sliced.inspect}")
    end
    
    body = Output.wrap(status, headers, body)
  end
  
  # 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)
end

.wrap_headers(fields) ⇒ Object

Append a list of newline encoded headers.



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/falcon/adapters/response.rb', line 34

def self.wrap_headers(fields)
  headers = ::HTTP::Protocol::Headers.new
  meta = {}
  
  fields.each do |key, value|
    key = key.downcase
    
    if key.start_with?('rack.')
      meta[key] = value
    else
      value.to_s.split("\n").each do |part|
        headers.add(key, part)
      end
    end
  end
  
  return headers, meta
end