Closed jasl closed 5 years ago
From code:
to_json(Req, #http_api_state{command_category = Category, bindings = B} = State) ->
Cmds = mongoose_commands:list(admin, Category, method_to_action(<<"GET">>)),
Arity = length(B),
[Command] = [C || C <- Cmds, mongoose_commands:arity(C) == Arity], % line 159
process_request(<<"GET">>, Command, Req, State).
There is no api/users command configured, probably because of misconfiguration.
Please, include listen
block of mongooseim.cfg configuration file, if you are still feeling, that it's a bug and not misconfiguration.
Some configuration documentation can be found here: https://mongooseim.readthedocs.io/en/latest/advanced-configuration/Listener-modules/#http-based-services-bosh-websocket-rest-ejabberd_cowboy
You can also generate a development release using make mim1
and check the config example _build/mim1/rel/mongooseim/etc/mongooseim.cfg
, it should have the cowboy listeners configured correctly.
It should look something like this:
{ 8089 , ejabberd_cowboy, [
{num_acceptors, 10},
{transport_options, [{max_connections, 1024}]},
{protocol_options, [{compress, true}]},
{ssl, [{certfile, "priv/ssl/fake_cert.pem"}, {keyfile, "priv/ssl/fake_key.pem"}, {password, ""}]},
{modules, [
{"_", "/api/sse", lasse_handler, [mongoose_client_api_sse]},
{"_", "/api/messages/[:with]", mongoose_client_api_messages, []},
{"_", "/api/contacts/[:jid]", mongoose_client_api_contacts, []},
{"_", "/api/rooms/[:id]", mongoose_client_api_rooms, []},
{"_", "/api/rooms/[:id]/config", mongoose_client_api_rooms_config, []},
{"_", "/api/rooms/:id/users/[:user]", mongoose_client_api_rooms_users, []},
{"_", "/api/rooms/[:id]/messages", mongoose_client_api_rooms_messages, []}
]}
]},
{"_", "/api/rooms/:id/users/[:user]", mongoose_client_api_rooms_users, []}
is the module you try to access.
@arcusfelis
Here's my configuration, it should be generated on make rel
and I didn't modify it, I only tried http (port 8088)
{{8088, "127.0.0.1"}, ejabberd_cowboy, [
{num_acceptors, 10},
{transport_options, [{max_connections, 1024}]},
{modules, [
{"localhost", "/api", mongoose_api_admin, []}
]}
]},
I've read the doc, it said mongoose_api_admin - REST API for admin commands. Exposes all mongoose_commands. It expects one optional argument
that I think I'm not misconfigured.
But I'm not familiar with Erlang and MongooseIM, so I'm not sure anything
I've updated my configuration as yours @arcusfelis
{8088, ejabberd_cowboy, [
{num_acceptors, 10},
{transport_options, [{max_connections, 1024}]},
{modules, [
% {"_", "/api", mongoose_api_admin, []},
{"_", "/api/sse", lasse_handler, [mongoose_client_api_sse]},
{"_", "/api/messages/[:with]", mongoose_client_api_messages, []},
{"_", "/api/contacts/[:jid]", mongoose_client_api_contacts, []},
{"_", "/api/rooms/[:id]", mongoose_client_api_rooms, []},
{"_", "/api/rooms/[:id]/config", mongoose_client_api_rooms_config, []},
{"_", "/api/rooms/:id/users/[:user]", mongoose_client_api_rooms_users, []},
{"_", "/api/rooms/[:id]/messages", mongoose_client_api_rooms_messages, []}
]}
]},
still got error, but reason is different
20:16:56.924 [error] CRASH REPORT Process <0.1398.0> with 0 neighbours crashed with reason: no match of right hand value error in mongoose_client_api:check_password/2 line 114
20:16:56.926 [error] Lager event handler error_logger_lager_h exited with reason {'EXIT',{{case_clause,['ejabberd_cowboy_0.0.0.0_8088',<0.1396.0>,1,<0.1398.0>,{badmatch,error},[{mongoose_client_api,check_password,2,[{file,"/Users/jasl/Workspaces/im/MongooseIM/_build/prod/lib/mongooseim/src/mongoose_client_api.erl"},{line,114}]},{mongoose_client_api,do_authorize,2,[{file,"/Users/jasl/Workspaces/im/MongooseIM/_build/prod/lib/mongooseim/src/mongoose_client_api.erl"},{line,109}]},{mongoose_client_api,authorize,4,[{file,"/Users/jasl/Workspaces/im/MongooseIM/_build/prod/lib/..."},...]},...]]},...}}
I attached my full mongooseim.cfg
, XMPP works great, but got problem on MongooseIM API
%%%
%%% ejabberd configuration file
%%%
%%%'
%%% The parameters used in this configuration file are explained in more detail
%%% in the ejabberd Installation and Operation Guide.
%%% Please consult the Guide in case of doubts, it is included with
%%% your copy of ejabberd, and is also available online at
%%% http://www.process-one.net/en/ejabberd/docs/
%%% This configuration file contains Erlang terms.
%%% In case you want to understand the syntax, here are the concepts:
%%%
%%% - The character to comment a line is %
%%%
%%% - Each term ends in a dot, for example:
%%% override_global.
%%%
%%% - A tuple has a fixed definition, its elements are
%%% enclosed in {}, and separated with commas:
%%% {loglevel, 4}.
%%%
%%% - A list can have as many elements as you want,
%%% and is enclosed in [], for example:
%%% [http_poll, web_admin, tls]
%%%
%%% Pay attention that list elements are delimited with commas,
%%% but no comma is allowed after the last list element. This will
%%% give a syntax error unlike in more lenient languages (e.g. Python).
%%%
%%% - A keyword of ejabberd is a word in lowercase.
%%% Strings are enclosed in "" and can contain spaces, dots, ...
%%% {language, "en"}.
%%% {ldap_rootdn, "dc=example,dc=com"}.
%%%
%%% - This term includes a tuple, a keyword, a list, and two strings:
%%% {hosts, ["jabber.example.net", "im.example.com"]}.
%%%
%%% - This config is preprocessed during release generation by a tool which
%%% interprets double curly braces as substitution markers, so avoid this
%%% syntax in this file (though it's valid Erlang).
%%%
%%% So this is OK (though arguably looks quite ugly):
%%% { {s2s_addr, "example-host.net"}, {127,0,0,1} }.
%%%
%%% And I can't give an example of what's not OK exactly because
%%% of this rule.
%%%
%%%. =======================
%%%' OVERRIDE STORED OPTIONS
%%
%% Override the old values stored in the database.
%%
%%
%% Override global options (shared by all ejabberd nodes in a cluster).
%%
%% override_global.
%%
%% Override local options (specific for this particular ejabberd node).
%%
%% override_local.
%%
%% Remove the Access Control Lists before new ones are added.
%%
%% override_acls.
%%%. =========
%%%' DEBUGGING
%%
%% loglevel: Verbosity of log files generated by ejabberd.
%% 0: No ejabberd log at all (not recommended)
%% 1: Critical
%% 2: Error
%% 3: Warning
%% 4: Info
%% 5: Debug
%%
{loglevel, 4}.
%%%. ================
%%%' SERVED HOSTNAMES
%%
%% hosts: Domains served by ejabberd.
%% You can define one or several, for example:
%% {hosts, ["example.net", "example.com", "example.org"]}.
%%
{hosts, ["local-dev.my_site.com", "im.my_site.com"]}.
%%
%% route_subdomains: Delegate subdomains to other XMPP servers.
%% For example, if this ejabberd serves example.org and you want
%% to allow communication with an XMPP server called im.example.org.
%%
% {route_subdomains, s2s}.
%%%. ===============
%%%' LISTENING PORTS
%%
%% listen: The ports ejabberd will listen on, which service each is handled
%% by and what options to start it with.
%%
{listen, [
%% BOSH and WS endpoints over HTTP
{5280, ejabberd_cowboy, [
{num_acceptors, 10},
{transport_options, [{max_connections, 1024}]},
{modules, [
{"_", "/http-bind", mod_bosh},
{"_", "/ws-xmpp", mod_websockets, [
{ejabberd_service, [
{access, all},
{shaper_rule, fast},
{ip, {127, 0, 0, 1}}
]},
{timeout, 600000}, {ping_rate, 2000}
]}
]}
]},
%% BOSH and WS endpoints over HTTPS
% {5285, ejabberd_cowboy, [
% {num_acceptors, 10},
% {transport_options, [{max_connections, 1024}]},
% {ssl, [{certfile, "priv/ssl/cybros.io.pem"}, {keyfile, "priv/ssl/cybros.io.key"}, {password, ""}]},
% {modules, [
% {"_", "/http-bind", mod_bosh},
% {"_", "/ws-xmpp", mod_websockets, [
% {timeout, 600000}, {ping_rate, 60000}
% ]}
% ]}
% ]},
%% MongooseIM HTTP API it's important to start it on localhost
%% or some private interface only (not accessible from the outside)
%% At least start it on different port which will be hidden behind firewall
{{8088, "127.0.0.1"}, ejabberd_cowboy, [
{num_acceptors, 10},
{transport_options, [{max_connections, 1024}]},
{modules, [
{"localhost", "/api", mongoose_api_admin, []}
]}
]},
% {8089, ejabberd_cowboy, [
% {num_acceptors, 10},
% {transport_options, [{max_connections, 1024}]},
% {protocol_options, [{compress, true}]},
% {ssl, [{certfile, "priv/ssl/cybros.io.pem"}, {keyfile, "priv/ssl/cybros.io.key"}, {password, ""}]},
% {modules, [
% {"_", "/api/sse", lasse_handler, [mongoose_client_api_sse]},
% {"_", "/api/messages/[:with]", mongoose_client_api_messages, []},
% {"_", "/api/contacts/[:jid]", mongoose_client_api_contacts, []},
% {"_", "/api/rooms/[:id]", mongoose_client_api_rooms, []},
% {"_", "/api/rooms/[:id]/config", mongoose_client_api_rooms_config, []},
% {"_", "/api/rooms/:id/users/[:user]", mongoose_client_api_rooms_users, []},
% {"_", "/api/rooms/[:id]/messages", mongoose_client_api_rooms_messages, []}
% ]}
% ]},
% {5222, ejabberd_c2s, [
% %%
% %% If TLS is compiled in and you installed a SSL
% %% certificate, specify the full path to the
% %% file and uncomment this line:
% %%
% {certfile, "priv/ssl/server.pem"}, starttls,
% %% {zlib, 10000},
% %% https://www.openssl.org/docs/apps/ciphers.html#CIPHER_STRINGS
% %% {ciphers, "DEFAULT:!EXPORT:!LOW:!SSLv2"},
% {access, c2s},
% {shaper, c2s_shaper},
% {max_stanza_size, 65536},
% {protocol_options, ["no_sslv3"]}
% ]},
{5269, ejabberd_s2s_in, [
{shaper, s2s_shaper},
{max_stanza_size, 131072},
{protocol_options, ["no_sslv3"]}
]},
%%
%% ejabberd_service: Interact with external components (transports, ...)
%%
{8888, ejabberd_service, [
{access, all},
{shaper_rule, fast},
{ip, {127, 0, 0, 1}},
{password, "secret"}
]}
%%
%% ejabberd_stun: Handles STUN Binding requests
%%
% {{3478, udp}, ejabberd_stun, []}
]}.
%%
%% s2s_use_starttls: Enable STARTTLS + Dialback for S2S connections.
%% Allowed values are: false optional required required_trusted
%% You must specify a certificate file.
%%
{s2s_use_starttls, optional}.
%%
%% s2s_certfile: Specify a certificate file.
%%
% {s2s_certfile, "priv/ssl/cybros.io.pem"}.
%% https://www.openssl.org/docs/apps/ciphers.html#CIPHER_STRINGS
% {s2s_ciphers, "DEFAULT:!EXPORT:!LOW:!SSLv2"}.
%%
%% domain_certfile: Specify a different certificate for each served hostname.
%%
% {domain_certfile, "example.org", "/path/to/example_org.pem"}.
% {domain_certfile, "example.com", "/path/to/example_com.pem"}.
%%
%% S2S whitelist or blacklist
%%
%% Default s2s policy for undefined hosts.
%%
{s2s_default_policy, deny}.
%%
%% Allow or deny communication with specific servers.
%%
% {{s2s_host, "goodhost.org"}, allow}.
% {{s2s_host, "badhost.org"}, deny}.
{outgoing_s2s_port, 5269}.
%%
%% IP addresses predefined for specific hosts to skip DNS lookups.
%% Ports defined here take precedence over outgoing_s2s_port.
%% Examples:
%%
% {{s2s_addr, "example-host.net"}, {127,0,0,1}}.
% {{s2s_addr, "example-host.net"}, {{127,0,0,1}, 5269}}.
% {{s2s_addr, "example-host.net"}, {{127,0,0,1}, 5269}}.
%%
%% Outgoing S2S options
%%
%% Preferred address families (which to try first) and connect timeout
%% in milliseconds.
%%
% {outgoing_s2s_options, [ipv4, ipv6], 10000}.
%%
%%%. ==============
%%%' SESSION BACKEND
{sm_backend, {mnesia, []}}.
%%%. ==============
%%%' AUTHENTICATION
%% Advertised SASL mechanisms
{sasl_mechanisms, [cyrsasl_plain]}.
%%
%% auth_method: Method used to authenticate the users.
%% The default method is the internal.
%% If you want to use a different method,
%% comment this line and enable the correct ones.
%%
{auth_method, http}.
{auth_opts, [
%% Store the plain passwords or hashed for SCRAM:
{password_format, plain},
% {password_format, scram}
% {scram_iterations, 4096} % default
%%
%% For auth_http:
%% auth_http requires {http, Host | global, auth, ..., ...} outgoing pool.
% {basic_auth, "mongooseim:48Fcdc@7"}
{connection_pool_size, 10}
]}.
%%%. ==============
%%%' OUTGOING CONNECTIONS (e.g. DB)
%% Here you may configure all outgoing connections used by MongooseIM,
%% e.g. to RDBMS (such as MySQL), Riak or external HTTP components.
%% Default MongooseIM configuration uses only Mnesia (non-Mnesia extensions are disabled),
%% so no options here are uncommented out of the box.
%% This section includes configuration examples; for comprehensive guide
%% please consult MongooseIM documentation, page "Outgoing connections":
%% - doc/advanced-configuration/outgoing-connections.md
%% - https://mongooseim.readthedocs.io/en/latest/advanced-configuration/outgoing-connections/
{outgoing_pools, [
{http, global, auth, [
{workers, 10}
], [
{server, "http://127.0.0.1:3000"},
{path_prefix, "/internal/ejabberd/"}
]},
{rdbms, global, default, [
{workers, 10}
], [
{server, {pgsql, "localhost", 5432, "mongooseim", "mongooseim", "PASSWORD"}}
]},
{redis, global, default, [
{strategy, random_worker}
], [
{host, "localhost"},
{port, 6379},
{database, 2}
]}
]}.
%% == Extra options ==
%%
%% If you use PostgreSQL, have a large database, and need a
%% faster but inexact replacement for "select count(*) from users"
%%
%% {pgsql_users_number_estimate, true}.
%%
%% rdbms_server_type specifies what database is used over the RDBMS layer
%% Can take values mssql, pgsql, mysql
%% In some cases (for example for MAM with pgsql) it is required to set proper value.
%%
{rdbms_server_type, pgsql}.
%%%. ===============
%%%' TRAFFIC SHAPERS
%%
%% The "normal" shaper limits traffic speed to 1000 B/s
%%
{shaper, normal, {maxrate, 1000}}.
%%
%% The "fast" shaper limits traffic speed to 50000 B/s
%%
{shaper, fast, {maxrate, 50000}}.
%%
%% This option specifies the maximum number of elements in the queue
%% of the FSM. Refer to the documentation for details.
%%
{max_fsm_queue, 1000}.
%%%. ====================
%%%' ACCESS CONTROL LISTS
%%
%% The 'admin' ACL grants administrative privileges to XMPP accounts.
%% You can put here as many accounts as you want.
%%
% {acl, admin, {user, "alice", "localhost"}}.
% {acl, admin, {user, "a", "localhost"}}.
%%
%% Blocked users
%%
% {acl, blocked, {user, "baduser", "example.org"}}.
% {acl, blocked, {user, "test"}}.
%%
%% Local users: don't modify this line.
%%
{acl, local, {user_regexp, ""}}.
%%
%% More examples of ACLs
%%
% {acl, jabberorg, {server, "jabber.org"}}.
% {acl, aleksey, {user, "aleksey", "jabber.ru"}}.
% {acl, test, {user_regexp, "^test"}}.
% {acl, test, {user_glob, "test*"}}.
%%
%% Define specific ACLs in a virtual host.
%%
% {host_config, "localhost", [
% {acl, admin, {user, "bob-local", "localhost"}}
% ]}.
%%%. ============
%%%' ACCESS RULES
%% Maximum number of simultaneous sessions allowed for a single user:
{access, max_user_sessions, [{10, all}]}.
%% Maximum number of offline messages that users can have:
{access, max_user_offline_messages, [{5000, admin}, {100, all}]}.
%% This rule allows access only for local users:
{access, local, [{allow, local}]}.
%% Only non-blocked users can use c2s connections:
{access, c2s, [
{deny, blocked},
{allow, all}
]}.
%% For C2S connections, all users except admins use the "normal" shaper
{access, c2s_shaper, [
{none, admin},
{normal, all}
]}.
%% All S2S connections use the "fast" shaper
{access, s2s_shaper, [{fast, all}]}.
%% Admins of this server are also admins of the MUC service:
% {access, muc_admin, [{allow, admin}]}.
%% Only accounts of the local ejabberd server can create rooms:
% {access, muc_create, [{allow, local}]}.
%% All users are allowed to use the MUC service:
% {access, muc, [{allow, all}]}.
%% In-band registration allows registration of any possible username.
%% To disable in-band registration, replace 'allow' with 'deny'.
{access, register, [{allow, all}]}.
%% By default the frequency of account registrations from the same IP
%% is limited to 1 account every 10 minutes. To disable, specify: infinity
{registration_timeout, infinity}.
%% Default settings for MAM.
%% To set non-standard value, replace 'default' with 'allow' or 'deny'.
%% Only user can access his/her archive by default.
%% An online user can read room's archive by default.
%% Only an owner can change settings and purge messages by default.
%% Empty list (i.e. `[]`) means `[{deny, all}]`.
{access, mam_set_prefs, [{default, all}]}.
{access, mam_get_prefs, [{default, all}]}.
{access, mam_lookup_messages, [{default, all}]}.
{access, mam_purge_single_message, [{default, all}]}.
{access, mam_purge_multiple_messages, [{default, all}]}.
%% 1 command of the specified type per second.
{shaper, mam_shaper, {maxrate, 1}}.
%% This shaper is primeraly for Mnesia overload protection during stress testing.
%% The limit is 1000 operations of each type per second.
{shaper, mam_global_shaper, {maxrate, 1000}}.
{access, mam_set_prefs_shaper, [{mam_shaper, all}]}.
{access, mam_get_prefs_shaper, [{mam_shaper, all}]}.
{access, mam_lookup_messages_shaper, [{mam_shaper, all}]}.
{access, mam_purge_single_message_shaper, [{mam_shaper, all}]}.
{access, mam_purge_multiple_messages_shaper, [{mam_shaper, all}]}.
{access, mam_set_prefs_global_shaper, [{mam_global_shaper, all}]}.
{access, mam_get_prefs_global_shaper, [{mam_global_shaper, all}]}.
{access, mam_lookup_messages_global_shaper, [{mam_global_shaper, all}]}.
{access, mam_purge_single_message_global_shaper, [{mam_global_shaper, all}]}.
{access, mam_purge_multiple_messages_global_shaper, [{mam_global_shaper, all}]}.
%%
%% Define specific Access Rules in a virtual host.
%%
% {host_config, "localhost", [
% {access, c2s, [{allow, admin}, {deny, all}]},
% {access, register, [{deny, all}]}
% ]}.
%%%. ================
%%%' DEFAULT LANGUAGE
%%
%% language: Default language used for server messages.
%%
{language, "en"}.
%%
%% Set a different default language in a virtual host.
%%
% {host_config, "localhost",
% [{language, "ru"}]
% }.
%%%. ================
%%%' MISCELLANEOUS
{all_metrics_are_global, false}.
%%%. ========
%%%' SERVICES
%% Unlike modules, services are started per node and provide either features which are not
%% related to any particular host, or backend stuff which is used by modules.
%% This is handled by `mongoose_service` module.
{services, [
{service_admin_extra, [
{submods, [
node,
% accounts,
sessions,
% vcard,
roster,
last,
private,
stanza,
stats
]}
]}
]}.
%%%. =======
%%%' MODULES
%%
%% Modules enabled in all mongooseim virtual hosts.
%% For list of possible modules options, check documentation.
%%
{modules, [
{mod_adhoc, []},
{mod_disco, [{users_can_see_hidden_services, false}]},
{mod_commands, []},
{mod_muc_light_commands, []},
{mod_last, []},
{mod_stream_management, [
% default 100
% size of a buffer of unacked messages
% {buffer_max, 100}
% default 1 - server sends the ack request after each stanza
% {ack_freq, 1}
% default: 600 seconds
% {resume_timeout, 600}
]},
{mod_muc_light, [
{host, "muclight.@HOST@"},
{backend, rdbms},
{all_can_invite, true},
{all_can_configure, false},
{blocking, false},
{rooms_per_page, 10},
{rooms_in_rosters, true},
{config_schema, ["roomname"]},
{default_config, [{"roomname", "The Room"}]}
]},
{mod_inbox, [
{backend, rdbms},
{reset_markers, [displayed, received, acknowledged]},
{aff_changes, true},
{remove_on_kicked, true},
{groupchat, [muclight]}
]},
{mod_offline, [{access_max_user_messages, max_user_offline_messages}]},
{mod_privacy, []},
{mod_blocking, []},
{mod_roster, [
{backend, rdbms},
{versioning, true},
{store_current_id, true}
]},
{mod_sic, []},
{mod_bosh, []},
{mod_carboncopy, []},
{mod_mam_meta, [
{backend, rdbms},
%% Store user preferences in Mnesia (recommended).
%% The preferences store will be called each time, as a message is routed.
%% That is why Mnesia is better suited for this job.
{user_prefs_store, mnesia},
%% Enables a pool of asynchronous writers. (default)
%% Messages will be grouped together based on archive id.
{async_writer, true},
%% Cache information about users (default)
{cache_users, true},
%% Enable archivization for private messages (default)
{pm, [
{archive_groupchats, true}
]},
%%
%% Message Archive Management (MAM) for multi-user chats (MUC).
%% Enable XEP-0313 for "muc.@HOST@".
%%
{muc, [
{host, "muclight.@HOST@"}
]}
%% Do not use a <stanza-id/> element (by default stanzaid is used)
% no_stanzaid_element,
]},
{mod_event_pusher, [
{backends, [
{http, [
{pool_name, auth},
{path, "/notifications"}
]}
]}
]}
]}.
@jasl ,
I think even previous configuration (default one) should work without any issues as the commands you're trying to use are standard (see mod_commands
module). The issue you initially faced is that both /api/contacts/[:jid]
and /api/users/[:jid]
require JID of user for which you're running the command. The HTTP path /api/contacts
doesn't exists - you should call /api/contacts/john@snow.com
instead.
EDIT:
I just checked and I can actually confirm - after enabling {"localhost", "/api", mongoose_api_admin, []}
HTTP module, and after adding john@snow.com
user, I do get HTTP 200 code after calling http://localhost:8088/api/contacts/john@snow.com
.
@rslota
I just tried as your suggest, it works! Thank you!
BTW, I mistype a wrong account then I got 500 internal error with
21:45:56.041 [error] Caught error:{badkey,{roster,items}} while executing list_contacts stacktrace=[{maps,get,[{roster,items},#{lserver => <<"local-dev.cybros.im">>,mongoose_acc => true,non_strippable => {set,0,16,16,8,80,48,{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},{{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]}}},origin_location => {mod_commands,list_contacts,275},origin_pid => <0.1400.0>,origin_stanza => undefined,ref => #Ref<0.3085154091.3834904577.76840>,stanza => undefined,timestamp => {1554,731156,41064},{roster,show_full_roster} => true}],[]},{mongoose_acc,get,3,[{file,"/Users/jasl/Workspaces/im/MongooseIM/_build/prod/lib/mongooseim/src/mongoose_acc.erl"},{line,185}]},{mod_commands,list_contacts,1,[{file,"/Users/jasl/Workspaces/im/MongooseIM/_build/prod/lib/mongooseim/src/mod_commands.erl"},{line,281}]},{mongoose_commands,check_and_execute,3,[{file,"/Users/jasl/Workspaces/im/MongooseIM/_build/prod/lib/mongooseim/src/mongoose_commands.erl"},{line,401}]},{mongoose_commands,execute_command,3,[{file,"/Users/jasl/Workspaces/im/MongooseIM/_build/prod/lib/mongooseim/src/mongoose_commands.erl"},{line,346}]},{mongoose_api_common,execute_command,3,[{file,"/Users/jasl/Workspaces/im/MongooseIM/_build/prod/lib/mongooseim/src/mongoose_api_common.erl"},{line,221}]},{mongoose_api_common,handle_request,5,[{file,"/Users/jasl/Workspaces/im/MongooseIM/_build/prod/lib/mongooseim/src/mongoose_api_common.erl"},{line,128}]},{cowboy_rest,call,3,[{file,"/Users/jasl/Workspaces/im/MongooseIM/_build/default/lib/cowboy/src/cowboy_rest.erl"},{line,1571}]}]
21:46:20.648 [error] Caught error:{badkey,{roster,items}} while executing list_contacts stacktrace=[{maps,get,[{roster,items},#{lserver => <<"handsome">>,mongoose_acc => true,non_strippable => {set,0,16,16,8,80,48,{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},{{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]}}},origin_location => {mod_commands,list_contacts,275},origin_pid => <0.1403.0>,origin_stanza => undefined,ref => #Ref<0.3085154091.3834904577.76864>,stanza => undefined,timestamp => {1554,731180,648026},{roster,show_full_roster} => true}],[]},{mongoose_acc,get,3,[{file,"/Users/jasl/Workspaces/im/MongooseIM/_build/prod/lib/mongooseim/src/mongoose_acc.erl"},{line,185}]},{mod_commands,list_contacts,1,[{file,"/Users/jasl/Workspaces/im/MongooseIM/_build/prod/lib/mongooseim/src/mod_commands.erl"},{line,281}]},{mongoose_commands,check_and_execute,3,[{file,"/Users/jasl/Workspaces/im/MongooseIM/_build/prod/lib/mongooseim/src/mongoose_commands.erl"},{line,401}]},{mongoose_commands,execute_command,3,[{file,"/Users/jasl/Workspaces/im/MongooseIM/_build/prod/lib/mongooseim/src/mongoose_commands.erl"},{line,346}]},{mongoose_api_common,execute_command,3,[{file,"/Users/jasl/Workspaces/im/MongooseIM/_build/prod/lib/mongooseim/src/mongoose_api_common.erl"},{line,221}]},{mongoose_api_common,handle_request,5,[{file,"/Users/jasl/Workspaces/im/MongooseIM/_build/prod/lib/mongooseim/src/mongoose_api_common.erl"},{line,128}]},{cowboy_rest,call,3,[{file,"/Users/jasl/Workspaces/im/MongooseIM/_build/default/lib/cowboy/src/cowboy_rest.erl"},{line,1571}]}]
That's should be 404, I think I should open an issue about this
MongooseIM version:
3.3.0
Installed from: source Erlang/OTP version:Erlang/OTP 21 [erts-10.3.2] [source] [64-bit] [smp:12:12] [ds:12:12:10] [async-threads:1] [hipe] [dtrace]
I'm trying
MongooseIM HTTP API
for example simply browsehttp://localhost:8088/api/contacts
from chrome, then I got500 Internal Server Error
At MongooseIM side, the log shows
I also tried
http://localhost:8088/api/users
got the same error, buthttp://localhost:8088/api/commands
works great.