mirror of
https://github.com/processone/ejabberd.git
synced 2024-11-24 16:23:40 +01:00
Option default_host for handling HTTP requests with ambiguous Host (EJAB-1261)
This commit is contained in:
parent
4819738e8f
commit
7d623d5eb4
@ -826,7 +826,7 @@ The available modules, their purpose and the options allowed by each one are:
|
|||||||
Options: \texttt{certfile}
|
Options: \texttt{certfile}
|
||||||
\titem{\texttt{ejabberd\_http}}
|
\titem{\texttt{ejabberd\_http}}
|
||||||
Handles incoming HTTP connections.\\
|
Handles incoming HTTP connections.\\
|
||||||
Options: \texttt{captcha}, \texttt{certfile}, \texttt{http\_bind}, \texttt{http\_poll},
|
Options: \texttt{captcha}, \texttt{certfile}, \texttt{default\_host}, \texttt{http\_bind}, \texttt{http\_poll},
|
||||||
\texttt{request\_handlers}, \texttt{tls}, \texttt{trusted\_proxies}, \texttt{web\_admin}\\
|
\texttt{request\_handlers}, \texttt{tls}, \texttt{trusted\_proxies}, \texttt{web\_admin}\\
|
||||||
\end{description}
|
\end{description}
|
||||||
|
|
||||||
@ -847,6 +847,11 @@ This is a detailed description of each option allowed by the listening modules:
|
|||||||
Simple web page that allows a user to fill a CAPTCHA challenge (see section \ref{captcha}).
|
Simple web page that allows a user to fill a CAPTCHA challenge (see section \ref{captcha}).
|
||||||
\titem{\{certfile, Path\}} Full path to a file containing the default SSL certificate.
|
\titem{\{certfile, Path\}} Full path to a file containing the default SSL certificate.
|
||||||
To define a certificate file specific for a given domain, use the global option \term{domain\_certfile}.
|
To define a certificate file specific for a given domain, use the global option \term{domain\_certfile}.
|
||||||
|
\titem{\{default\_host, undefined|HostName\}}
|
||||||
|
If the HTTP request received by ejabberd contains the HTTP header \term{Host}
|
||||||
|
with an ambiguous virtual host that doesn't match any one defined in ejabberd (see \ref{hostnames}),
|
||||||
|
then this configured HostName is set as the request Host.
|
||||||
|
The default value of this option is: \term{undefined}.
|
||||||
\titem{\{hosts, [Hostname, ...], [HostOption, ...]\}} \ind{options!hosts}
|
\titem{\{hosts, [Hostname, ...], [HostOption, ...]\}} \ind{options!hosts}
|
||||||
The external Jabber component that connects to this \term{ejabberd\_service}
|
The external Jabber component that connects to this \term{ejabberd\_service}
|
||||||
can serve one or more hostnames.
|
can serve one or more hostnames.
|
||||||
|
@ -65,6 +65,7 @@
|
|||||||
request_tp,
|
request_tp,
|
||||||
request_headers = [],
|
request_headers = [],
|
||||||
end_of_request = false,
|
end_of_request = false,
|
||||||
|
default_host,
|
||||||
trail = ""
|
trail = ""
|
||||||
}).
|
}).
|
||||||
|
|
||||||
@ -140,9 +141,12 @@ init({SockMod, Socket}, Opts) ->
|
|||||||
end,
|
end,
|
||||||
?DEBUG("S: ~p~n", [RequestHandlers]),
|
?DEBUG("S: ~p~n", [RequestHandlers]),
|
||||||
|
|
||||||
|
DefaultHost = gen_mod:get_opt(default_host, Opts, undefined),
|
||||||
|
|
||||||
?INFO_MSG("started: ~p", [{SockMod1, Socket1}]),
|
?INFO_MSG("started: ~p", [{SockMod1, Socket1}]),
|
||||||
State = #state{sockmod = SockMod1,
|
State = #state{sockmod = SockMod1,
|
||||||
socket = Socket1,
|
socket = Socket1,
|
||||||
|
default_host = DefaultHost,
|
||||||
request_handlers = RequestHandlers},
|
request_handlers = RequestHandlers},
|
||||||
receive_headers(State).
|
receive_headers(State).
|
||||||
|
|
||||||
@ -261,8 +265,9 @@ process_header(State, Data) ->
|
|||||||
[State#state.socket,
|
[State#state.socket,
|
||||||
State#state.request_method,
|
State#state.request_method,
|
||||||
element(2, State#state.request_path)]),
|
element(2, State#state.request_path)]),
|
||||||
{Host, Port, TP} = get_transfer_protocol(SockMod,
|
{HostProvided, Port, TP} = get_transfer_protocol(SockMod,
|
||||||
State#state.request_host),
|
State#state.request_host),
|
||||||
|
Host = get_host_really_served(State#state.default_host, HostProvided),
|
||||||
State2 = State#state{request_host = Host,
|
State2 = State#state{request_host = Host,
|
||||||
request_port = Port,
|
request_port = Port,
|
||||||
request_tp = TP},
|
request_tp = TP},
|
||||||
@ -294,6 +299,14 @@ process_header(State, Data) ->
|
|||||||
add_header(Name, Value, State) ->
|
add_header(Name, Value, State) ->
|
||||||
[{Name, Value} | State#state.request_headers].
|
[{Name, Value} | State#state.request_headers].
|
||||||
|
|
||||||
|
get_host_really_served(undefined, Provided) ->
|
||||||
|
Provided;
|
||||||
|
get_host_really_served(Default, Provided) ->
|
||||||
|
case lists:member(Provided, ?MYHOSTS) of
|
||||||
|
true -> Provided;
|
||||||
|
false -> Default
|
||||||
|
end.
|
||||||
|
|
||||||
%% @spec (SockMod, HostPort) -> {Host::string(), Port::integer(), TP}
|
%% @spec (SockMod, HostPort) -> {Host::string(), Port::integer(), TP}
|
||||||
%% where
|
%% where
|
||||||
%% SockMod = gen_tcp | tls
|
%% SockMod = gen_tcp | tls
|
||||||
|
Loading…
Reference in New Issue
Block a user