forked from codeskyblue/proxylocal
-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.go
81 lines (74 loc) · 1.93 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
package main
import (
"flag"
"fmt"
"net"
"net/http"
"net/url"
"os"
"regexp"
"strconv"
"github.com/codeskyblue/proxylocal/pxlocal"
"github.com/qiniu/log"
)
func main() {
var serverMode bool
var serverAddr string
var proxyPort int
var proxyAddr string
var subDomain string
var domain string
var debug bool
var defaultServerAddr = os.Getenv("PXL_SERVER_ADDR")
if defaultServerAddr == "" {
defaultServerAddr = "proxylocal.xyz"
}
flag.BoolVar(&serverMode, "server", false, "run in server mode")
flag.StringVar(&serverAddr, "server-addr", defaultServerAddr, "server address")
flag.StringVar(&domain, "server-domain", "", "proxy server domain name, optional")
flag.StringVar(&subDomain, "subdomain", "", "proxy subdomain, used for http")
flag.BoolVar(&debug, "debug", false, "open debug mode")
flag.IntVar(&proxyPort, "port", 0, "proxy server listen port, used for tcp")
flag.Usage = func() {
fmt.Printf("Usage: %s [OPTIONS] <port | host:port>\n", os.Args[0])
flag.PrintDefaults()
}
flag.Parse()
if !serverMode && len(flag.Args()) != 1 {
flag.Usage()
return
}
if !debug {
log.SetOutputLevel(log.Linfo)
} else {
log.SetOutputLevel(log.Ldebug)
}
if serverMode {
_, port, _ := net.SplitHostPort(serverAddr)
if port == "" {
port = "80"
}
addr := net.JoinHostPort("0.0.0.0", port)
if domain == "" {
domain = serverAddr
}
fmt.Println("proxylocal: server listen on", addr)
ps := pxlocal.NewProxyServer(domain)
log.Fatal(http.ListenAndServe(addr, ps))
}
proxyAddr = flag.Arg(0)
if !regexp.MustCompile("^(http|https|tcp)://").MatchString(proxyAddr) {
if _, err := strconv.Atoi(proxyAddr); err == nil { // only contain port
proxyAddr = "localhost:" + proxyAddr
} else {
//proxyAddr += ":80"
}
proxyAddr = "http://" + proxyAddr
}
pURL, err := url.Parse(proxyAddr)
if err != nil {
log.Fatal(err)
}
log.Println("proxy URL:", pURL)
pxlocal.StartAgent(pURL, subDomain, serverAddr, proxyPort)
}