Class: Protocol::HTTP2::Client

Inherits:
Connection show all
Defined in:
lib/protocol/http2/client.rb

Instance Attribute Summary

Attributes inherited from Connection

#dependencies, #framer, #local_settings, #local_window, #remote_settings, #remote_stream_id, #remote_window, #state, #streams

Instance Method Summary collapse

Methods inherited from Connection

#[], #accept_push_promise_stream, #accept_stream, #children, #client_stream_id?, #close, #close!, #closed?, #closed_stream_id?, #consume_window, #create_stream, #decode_headers, #delete, #dependency_for, #encode_headers, #id, #ignore_frame?, #maximum_concurrent_streams, #maximum_frame_size, #next_stream_id, #open!, #parent, #process_settings, #read_frame, #receive_continuation, #receive_data, #receive_frame, #receive_goaway, #receive_headers, #receive_ping, #receive_priority, #receive_reset_stream, #receive_settings, #receive_window_update, #send_goaway, #send_ping, #send_priority, #send_settings, #server_stream_id?, #update_local_settings, #update_remote_settings, #write_frame, #write_frames

Methods included from FlowControlled

#available_frame_size, #available_size, #consume_local_window, #consume_remote_window, #receive_window_update, #request_window_update, #send_window_update, #update_local_window, #window_updated

Constructor Details

#initialize(framer) ⇒ Client

Returns a new instance of Client.



26
27
28
# File 'lib/protocol/http2/client.rb', line 26

def initialize(framer)
  super(framer, 1)
end

Instance Method Details

#create_push_promise_streamObject

Raises:



58
59
60
# File 'lib/protocol/http2/client.rb', line 58

def create_push_promise_stream
  raise ProtocolError, "Cannot create push promises from client!"
end

#local_stream_id?(id) ⇒ Boolean

Returns:

  • (Boolean)


30
31
32
# File 'lib/protocol/http2/client.rb', line 30

def local_stream_id?(id)
  id.odd?
end

#receive_push_promise(frame) ⇒ Object



62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/protocol/http2/client.rb', line 62

def receive_push_promise(frame)
  if frame.stream_id == 0
    raise ProtocolError, "Cannot receive headers for stream 0!"
  end
  
  if stream = @streams[frame.stream_id]
    # This is almost certainly invalid:
    promised_stream, request_headers = stream.receive_push_promise(frame)
    
    if stream.closed?
      @streams.delete(stream.id)
    end
    
    return promised_stream, request_headers
  end
end

#remote_stream_id?(id) ⇒ Boolean

Returns:

  • (Boolean)


34
35
36
# File 'lib/protocol/http2/client.rb', line 34

def remote_stream_id?(id)
  id.even?
end

#send_connection_preface(settings = []) ⇒ Object



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/protocol/http2/client.rb', line 42

def send_connection_preface(settings = [])
  if @state == :new
    @framer.write_connection_preface
    
    send_settings(settings)
    
    yield if block_given?
    
    read_frame do |frame|
      raise ProtocolError, "First frame must be #{SettingsFrame}, but got #{frame.class}" unless frame.is_a? SettingsFrame
    end
  else
    raise ProtocolError, "Cannot send connection preface in state #{@state}"
  end
end

#valid_remote_stream_id?(stream_id) ⇒ Boolean

Returns:

  • (Boolean)


38
39
40
# File 'lib/protocol/http2/client.rb', line 38

def valid_remote_stream_id?(stream_id)
  stream_id.even?
end