неверный аргумент в gen_tcp recv при разделении - PullRequest
0 голосов
/ 06 января 2020

Привет, я читаю запрос, где я хочу получить путь, но когда я запускаю этот код

    {:ok, line} = :gen_tcp.recv(socket, 0)
    IO.inspect "************************* #{ inspect line} "

    [_server_name, verb, info_path, _version] = String.split(line)

Где проверка выглядит нормально с 4 аргументами

    {:http_request, :GET, {:abs_path, \"/gg\"}, {1, 1}}

В сообщении об ошибке говорится:

{badarg,[{binary,split,
                 [{http_request,'GET',{abs_path,<<"/gg">>},{1,1}},
                  [<<227,128,128>>,
                   <<226,129,159>>,
                   <<226,128,169>>,
                   <<226,128,168>>,
                   <<226,128,128>>,
                   <<226,128,129>>,
                   <<226,128,130>>,
                   <<226,128,131>>,
                   <<226,128,132>>,
                   <<226,128,133>>,
                   <<226,128,134>>,
                   <<226,128,136>>,
                   <<226,128,137>>,
                   <<226,128,138>>,
                   <<225,154,128>>,
                   <<194,133>>,
                   <<" ">>,<<"\t">>,<<"\n">>,<<"\v">>,<<"\f">>,<<"\r">>],
                  [global,trim_all]],
                 []},

Я не знаю, каковы все эти дополнительные аргументы строки.

Если я попытаюсь просто связать строку с каждым типом без полученного разбиения

    [_server_name, verb, info_path, _version] = line


{{badmatch,{http_request,'GET',{abs_path,<<"/gg">>},{1,1}}},

1 Ответ

2 голосов
/ 06 января 2020

Если я правильно прочитал документы :gen_tcp.recv, вы "должны" получить обратно HttpPacket, что в вашем случае выглядит как HttpRequest. Поскольку разбор запроса обрабатывается за вас, вы «должны» просто выполнить:

{:ok, line} = :gen_tcp.recv(socket, 0)
{_server_name, verb, info_path, _version} = line

Примечание: HttpRepuest использует {...} фигурные скобки, а не [...] скобки.

...