Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:Ledest:erlang:23
chatterbox
chatterbox-0.8.0-git.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File chatterbox-0.8.0-git.patch of Package chatterbox
diff --git a/src/h2_connection.erl b/src/h2_connection.erl index 6e0018e..17f3a88 100644 --- a/src/h2_connection.erl +++ b/src/h2_connection.erl @@ -4,6 +4,7 @@ %% Start/Stop API -export([ + start_client_link/2, start_client_link/5, start_ssl_upgrade_link/5, start_server_link/3, @@ -121,6 +122,13 @@ start_client_link(Transport, Host, Port, SSLOptions, Http2Settings) -> gen_statem:start_link(?MODULE, {client, Transport, Host, Port, SSLOptions, Http2Settings}, []). +-spec start_client_link(socket(), + settings() + ) -> + {ok, pid()} | ignore | {error, term()}. +start_client_link({Transport, Socket}, Http2Settings) -> + gen_statem:start_link(?MODULE, {client, {Transport, Socket}, Http2Settings}, []). + -spec start_ssl_upgrade_link(inet:ip_address() | inet:hostname(), inet:port_number(), binary(), @@ -149,8 +157,7 @@ become(Socket, Http2Settings) -> -spec become(socket(), settings(), maps:map()) -> no_return(). become({Transport, Socket}, Http2Settings, ConnectionSettings) -> ok = sock:setopts({Transport, Socket}, [{packet, raw}, binary]), - {_, _, NewState} = - start_http2_server(Http2Settings, + case start_http2_server(Http2Settings, #connection{ stream_callback_mod = maps:get(stream_callback_mod, ConnectionSettings, @@ -160,54 +167,47 @@ become({Transport, Socket}, Http2Settings, ConnectionSettings) -> application:get_env(chatterbox, stream_callback_opts, [])), streams = h2_stream_set:new(server), socket = {Transport, Socket} - }), - gen_statem:enter_loop(?MODULE, - [], - handshake, - NewState). + }) of + {_, handshake, NewState} -> + gen_statem:enter_loop(?MODULE, + [], + handshake, + NewState); + {_, closing, _NewState} -> + sock:close({Transport, Socket}), + exit(invalid_preface) + end. %% Init callback init({client, Transport, Host, Port, SSLOptions, Http2Settings}) -> case Transport:connect(Host, Port, client_options(Transport, SSLOptions)) of {ok, Socket} -> - ok = sock:setopts({Transport, Socket}, [{packet, raw}, binary]), - Transport:send(Socket, <<?PREFACE>>), - InitialState = - #connection{ - type = client, - streams = h2_stream_set:new(client), - socket = {Transport, Socket}, - next_available_stream_id=1, - flow_control=application:get_env(chatterbox, client_flow_control, auto) - }, - {ok, - handshake, - send_settings(Http2Settings, InitialState), - 4500}; + init({client, {Transport, Socket}, Http2Settings}); {error, Reason} -> {stop, Reason} end; +init({client, {Transport, Socket}, Http2Settings}) -> + ok = sock:setopts({Transport, Socket}, [{packet, raw}, binary, {active, once}]), + Transport:send(Socket, <<?PREFACE>>), + InitialState = + #connection{ + type = client, + streams = h2_stream_set:new(client), + socket = {Transport, Socket}, + next_available_stream_id=1, + flow_control=application:get_env(chatterbox, client_flow_control, auto) + }, + {ok, + handshake, + send_settings(Http2Settings, InitialState), + 4500}; init({client_ssl_upgrade, Host, Port, InitialMessage, SSLOptions, Http2Settings}) -> case gen_tcp:connect(Host, Port, [{active, false}]) of {ok, TCP} -> gen_tcp:send(TCP, InitialMessage), case ssl:connect(TCP, client_options(ssl, SSLOptions)) of {ok, Socket} -> - active_once({ssl, Socket}), - ok = ssl:setopts(Socket, [{packet, raw}, binary]), - ssl:send(Socket, <<?PREFACE>>), - InitialState = - #connection{ - type = client, - streams = h2_stream_set:new(client), - socket = {ssl, Socket}, - next_available_stream_id=1, - flow_control=application:get_env(chatterbox, client_flow_control, auto) - }, - {ok, - handshake, - send_settings(Http2Settings, InitialState), - 4500}; + init({client, {ssl, Socket}, Http2Settings}); {error, Reason} -> {stop, Reason} end; @@ -1359,7 +1359,7 @@ client_options(Transport, SSLOptions) -> ClientSocketOptions = [ binary, {packet, raw}, - {active, once} + {active, false} ], case Transport of ssl -> diff --git a/src/h2_padding.erl b/src/h2_padding.erl index f948b2b..10f6557 100644 --- a/src/h2_padding.erl +++ b/src/h2_padding.erl @@ -26,8 +26,8 @@ read_possibly_padded_payload(Bin, Header) -> -> binary() | {error, error_code()}. read_padded_payload(<<Padding:8,Bytes/bits>>, #frame_header{length=Length}) -> - L = Length - Padding, - case L > 0 of + L = Length - Padding - 1, % Exclude Pad length field (1 byte) + case L >= 0 of true -> <<Data:L/binary,_:Padding/binary>> = Bytes, Data; diff --git a/src/h2_stream_set.erl b/src/h2_stream_set.erl index 4a2c6a1..4dec759 100644 --- a/src/h2_stream_set.erl +++ b/src/h2_stream_set.erl @@ -818,10 +818,30 @@ update_data_queue(_, _, S) -> response(#closed_stream{ response_headers=Headers, response_body=Body}) -> - {Headers, Body}; + Encoding = case lists:keyfind(<<"content-encoding">>, 1, Headers) of + false -> identity; + {_, Encoding0} -> binary_to_atom(Encoding0, 'utf8') + end, + {Headers, decode_body(Body, Encoding)}; response(_) -> no_response. +decode_body(Body, identity) -> + Body; +decode_body(Body, gzip) -> + zlib:gunzip(Body); +decode_body(Body, zip) -> + zlib:unzip(Body); +decode_body(Body, compress) -> + zlib:uncompress(Body); +decode_body(Body, deflate) -> + Z = zlib:open(), + ok = zlib:inflateInit(Z, -15), + Decompressed = try zlib:inflate(Z, Body) catch E:V -> {E,V} end, + ok = zlib:inflateEnd(Z), + ok = zlib:close(Z), + iolist_to_binary(Decompressed). + recv_window_size(#active_stream{recv_window_size=RWS}) -> RWS; recv_window_size(_) -> diff --git a/test/http2c.erl b/test/http2c.erl index b67890f..04fac57 100644 --- a/test/http2c.erl +++ b/test/http2c.erl @@ -142,7 +142,7 @@ init([]) -> BinToSend = h2_frame_settings:send(#settings{}, ClientSettings), Transport:send(Socket, BinToSend), - {AH, _PAck} = h2_frame:read({Transport, Socket}, 100), + {AH, _PAck} = h2_frame:read({Transport, Socket}, 1000), _ = ?IS_FLAG((AH#frame_header.flags), ?FLAG_ACK), case Transport of
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor