/
local_http.go
64 lines (53 loc) · 1.42 KB
/
local_http.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
package easyss
import (
"net/http"
"strconv"
log "github.com/sirupsen/logrus"
)
func (ss *Easyss) LocalHttp() error {
var addr string
if ss.BindAll() {
addr = ":" + strconv.Itoa(ss.LocalHttpProxyPort())
} else {
addr = "127.0.0.1:" + strconv.Itoa(ss.LocalHttpProxyPort())
}
log.Infof("starting local http-proxy server at %v", addr)
server := &http.Server{Addr: addr, Handler: &httpProxy{ss: ss}}
ss.SetHttpProxyServer(server)
err := server.ListenAndServe()
if err != nil {
log.Warnf("local http proxy server:%s", err.Error())
}
return err
}
type httpProxy struct {
ss *Easyss
}
func (h *httpProxy) ServeHTTP(w http.ResponseWriter, r *http.Request) {
if r.Method != "CONNECT" {
http.Error(w, "This is a proxy server. Does not respond to non-proxy requests.", http.StatusBadRequest)
return
}
hij, ok := w.(http.Hijacker)
if !ok {
log.Errorf("Connect: hijacking not supported")
if r.Body != nil {
defer r.Body.Close()
}
http.Error(w, "Connect: hijacking not supported", http.StatusInternalServerError)
return
}
hijConn, _, err := hij.Hijack()
if err != nil {
log.Errorf("get hijack conn, err:%s", err.Error())
return
}
if _, err := hijConn.Write([]byte("HTTP/1.1 200 OK\r\n\r\n")); err != nil {
log.Errorf("write hijack ok err:%s", err.Error())
hijConn.Close()
return
}
if err := h.ss.localRelay(hijConn, r.URL.Host); err != nil {
log.Warnf("http local relay err:%s", err.Error())
}
}