README.md

# 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)

[![Hex Version](https://img.shields.io/hexpm/v/mtproxy_url.svg?style=flat-square)](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.
```