0

コンテキスト: JA の "Programming Erlang" 2ed、ファイルに関する第 16 章、256 ページ、バイナリからの URL の解析に関する作業の例。

推奨される手順 (scavenge_urls モジュールのコードを記述した後) は次のとおりです。

B = socket_examples:nano_get_url("www.erlang.org"),
L = scavenge_urls:bin2urls(B),
scavenge_urls:urls2htmlFile(L,"gathered.html").

そして、それは(微妙に)失敗します-リスト L は空になります。最初のステップを単独で実行すると、奇妙なことが観察されます。バイナリは返されますが、探していたバイナリではありません。

9> B.
<<"HTTP/1.1 404 Not Found\r\nServer: nginx\r\nDate: Sun, 19 Nov 2017 01:57:07 GMT\r\nContent-Type: text/html; charset=UTF-8\r\n"...>>
 shows that this is where the problem lies.

それでも、ブラウザでは、母艦はすべて問題ありません。socket_examples:nano_get_urls/1 への呼び出しを、最初に同じ URL を CURL し、それをファイルにダンプし、次に file:read_file/1 に置き換えることで、演習を完了することができました。次のステップはすべて正常に実行されました。

socket_examples モジュールの内部をのぞくと、次のように表示されます。

nano_get_url(Host) ->
    {ok,Socket} = gen_tcp:connect(Host,80,[binary, {packet, 0}]), %% (1)
    ok = gen_tcp:send(Socket, "GET / HTTP/1.0\r\n\r\n"),  %% (2)
    receive_data(Socket, []).

receive_data(Socket, SoFar) ->
    receive
        {tcp,Socket,Bin} ->    %% (3)
            receive_data(Socket, [Bin|SoFar]);
        {tcp_closed,Socket} -> %% (4)
            list_to_binary(reverse(SoFar)) %% (5)
    end.

疑わしいものは何もありません。最初に接続を確立し、次に GET を起動して、応答を受信します。最初に明示的に接続し、次に GET を実行する必要があったことはこれまでありませんでした。私の http クライアント ライブラリはそれを私から隠していました。だから、何を探すべきかわからないかもしれません...そして、Joeのコードには明らかな間違いがないことを確信しています! =) しかし、コメント (3)、(4)、(5) のある行は、私が完全に理解しているものではありません。

では、アーランガーの仲間、何かアイデアはありますか? たくさんありがとう!

4

1 に答える 1