@@ -3,34 +3,44 @@ package main
3
3
import (
4
4
"log"
5
5
"net/http"
6
- "net/http/httputil "
7
- "net/url "
8
- "flag "
6
+ "bufio "
7
+ "os "
8
+ "strings "
9
9
)
10
10
11
- type handle struct {
12
- reverseProxy string
11
+ var srv http.Server
12
+
13
+ func StartServer (bind string , remote string ) {
14
+ log .Printf ("Listening on %s, forwarding to %s" , bind , remote )
15
+ h := & handle {reverseProxy : remote }
16
+ srv .Addr = bind
17
+ srv .Handler = h
18
+ go func () {
19
+ if err := srv .ListenAndServe (); err != nil {
20
+ log .Fatalln ("ListenAndServe: " , err )
21
+ }
22
+ }()
13
23
}
14
24
15
- func (this * handle ) ServeHTTP (w http.ResponseWriter , r * http.Request ) {
16
- remote , err := url .Parse (this .reverseProxy )
17
- if err != nil {
18
- log .Fatalln (err )
25
+ func StopServer () {
26
+ if err := srv .Close () ; err != nil {
27
+ log .Println (err )
19
28
}
20
- proxy := httputil .NewSingleHostReverseProxy (remote )
21
- r .Host = remote .Host
22
- proxy .ServeHTTP (w , r )
23
- log .Println (r .RemoteAddr + " " + r .Method + " " + r .URL .String () + " " + r .Proto + " " + r .UserAgent ())
24
29
}
25
30
26
31
func main () {
27
- bind := flag .String ("l" , "0.0.0.0:8888" , "listen on ip:port" )
28
- remote := flag .String ("r" , "http://idea.lanyus.com:80" , "reverse proxy addr" )
29
- flag .Parse ()
30
- log .Printf ("Listening on %s, forwarding to %s" , * bind , * remote )
31
- h := & handle {reverseProxy : * remote }
32
- err := http .ListenAndServe (* bind , h )
33
- if err != nil {
34
- log .Fatalln ("ListenAndServe: " , err )
32
+ cmd := parseCmd ()
33
+ StartServer (cmd .bind , cmd .remote )
34
+ reader := bufio .NewReader (os .Stdin )
35
+ for {
36
+ str , err := reader .ReadString ('\n' )
37
+ if err != nil {
38
+ log .Println (err )
39
+ }
40
+ if strings .TrimSpace (str ) == "stop" {
41
+ log .Println ("will stop server" )
42
+ StopServer ()
43
+ return
44
+ }
35
45
}
36
46
}
0 commit comments