github.com/xxf098/lite-proxy@v0.15.1-0.20230422081941-12c69f323218/config/http.go (about)

     1  package config
     2  
     3  import (
     4  	"errors"
     5  	"net"
     6  	"net/url"
     7  	"strconv"
     8  
     9  	"github.com/xxf098/lite-proxy/outbound"
    10  )
    11  
    12  func HttpLinkToHttpOption(link string) (*outbound.HttpOption, error) {
    13  	u, err := url.Parse(link)
    14  	if err != nil {
    15  		return nil, err
    16  	}
    17  	if u.Scheme != "http" {
    18  		return nil, errors.New("not a trojan link")
    19  	}
    20  	pass := u.User.Username()
    21  	hostport := u.Host
    22  	host, _, err := net.SplitHostPort(hostport)
    23  	if err != nil {
    24  		return nil, err
    25  	}
    26  	port, err := strconv.Atoi(u.Port())
    27  	if err != nil {
    28  		return nil, err
    29  	}
    30  	// frag := u.Fragment
    31  	// fmt.Printf("password: %s, host: %s, port: %d, frag: %s\n", pass, host, port, frag)
    32  	httpOption := outbound.HttpOption{
    33  		Name:     "http",
    34  		Remarks:  u.Fragment,
    35  		Password: pass,
    36  		Port:     port,
    37  		Server:   host,
    38  	}
    39  	if rawQuery, err := url.ParseQuery(u.RawQuery); err == nil {
    40  		httpOption.UserName = rawQuery.Get("username")
    41  		httpOption.TLS = rawQuery.Get("tls") == "true"
    42  		httpOption.SNI = rawQuery.Get("sni")
    43  		httpOption.SkipCertVerify = rawQuery.Get("allowInsecure") == "1"
    44  	}
    45  	return &httpOption, nil
    46  }
    47  
    48  func init() {
    49  	outbound.RegisterDialerCreator("http", func(link string) (outbound.Dialer, error) {
    50  		httpOption, err := HttpLinkToHttpOption(link)
    51  		if err != nil {
    52  			return nil, err
    53  		}
    54  		return outbound.NewHttp(*httpOption), nil
    55  	})
    56  }