Current section

30 Versions

Jump to

Compare versions

11 files changed
+131 additions
-100 deletions
  @@ -20,12 +20,14 @@
20 20 {<<"maintainers">>,[<<"Henry Popp">>]}.
21 21 {<<"name">>,<<"kadabra">>}.
22 22 {<<"requirements">>,
23 - [[{<<"app">>,<<"hpack">>},
24 - {<<"name">>,<<"hpack_erl">>},
25 - {<<"optional">>,false},
26 - {<<"requirement">>,<<"~> 0.2.3">>}],
27 - [{<<"app">>,<<"scribe">>},
23 + [[{<<"app">>,<<"scribe">>},
28 24 {<<"name">>,<<"scribe">>},
29 25 {<<"optional">>,true},
30 - {<<"requirement">>,<<"~> 0.4">>}]]}.
31 - {<<"version">>,<<"0.3.1">>}.
26 + {<<"repository">>,<<"hexpm">>},
27 + {<<"requirement">>,<<"~> 0.4">>}],
28 + [{<<"app">>,<<"hpack">>},
29 + {<<"name">>,<<"hpack_erl">>},
30 + {<<"optional">>,false},
31 + {<<"repository">>,<<"hexpm">>},
32 + {<<"requirement">>,<<"~> 0.2.3">>}]]}.
33 + {<<"version">>,<<"0.3.2">>}.
  @@ -14,8 +14,8 @@ defmodule Kadabra.Connection do
14 14 use GenServer
15 15 require Logger
16 16
17 - alias Kadabra.{Connection, Encodable, Error,
18 - Frame, Hpack, Http2, Stream}
17 + alias Kadabra.{Connection, Encodable, Error, Frame, Hpack, Http2, Stream}
18 + alias Kadabra.Connection.Ssl
19 19 alias Kadabra.Frame.{Continuation, Data, Goaway, Headers, Ping,
20 20 PushPromise, RstStream, WindowUpdate}
21 21
  @@ -58,7 +58,7 @@ defmodule Kadabra.Connection do
58 58 end
59 59
60 60 def init({:ok, uri, pid, opts}) do
61 - case Connection.Ssl.connect(uri, opts) do
61 + case Ssl.connect(uri, opts) do
62 62 {:ok, socket} ->
63 63 send_preface_and_settings(socket, opts[:settings])
64 64 state = initial_state(socket, uri, pid, opts)
  @@ -165,12 +165,11 @@ defmodule Kadabra.Connection do
165 165 old_settings = flow.settings
166 166 flow = Connection.FlowControl.update_settings(flow, settings)
167 167
168 - notify_initial_window_change(ref, old_settings, flow)
168 + notify_settings_change(ref, old_settings, flow)
169 169
170 170 pid = Hpack.via_tuple(ref, :encoder)
171 171 Hpack.update_max_table_size(pid, settings.max_header_list_size)
172 172
173 -
174 173 bin = Frame.Settings.ack |> Encodable.to_bin
175 174 :ssl.send(state.socket, bin)
176 175
  @@ -192,15 +191,16 @@ defmodule Kadabra.Connection do
192 191
193 192 def recv(_else, state), do: {:noreply, state}
194 193
195 - def notify_initial_window_change(ref,
196 - %{initial_window_size: old_window},
197 - %{settings: settings} = flow) do
194 + def notify_settings_change(ref,
195 + %{initial_window_size: old_window},
196 + %{settings: settings} = flow) do
197 + max_frame_size = settings.max_frame_size
198 198 new_window = settings.initial_window_size
199 199 window_diff = new_window - old_window
200 200
201 201 for stream_id <- flow.active_streams do
202 202 pid = Stream.via_tuple(ref, stream_id)
203 - Stream.cast_recv(pid, {:window_change, window_diff})
203 + Stream.cast_recv(pid, {:settings_change, window_diff, max_frame_size})
204 204 end
205 205 end
206 206
  @@ -263,7 +263,7 @@ defmodule Kadabra.Connection do
263 263 end
264 264
265 265 def parse_ssl(socket, bin, state) do
266 - case Kadabra.Frame.new(bin) do
266 + case Frame.new(bin) do
267 267 {:ok, frame, rest} ->
268 268 state = handle_response(frame, state)
269 269 parse_ssl(socket, rest, state)
  @@ -301,7 +301,7 @@ defmodule Kadabra.Connection do
301 301
302 302 @spec process(frame, t) :: :ok
303 303 def process(%Frame.Data{stream_id: 0}, state) do
304 - # TODO: This is an error
304 + # This is an error
305 305 state
306 306 end
307 307 def process(%Frame.Data{stream_id: stream_id} = frame, state) do
  @@ -27,13 +27,7 @@ defmodule Kadabra.Connection.Settings do
27 27 @max_header_list_size 0x6
28 28
29 29 def default do
30 - %__MODULE__{
31 - initial_window_size: 1_048_576,
32 - max_frame_size: 1_048_576,
33 - enable_push: true,
34 - max_header_list_size: 4_096,
35 - max_concurrent_streams: 1_000
36 - }
30 + %__MODULE__{}
37 31 end
38 32
39 33 @doc ~S"""
  @@ -91,11 +85,10 @@ defmodule Kadabra.Connection.Settings do
91 85 end
92 86
93 87 def put(settings, @max_frame_size, value) do
94 - cond do
95 - value < 16_384 or value > 16_777_215 ->
96 - {:error, Error.protocol_error, settings}
97 - true ->
98 - {:ok, %{settings | max_frame_size: value}}
88 + if value < 16_384 or value > 16_777_215 do
89 + {:error, Error.protocol_error, settings}
90 + else
91 + {:ok, %{settings | max_frame_size: value}}
99 92 end
100 93 end
  @@ -65,25 +65,21 @@ defmodule Kadabra.Error do
65 65 0xfff
66 66 """
67 67 @spec string(integer) :: String.t | integer
68 - def string(code) do
69 - case code do
70 - 0x0 -> "NO_ERROR"
71 - 0x1 -> "PROTOCOL_ERROR"
72 - 0x2 -> "INTERNAL_ERROR"
73 - 0x3 -> "FLOW_CONTROL_ERROR"
74 - 0x4 -> "SETTINGS_TIMEOUT"
75 - 0x5 -> "STREAM_CLOSED"
76 - 0x6 -> "FRAME_SIZE_ERROR"
77 - 0x7 -> "REFUSED_STREAM"
78 - 0x8 -> "CANCEL"
79 - 0x9 -> "COMPRESSION_ERROR"
80 - 0xa -> "CONNECT_ERROR"
81 - 0xb -> "ENHANCE_YOUR_CALM"
82 - 0xc -> "INADEQUATE_SECURITY"
83 - 0xd -> "HTTP_1_1_REQUIRED"
84 - error -> error
85 - end
86 - end
68 + def string(0x0), do: "NO_ERROR"
69 + def string(0x1), do: "PROTOCOL_ERROR"
70 + def string(0x2), do: "INTERNAL_ERROR"
71 + def string(0x3), do: "FLOW_CONTROL_ERROR"
72 + def string(0x4), do: "SETTINGS_TIMEOUT"
73 + def string(0x5), do: "STREAM_CLOSED"
74 + def string(0x6), do: "FRAME_SIZE_ERROR"
75 + def string(0x7), do: "REFUSED_STREAM"
76 + def string(0x8), do: "CANCEL"
77 + def string(0x9), do: "COMPRESSION_ERROR"
78 + def string(0xa), do: "CONNECT_ERROR"
79 + def string(0xb), do: "ENHANCE_YOUR_CALM"
80 + def string(0xc), do: "INADEQUATE_SECURITY"
81 + def string(0xd), do: "HTTP_1_1_REQUIRED"
82 + def string(error), do: error
87 83
88 84 @doc ~S"""
89 85 Returns integer error code given string error.
  @@ -95,23 +91,19 @@ defmodule Kadabra.Error do
95 91 iex> Kadabra.Error.code("NOT_AN_ERROR")
96 92 "NOT_AN_ERROR"
97 93 """
98 - def code(string) do
99 - case string do
100 - "NO_ERROR" -> 0x0
101 - "PROTOCOL_ERROR" -> 0x1
102 - "INTERNAL_ERROR" -> 0x2
103 - "FLOW_CONTROL_ERROR" -> 0x3
104 - "SETTINGS_TIMEOUT" -> 0x4
105 - "STREAM_CLOSED" -> 0x5
106 - "FRAME_SIZE_ERROR" -> 0x6
107 - "REFUSED_STREAM" -> 0x7
108 - "CANCEL" -> 0x8
109 - "COMPRESSION_ERROR" -> 0x9
110 - "CONNECT_ERROR" -> 0xa
111 - "ENHANCE_YOUR_CALM" -> 0xb
112 - "INADEQUATE_SECURITY" -> 0xc
113 - "HTTP_1_1_REQUIRED" -> 0xd
114 - error -> error
115 - end
116 - end
94 + def code("NO_ERROR"), do: 0x0
95 + def code("PROTOCOL_ERROR"), do: 0x1
96 + def code("INTERNAL_ERROR"), do: 0x2
97 + def code("FLOW_CONTROL_ERROR"), do: 0x3
98 + def code("SETTINGS_TIMEOUT"), do: 0x4
99 + def code("STREAM_CLOSED"), do: 0x5
100 + def code("FRAME_SIZE_ERROR"), do: 0x6
101 + def code("REFUSED_STREAM"), do: 0x7
102 + def code("CANCEL"), do: 0x8
103 + def code("COMPRESSION_ERROR"), do: 0x9
104 + def code("CONNECT_ERROR"), do: 0xa
105 + def code("ENHANCE_YOUR_CALM"), do: 0xb
106 + def code("INADEQUATE_SECURITY"), do: 0xc
107 + def code("HTTP_1_1_REQUIRED"), do: 0xd
108 + def code(error), do: error
117 109 end
  @@ -14,7 +14,6 @@ defmodule Kadabra.Frame.Continuation do
14 14 @doc ~S"""
15 15 Initializes a new `Frame.Continuation` given a `Frame`.
16 16
17 -
18 17 ## Examples
19 18
20 19 iex> frame = %Kadabra.Frame{payload: <<136>>, flags: 0x4}
Loading more files…