# mtproxy_url
<img src="https://raw.githubusercontent.com/krot3232/logos/main/mtproxy_url.png" width="200">
Erlang library for decoding and encoding Telegram MTProxy URLs (tg://proxy)
[](https://hex.pm/packages/mtproxy_url)
## Installation
The package can be installed by adding `mtproxy_url` to your list of dependencies
in
`rebar.config`:
```erlang
{deps, [mtproxy_url]}.
```
## Features
+ Parse tg://proxy URLs
+ Extract:
+ Server (IP or domain)
+ Port
+ Secret
+ Supports both plain and encoded secrets
## Basic usage
**Encode parameters into URL:**
```erlang
{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**
```erlang
{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.
```