Erlang inets httpc подключиться к локальному inets httpd

Я пытаюсь реализовать модуль с httpd, который обрабатывает HTTP-запрос на получение процесса. В основном он обрабатывает входящий запрос get, анализирует параметры get и вызывает синхронный метод gen_server на узле, который запустил http-сервер. Затем он возвращает HTML с возвращаемыми значениями из синхронного вызова. Все работает нормально, пока я не протестирую его с помощью браузера (работают последние версии Chrome, Firefox). Но мне нужно реализовать функцию пересылки HTTP, где http-сервер может вызывать другой URL с заданными параметрами. Я попробовал это с httpc:

httpc:request(get, {"http://localhost:55556/httpfront:get?key=1", []}, [], []).

но была выдана следующая ошибка:

{error,{failed_connect,[{to_address,{"localhost",55556}},
                        {inet,[inet],econnrefused}]}}

Можете ли вы помочь мне, пожалуйста? Что мне не хватает?

Ps. другие сайты, такие как stackru.com работать с вышеуказанным httpc:request(...),

Конфиг: Я запускаю node.erl, узел запускает демон httpfront.erl httpd в другом модуле, запрос get обрабатывается на httpfront. Я делаю это несколько раз (запускаю больше узлов), теперь я хочу подключиться с одного экземпляра httpfront с httpc:request(...) к другому. Все обработчики HTTP запускаются на локальном хосте, но отличаются от несобственного порта.

node.erl:

http_listener() ->
    httpfront:start().

start() ->
    gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
...

httpfront.erl:

start() ->
    gen_server:start_link({local, ?MODULE}, ?MODULE, [], []),
%this is the port number, it increments on each new node
    P = 55556,
    % the corresponding url is: http://localhost:port/
    % command are accesible this way:
    % port is from 55556 until end of valid port range, increments on new node join
    % http://localhost:55556/httpfront:get?key=thisisashortkey
    inets:start(),
    inets:start(httpd, [
        {modules, [
            mod_alias, 
            mod_auth, 
            mod_esi, 
            mod_actions, 
            mod_cgi, 
            mod_dir, 
            mod_get, 
            mod_head, 
            mod_log, 
            mod_disk_log
        ]},
        {port,P},
        {server_name,"httpfront"},
        {server_root,"log"},
        {document_root,"www"},
        {erl_script_alias, {"", [httpfront]}},
        {error_log, "error.log"},
        {security_log, "security.log"},
        {transfer_log, "transfer.log"},
        {mime_types,[
            {"html","text/html"}
            ]}
        ]),
        io:format("OK. Good to go.~n").

    get(SessionID, _Env, Input) ->
    % this get() is a gen_server synchronous call on the inside
    Result = node:get(Input),

    mod_esi:deliver(SessionID, [
        "Content-Type: text/html\r\n\r\n", 
        "<html><body>",
        "Get<br>",
        "Key=" ++ Value,
        "<br>Result=" ++ Result,
        "</body></html>"


    ]).
    ...

Теперь, наконец, я пытаюсь вызвать это, как я уже говорил, из другого узла, но я получаю ошибку:

httpc:request(get, {"http://localhost:55556/httpfront:get?key=1", []}, [], []).
{error,{failed_connect,[{to_address,{"localhost",55556}},
                        {inet,[inet],econnrefused}]}}

Любая помощь и советы приветствуются. Спасибо.

1 ответ

Решение

Попробуйте пройти {ipfamily, inet} в качестве члена списка опций для вашего httpd начать вызов, чтобы заставить его слушать IPv4 вместо IPv6. Кроме того, так как вы, вероятно, хотите только localhost подключения, вы могли бы рассмотреть возможность передачи {bind_address, {127,0,0,1}} вариант также.

Другие вопросы по тегам