class NetHttp2::Stream

Public Class Methods

new(options={}) click to toggle source
# File lib/net-http2/stream.rb, line 5
def initialize(options={})
  @h2_stream = options[:h2_stream]
  @headers   = {}
  @data      = ''
  @request   = nil
  @async     = false
  @completed = false
  @mutex     = Mutex.new
  @cv        = ConditionVariable.new

  listen_for_headers
  listen_for_data
  listen_for_close
end

Public Instance Methods

async?() click to toggle source
# File lib/net-http2/stream.rb, line 41
def async?
  @async
end
async_call_with(request) click to toggle source
# File lib/net-http2/stream.rb, line 30
def async_call_with(request)
  @request = request
  @async   = true

  send_request_data
end
call_with(request) click to toggle source
# File lib/net-http2/stream.rb, line 24
def call_with(request)
  @request = request
  send_request_data
  sync_respond
end
completed?() click to toggle source
# File lib/net-http2/stream.rb, line 37
def completed?
  @completed
end
id() click to toggle source
# File lib/net-http2/stream.rb, line 20
def id
  @h2_stream.id
end

Private Instance Methods

listen_for_close() click to toggle source
# File lib/net-http2/stream.rb, line 69
def listen_for_close
  @h2_stream.on(:close) do |data|
    @completed = true

    if async?
      @request.emit(:close, data)
    else
      @mutex.synchronize { @cv.signal }
    end
  end
end
listen_for_data() click to toggle source
# File lib/net-http2/stream.rb, line 59
def listen_for_data
  @h2_stream.on(:data) do |data|
    if async?
      @request.emit(:body_chunk, data)
    else
      @data << data
    end
  end
end
listen_for_headers() click to toggle source
# File lib/net-http2/stream.rb, line 47
def listen_for_headers
  @h2_stream.on(:headers) do |hs_array|
    hs = Hash[*hs_array.flatten]

    if async?
      @request.emit(:headers, hs)
    else
      @headers.merge!(hs)
    end
  end
end
send_request_data() click to toggle source
# File lib/net-http2/stream.rb, line 81
def send_request_data
  headers = @request.headers
  body    = @request.body

  if body
    @h2_stream.headers(headers, end_stream: false)
    @h2_stream.data(body, end_stream: true)
  else
    @h2_stream.headers(headers, end_stream: true)
  end
end
sync_respond() click to toggle source
# File lib/net-http2/stream.rb, line 93
def sync_respond
  wait_for_completed

  NetHttp2::Response.new(headers: @headers, body: @data) if @completed
end
wait_for_completed() click to toggle source
# File lib/net-http2/stream.rb, line 99
def wait_for_completed
  @mutex.synchronize { @cv.wait(@mutex, @request.timeout) }
end