Skip to content

Commit 345df7c

Browse files
committed
add close server function
1 parent 92b3048 commit 345df7c

File tree

3 files changed

+70
-21
lines changed

3 files changed

+70
-21
lines changed

cmd.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package main
2+
3+
import "flag"
4+
5+
type Cmd struct {
6+
bind string
7+
remote string
8+
}
9+
10+
func parseCmd() Cmd {
11+
var cmd Cmd
12+
flag.StringVar(&cmd.bind, "l", "0.0.0.0:8888", "listen on ip:port")
13+
flag.StringVar(&cmd.remote, "r", "http://idea.lanyus.com:80", "reverse proxy addr")
14+
flag.Parse()
15+
return cmd
16+
}

handle.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package main
2+
3+
import (
4+
"net/http"
5+
"net/url"
6+
"net/http/httputil"
7+
"log"
8+
)
9+
10+
type handle struct {
11+
reverseProxy string
12+
}
13+
14+
func (this *handle) ServeHTTP(w http.ResponseWriter, r *http.Request) {
15+
remote, err := url.Parse(this.reverseProxy)
16+
if err != nil {
17+
log.Fatalln(err)
18+
}
19+
proxy := httputil.NewSingleHostReverseProxy(remote)
20+
r.Host = remote.Host
21+
proxy.ServeHTTP(w, r)
22+
log.Println(r.RemoteAddr + " " + r.Method + " " + r.URL.String() + " " + r.Proto + " " + r.UserAgent())
23+
}

main.go

Lines changed: 31 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,34 +3,44 @@ package main
33
import (
44
"log"
55
"net/http"
6-
"net/http/httputil"
7-
"net/url"
8-
"flag"
6+
"bufio"
7+
"os"
8+
"strings"
99
)
1010

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+
}()
1323
}
1424

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)
1928
}
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())
2429
}
2530

2631
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+
}
3545
}
3646
}

0 commit comments

Comments
 (0)