-
Notifications
You must be signed in to change notification settings - Fork 20
/
reversehttp.erl
76 lines (67 loc) · 2.28 KB
/
reversehttp.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
%% @author author <author@example.com>
%% @copyright YYYY author.
%% @doc TEMPLATE.
-module(reversehttp).
-author('author <author@example.com>').
-export([start/0, stop/0]).
-export([lookup/2, lookup/3, match_access_point/2]).
ensure_started(App) ->
case application:start(App) of
ok ->
ok;
{error, {already_started, App}} ->
ok
end.
%% @spec start() -> ok
%% @doc Start the reversehttp server.
start() ->
reversehttp_deps:ensure(),
ensure_started(crypto),
application:start(reversehttp).
%% @spec stop() -> ok
%% @doc Stop the reversehttp server.
stop() ->
Res = application:stop(reversehttp),
application:stop(crypto),
Res.
lookup(Key, AssocList) ->
case lists:keysearch(Key, 1, AssocList) of
{value, {_, Value}} ->
{ok, Value};
false ->
{error, not_found}
end.
lookup(Key, AssocList, DefaultValue) ->
case lists:keysearch(Key, 1, AssocList) of
{value, {_, Value}} ->
Value;
false ->
DefaultValue
end.
match_access_point(Req, Config) ->
Host = case Req:get_header_value(host) of
undefined -> lookup(canonical_host, Config, "localhost");
V -> V
end,
match_access_point1(mochiweb_util:urlsplit_path(Req:get(raw_path)),
Host,
lookup(access_point_paths, Config, [])).
match_access_point1({Path, _QueryPart, _Fragment}, _Host, []) ->
%% It's a request for content from the main vhost(s). We indicate
%% to our caller that they should serve content as usual.
"/" ++ StaticPath = Path,
{normal, StaticPath};
match_access_point1(Pieces = {Path, QueryPart, _Fragment}, Host, [AccessPoint | AccessPoints]) ->
case lists:prefix(AccessPoint, Path) of
true ->
%% The request was for one of our access points.
StrippedPath = string:substr(Path, length(AccessPoint) + 1),
PathComponents = string:tokens(StrippedPath, "/"),
QueryFields = mochiweb_util:parse_qs(QueryPart),
{access_point,
"http://" ++ Host ++ AccessPoint,
PathComponents,
QueryFields};
false ->
match_access_point1(Pieces, Host, AccessPoints)
end.