簡體   English   中英

關於Erlang HTTP代理

[英]About Erlang http proxy

是否有一些Erlang http代理? 哪個是最好的Erlang http客戶端? httpc似乎是文檔之湖,例如,如何在httpc中發送cookie標頭? Erlang http代理或mochiweb中的代理的任何示例?

我不記得任何用erlang編寫的相對著名的http代理的名稱。 谷歌快速搜索顯示了這一點: http : //www.duomark.com/erlang/tutorials/proxy.html

至於http客戶端,我建議嘗試使用lhttpc或ibrowse

如果http客戶端沒有用於在請求中指定cookie的內置方法,通常您可以構造一個http Cookie頭,並將其作為請求http頭的一部分傳遞給http請求處理函數。

我曾經構建了一個代理,該代理結合了webmachine和imagemagick的功能,實現了上下顛倒以太網 它基於資源示例。

我同意Alexander的觀點,認為lhttpcibrowse是最好的http客戶端。 我在生產中都使用了這兩種方法,並取得了巨大的成功。

現已在GitHub上提供以Erlang實現的HTTP代理: https : //github.com/Wavenet/http_proxy

我知道這個問題已經回答了,但是我將把這個留在這里,以防萬一有人在尋找簡單,直接和可讀的內容。

-module(proxy).
-define(HTTP_PORT, 80).
-define(DEFAULT_PROXY_PORT, 8000).
-export([start/0,start/1,worker/1]).


start()->
    start (?DEFAULT_PROXY_PORT).

start(Port)->
    {ok, Listen} = gen_tcp:listen (Port, [binary,
                  {packet, 0},
                  {reuseaddr, true},
                  {active, false},
                  {delay_send, false},
                  {nodelay, true}]),

    server_loop (Listen).

server_loop (Listen)->
    {ok, Socket} = gen_tcp:accept (Listen),
    spawn (?MODULE, worker, [Socket]),
    server_loop (Listen).

worker (Socket)->
    {ok, Request} = gen_tcp:recv (Socket, 0),
    ListRequest = binary_to_list (Request),
    io:format ("~p ~n", [ListRequest]),
    [Head, URL | RequestTail] = string:tokens (ListRequest, " "),
    ["http:", Host | URLTail] = string:tokens (URL, "/"),
    Document = "/" ++ string:join (URLTail, "/"),
    NewRequest = string:join ([Head, Document | RequestTail], " "),
    io:format ("~p ~p ~p~n", [self(), Host, Document]),
    {ok, SecondSocket} = gen_tcp:connect (Host, ?HTTP_PORT, [binary,
                             {packet, 0},
                             {active, false},
                             {delay_send, false},
                             {nodelay, true}]),
    ok = gen_tcp:send (SecondSocket, NewRequest),
    io:format ("~p waiting...~n", [self()]),
    Response = read_tcp (SecondSocket),
    io:format ("~p done!~n", [self()]),
    ok = gen_tcp:send (Socket, Response),
    gen_tcp:close (SecondSocket),
    gen_tcp:close (Socket).

read_tcp (Socket)->
    read_tcp (Socket, []).

read_tcp (Socket, SoFar)->
    case gen_tcp:recv (Socket, 0, 500) of
     {ok, Response} ->
         read_tcp (Socket, [Response | SoFar]);
     {error, timeout} ->
         lists:reverse (SoFar);
     {error, closed} ->
         lists:reverse (SoFar)
    end.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM