Class: Async::HTTP::Protocol::HTTP2::Response

Inherits:
Response show all
Defined in:
lib/async/http/protocol/http2/response.rb

Instance Attribute Summary

Attributes inherited from Response

#protocol

Attributes inherited from Response

#body, #headers, #reason, #status, #version

Instance Method Summary collapse

Methods inherited from Response

#hijack?, #peer, #remote_address, #remote_address=

Methods inherited from Response

[], #bad_request?, #continue?, #failure?, for_exception, #partial?, #preserve_method?, #redirection?, #server_failure?, #success?, #to_s

Methods included from Body::Reader

#close, #each, #finish, #read, #stop

Constructor Details

#initialize(protocol, stream_id) ⇒ Response

Returns a new instance of Response.



28
29
30
31
32
33
34
35
36
37
38
# File 'lib/async/http/protocol/http2/response.rb', line 28

def initialize(protocol, stream_id)
  @input = Body::Writable.new
  
  super(protocol.version, nil, nil, Headers.new, @input)
  
  @protocol = protocol
  @stream = Stream.new(self, protocol, stream_id)
  
  @notification = Async::Notification.new
  @exception = nil
end

Instance Method Details

#receive_data(stream, data, end_stream) ⇒ Object



67
68
69
70
71
72
73
74
75
76
77
# File 'lib/async/http/protocol/http2/response.rb', line 67

def receive_data(stream, data, end_stream)
  unless data.empty?
    @input.write(data)
  end
  
  if end_stream
    @input.finish
  end
rescue EOFError
  @stream.send_reset_stream(0)
end

#receive_headers(stream, headers, end_stream) ⇒ Object



48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/async/http/protocol/http2/response.rb', line 48

def receive_headers(stream, headers, end_stream)
  headers.each do |key, value|
    if key == STATUS
      @status = value.to_i
    elsif key == REASON
      @reason = value
    else
      @headers[key] = value
    end
  end
  
  if end_stream
    @input.finish
  end
  
  # We are ready for processing:
  @notification.signal
end

#receive_reset_stream(stream, error_code) ⇒ Object



79
80
81
82
83
84
85
# File 'lib/async/http/protocol/http2/response.rb', line 79

def receive_reset_stream(stream, error_code)
  if error_code > 0
    @exception = EOFError.new(error_code)
  end
  
  @notification.signal
end

#send_request(request) ⇒ Object



87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# File 'lib/async/http/protocol/http2/response.rb', line 87

def send_request(request)
  headers = Headers::Merged.new({
    SCHEME => HTTPS,
    METHOD => request.method,
    PATH => request.path,
    AUTHORITY => request.authority,
  }, request.headers)
  
  if request.body.nil?
    @stream.send_headers(nil, headers, ::HTTP::Protocol::HTTP2::END_STREAM)
  else
    begin
      @stream.send_headers(nil, headers)
    rescue
      raise RequestFailed
    end
    
    @stream.send_body(request.body)
  end
end

#waitObject



40
41
42
43
44
45
46
# File 'lib/async/http/protocol/http2/response.rb', line 40

def wait
  @notification.wait
  
  if @exception
    raise @exception
  end
end