-
Notifications
You must be signed in to change notification settings - Fork 69
/
Copy pathpeer_test_handler.erl
55 lines (46 loc) · 1.87 KB
/
peer_test_handler.erl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
-module(peer_test_handler).
-include_lib("chatterbox/include/http2.hrl").
-behaviour(h2_stream).
-export([
init/3,
on_receive_request_headers/2,
on_send_push_promise/2,
on_receive_request_data/2,
on_request_end_stream/1
]).
-record(state, {conn_pid :: pid(),
stream_id :: stream_id(),
peer = undefined :: undefined | {inet:ip_addres(),
inet:port_number()}
}).
-spec init(pid(), stream_id(), list()) -> {ok, any()}.
init(ConnPid, StreamId, _Opts) ->
{ok, #state{conn_pid=ConnPid,
stream_id=StreamId}}.
-spec on_receive_request_headers(
Headers :: hpack:headers(),
CallbackState :: any()) -> {ok, NewState :: any()}.
on_receive_request_headers(_Headers, State=#state{conn_pid=ConnPid}) ->
{ok, Peer} = h2_connection:get_peer(ConnPid),
{ok, State#state{peer=Peer}}.
-spec on_send_push_promise(
Headers :: hpack:headers(),
CallbackState :: any()) -> {ok, NewState :: any()}.
on_send_push_promise(_Headers, State) -> {ok, State}.
-spec on_receive_request_data(
iodata(),
CallbackState :: any())-> {ok, NewState :: any()}.
on_receive_request_data(_Data, State) -> {ok, State}.
-spec on_request_end_stream(
CallbackState :: any()) ->
{ok, NewState :: any()}.
on_request_end_stream(State=#state{conn_pid=ConnPid,
stream_id=StreamId,
peer={Address, Port}}) ->
Body = list_to_binary(io_lib:format("Address: ~p, Port: ~p", [Address, Port])),
ResponseHeaders = [
{<<":status">>,<<"200">>}
],
h2_connection:send_headers(ConnPid, StreamId, ResponseHeaders),
h2_connection:send_body(ConnPid, StreamId, Body),
{ok, State}.