-
-
Notifications
You must be signed in to change notification settings - Fork 120
/
sockjs_http.erl
101 lines (82 loc) · 3.58 KB
/
sockjs_http.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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
-module(sockjs_http).
-export([path/1, method/1, body/1, body_qs/1, jsessionid/1, callback/1,
header/2, reply/4, chunk_start/3, chunk/2, chunk_end/1]).
-export([misultin_ws_loop/2]).
%% --------------------------------------------------------------------------
path({cowboy, Req}) -> {Path, Req1} = cowboy_http_req:raw_path(Req),
{binary_to_list(Path), {cowboy, Req1}};
path({misultin, Req} = R) -> case element(1, Req) of
misultin_ws -> {Req:get(path), R};
_ -> {abs_path, Path} = Req:get(uri),
{Path, R}
end.
method({cowboy, Req}) -> {Method, Req1} = cowboy_http_req:method(Req),
{Method, {cowboy, Req1}};
method({misultin, Req} = R) -> {Req:get(method), R}.
body({cowboy, Req}) -> {ok, Body, Req1} = cowboy_http_req:body(Req),
{Body, {cowboy, Req1}};
body({misultin, Req} = R) -> {Req:get(body), R}.
body_qs({cowboy, Req}) -> {BodyQS, Req1} = cowboy_http_req:body_qs(Req),
{proplists:get_value(<<"d">>, BodyQS),
{cowboy, Req1}};
body_qs({misultin, Req} = R) -> {proplists:get_value("d", Req:parse_post()), R}.
%% TODO fix Req mutation for these two
jsessionid({cowboy, Req}) ->
{C, _} = cowboy_http_req:cookie(<<"JSESSIONID">>, Req),
C;
jsessionid({misultin, Req}) ->
Req:get_cookie_value('JSESSIONID', Req:get_cookies()).
callback({cowboy, Req}) ->
{CB, Req1} = cowboy_http_req:qs_val(<<"c">>, Req),
{CB, {cowboy, Req1}};
callback({misultin, Req} = R) ->
CB = list_to_binary(proplists:get_value("c", Req:parse_qs())),
{CB, R}.
header(K, {cowboy, Req})->
{H, _} = cowboy_http_req:header(K, Req),
case H of
undefined -> undefined;
_ -> binary_to_list(H)
end;
header(K, {misultin, Req}) ->
misultin_utility:header_get_value(K, Req:get(headers)).
reply(Code, Headers, Body, {cowboy, Req}) when is_list(Body) ->
reply(Code, Headers, list_to_binary(Body), {cowboy, Req});
reply(Code, Headers, Body, {cowboy, Req}) ->
{ok, Req1} = cowboy_http_req:reply(Code, enbinary(Headers), Body, Req),
{cowboy, Req1};
reply(Code, Headers, Body, {misultin, Req} = R) ->
Req:respond(Code, Headers, Body),
R.
chunk_start(Code, Headers, {cowboy, Req}) ->
{ok, Req1} = cowboy_http_req:chunked_reply(Code, enbinary(Headers), Req),
{cowboy, Req1};
chunk_start(_Code, Headers, {misultin, Req} = R) ->
Req:chunk(head, Headers),
R.
chunk(Chunk, {cowboy, Req}) -> cowboy_http_req:chunk(Chunk, Req);
chunk(Chunk, {misultin, Req}) -> Req:chunk(Chunk).
chunk_end({cowboy, _Req} = R) -> R;
chunk_end({misultin, Req} = R) -> Req:chunk(done),
R.
enbinary(L) -> [{list_to_binary(K), list_to_binary(V)} || {K, V} <- L].
%% --------------------------------------------------------------------------
-define(WS_MODULE, sockjs_ws).
misultin_ws_loop(Ws, Receive) ->
Ws:send(["o"]),
Self = {?WS_MODULE, Ws, misultin},
Receive(Self, init),
misultin_ws_loop0(Ws, Receive, Self).
misultin_ws_loop0(Ws, Receive, Self) ->
receive
{browser, Data} ->
Decoded = sockjs_util:decode(Data),
Receive(Self, {recv, Decoded}),
misultin_ws_loop0(Ws, Receive, Self);
closed ->
Receive(Self, closed),
closed;
Msg ->
Receive(Self, {info, Msg}),
misultin_ws_loop0(Ws, Receive, Self)
end.