Skip to content

Tmate.MasterApi.get_named_session_prefix() fails parsing json result #7

Open
@pini-gh

Description

@pini-gh

Hi,

Trying to instantiate a named session, it fails with this error message in tmate-websocket's container log:

[error] GenServer #PID<0.1699.0> terminating
** (FunctionClauseError) no function clause matching in Access.get/3
    (elixir) lib/access.ex:265: Access.get("{\"prefix\":\"myusername/\"}", "prefix", nil)
    (tmate) lib/tmate/master_api.ex:32: Tmate.MasterApi.get_named_session_prefix/1
    (tmate) lib/tmate/session.ex:225: Tmate.Session.get_named_session_tokens/3
    (tmate) lib/tmate/session.ex:276: Tmate.Session.finalize_session_init/1
    (tmate) lib/tmate/session.ex:131: Tmate.Session.handle_call/3
    (stdlib) gen_server.erl:661: :gen_server.try_handle_call/4
    (stdlib) gen_server.erl:690: :gen_server.handle_msg/6
    (stdlib) proc_lib.erl:249: :proc_lib.init_p_do_apply/3

Playing with the console I can easily reproduce the problem:

$ docker exec -it tmate-websocket bin/tmate remote_console
Erlang/OTP 22 [erts-10.7.2.8] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1]

Interactive Elixir (1.9.4) - press Ctrl+C to exit (type h() ENTER for help)
iex(tmate@tmate-ws.example.com)1> {:ok, result} = Tmate.MasterApi.get("/named_session_prefix", [], params: %{api_key: "tmk-mytoken"})
{:ok, "{\"prefix\":\"myusername/\"}"}
iex(tmate@tmate-ws.example.com)2> result["prefix"]
** (FunctionClauseError) no function clause matching in Access.get/3    
    
    The following arguments were given to Access.get/3:
    
        # 1
        "{\"prefix\":\"myusername/\"}"
    
        # 2
        "prefix"
    
        # 3
        nil
    
    Attempted function clauses (showing 5 out of 5):
    
        def get(-%module{} = container-, key, default)
        def get(map, key, default) when -is_map(map)-
        def get(list, key, default) when -is_list(list)- and -is_atom(key)-
        def get(list, key, _default) when -is_list(list)-
        def get(-nil-, _key, default)
    
    (elixir) lib/access.ex:265: Access.get/3
iex(tmate@tmate-ws.example.com)2> is_map(result)
false
iex(tmate@tmate-ws.example.com)7> is_binary(result)
true

The result object is not a map but JSON data represented as a binary string, and it has to be decoded first.

This patch fixes the problem:

diff --git a/lib/tmate/master_api.ex b/lib/tmate/master_api.ex
index acc5c33..6ee1425 100644
--- a/lib/tmate/master_api.ex
+++ b/lib/tmate/master_api.ex
@@ -29,7 +29,7 @@ defmodule Tmate.MasterApi do
   def get_named_session_prefix(api_key) do
     case get("/named_session_prefix", [], params: %{api_key: api_key}) do
       {:ok, result} ->
-        {:ok, result["prefix"]}
+        {:ok, Jason.decode!(result)["prefix"]}
       {:error, 404} ->
         {:error, :not_found}
       {:error, reason} ->

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions