Just a proof of concept.
my python proxy blows up when you try and have 5-10 socks open at once

.
I will improve this one hopefully.
Intresting part about erlang u can recompile and reload the code while server is running.
-module(proxyserver).
-export([start/0]).
start() ->
{ok,Listen} = gen_tcp:listen(8000,
[binary,
{active, true}]),
spawn(fun() -> par_connect(Listen) end).
par_connect(Listen) ->
{ok, Socket} = gen_tcp:accept(Listen),
spawn(fun() -> par_connect(Listen) end),
loop(Socket).
parse_header(Headers) ->
dict:erase("Proxy-Connection",
dict:from_list(
lists:map(
fun(Header)->
{ok,[Key,Value]}=regexp:split(Header,": "),
{Key,Value}
end
,
Headers
)))
.
split_payload(Bin,Headers)->
case Bin of
[$\r,$\n,$\r,$\n|Rest] ->
{lists:reverse(Headers),Rest};
[H|Rest]->
split_payload(Rest,[H|Headers]);
[] -> error
end
.
get_url(Bin) ->
{Lines,Payload} = split_payload(binary_to_list(Bin),[]),
[Request|Headers]= string:tokens(Lines,"\r\n"),
HeaderDict = parse_header(Headers),
%io:format("Host = ~p~n" ,[dict:fetch("Host",HeaderDict)]),
{ok,Socket} = gen_tcp:connect(dict:fetch("Host",HeaderDict),80,[binary, {packet, 0}]),
ok = gen_tcp:send(Socket, Request++"\r\n" ),
lists:foreach(fun({Key,Value})->
ok = gen_tcp:send(Socket,Key++": "++Value++"\r\n")
end,
dict:to_list(HeaderDict)),
ok = gen_tcp:send(Socket,"Connection: close\r\n"),
ok = gen_tcp:send(Socket,"\r\n" ),
ok = gen_tcp:send(Socket,Payload),
receive_data(Socket,[]).
receive_data(Socket,SoFar) ->
receive
{tcp,Socket,Bin} ->
receive_data(Socket, [Bin|SoFar]);
{tcp_closed,Socket} ->
list_to_binary(lists:reverse(SoFar))
end.
loop(Socket) ->
receive
{tcp, Socket, Bin} ->
gen_tcp:send(Socket,get_url(Bin)),
loop(Socket);
{tcp_closed, Socket} ->
ok
end.