mtproxy_url

Erlang library for decoding and encoding Telegram MTProxy URLs (tg://proxy)

Hex Version

Installation

The package can be installed by adding mtproxy_url to your list of dependencies in rebar.config:

{deps, [mtproxy_url]}.

Features

Basic usage

Encode parameters into URL:

{ok, Url} = mtproxy_url:encode(#{
    server => <<"1.2.3.4">>,
    port => 443,
    secret => #{type=>fake_tls,value=>binary:decode_hex(<<"f93fa8b2e3df520cabfe969846d76a54">>),sni=><<"google.com">>}
}).
%% Result Url = <<"tg://proxy?server=1.2.3.4&port=443&secret=eef93fa8b2e3df520cabfe969846d76a54676f6f676c652e636f6d">>

{ok, Url} = mtproxy_url:encode(#{
    server => <<"1.2.3.4">>,
    port => 443,
    secret => #{type=>padding,value=>binary:decode_hex(<<"f93fa8b2e3df520cabfe969846d76a54">>)}
}).
%% Result Url = <<"tg://proxy?server=1.2.3.4&port=443&secret=ddf93fa8b2e3df520cabfe969846d76a54">>

{ok, Url} = mtproxy_url:encode(#{
    server => <<"1.2.3.4">>,
    port => 443,
    secret => #{type=>normal,value=>binary:decode_hex(<<"f93fa8b2e3df520cabfe969846d76a54">>)}
}).
%% Result Url = tg://proxy?server=1.2.3.4&port=443&secret=f93fa8b2e3df520cabfe969846d76a54

{ok, Url} = mtproxy_url:encode(#{
    server => <<"1.2.3.4">>,
    port => 443,
    secret => <<"f93fa8b2e3df520cabfe969846d76a54">>
}).
%% Result Url = tg://proxy?server=1.2.3.4&port=443&secret=f93fa8b2e3df520cabfe969846d76a54

{ok, Url} = mtproxy_url:encode(#{
    server => #{type=> ip4,value=> {1,2,3,4}},
    port => 443,
    secret => <<"f93fa8b2e3df520cabfe969846d76a54">>
}).
%% Result Url = tg://proxy?server=1.2.3.4&port=443&secret=f93fa8b2e3df520cabfe969846d76a54

{ok, Url} = mtproxy_url:encode(#{
    server => #{type=> ip6,value=> {4369,4369,4369,1,4369,4369,0,4369}},
    port => 443,
    secret => <<"f93fa8b2e3df520cabfe969846d76a54">>
}).
%% Result Url = <<"tg://proxy?server=1111:1111:1111:1:1111:1111:0:1111&port=443&secret=f93fa8b2e3df520cabfe969846d76a54">>

Decode MTProxy URL

{ok, #{server := Server, port := Port, secret := Secret}} = mtproxy_url:decode(<<"tg://proxy?server=1.2.3.4&port=443&secret=f93fa8b2e3df520cabfe969846d76a54">>).
case Server of
    #{type := host, value := Host}->ok;
    #{type := ip4, value := Ip}->ok;
    #{type := ip6, value := Ip}->ok;
end.
case Secret of
    %%ee
    #{type := fake_tls, value := Value, sni := Sni}->ok;
    %%dd
    {type := padding, value := Value}->ok;
    %%socks5
    #{type := normal, value := Value}->ok;
end.