Skip to content

Commit 4cc1663

Browse files
committed
vhost: add real ip in first request of one connection
1. fix #248 host_header_rewrite bug 2. close #270, #127
1 parent b55a24a commit 4cc1663

File tree

2 files changed

+31
-17
lines changed

2 files changed

+31
-17
lines changed

utils/vhost/http.go

+28-15
Original file line numberDiff line numberDiff line change
@@ -57,30 +57,31 @@ func GetHttpRequestInfo(c frpNet.Conn) (_ frpNet.Conn, _ map[string]string, err
5757
}
5858

5959
func NewHttpMuxer(listener frpNet.Listener, timeout time.Duration) (*HttpMuxer, error) {
60-
mux, err := NewVhostMuxer(listener, GetHttpRequestInfo, HttpAuthFunc, HttpHostNameRewrite, timeout)
60+
mux, err := NewVhostMuxer(listener, GetHttpRequestInfo, HttpAuthFunc, ModifyHttpRequest, timeout)
6161
return &HttpMuxer{mux}, err
6262
}
6363

64-
func HttpHostNameRewrite(c frpNet.Conn, rewriteHost string) (_ frpNet.Conn, err error) {
64+
func ModifyHttpRequest(c frpNet.Conn, rewriteHost string) (_ frpNet.Conn, err error) {
6565
sc, rd := frpNet.NewShareConn(c)
6666
var buff []byte
67-
if buff, err = hostNameRewrite(rd, rewriteHost); err != nil {
67+
remoteIP := strings.Split(c.RemoteAddr().String(), ":")[0]
68+
if buff, err = hostNameRewrite(rd, rewriteHost, remoteIP); err != nil {
6869
return sc, err
6970
}
7071
err = sc.WriteBuff(buff)
7172
return sc, err
7273
}
7374

74-
func hostNameRewrite(request io.Reader, rewriteHost string) (_ []byte, err error) {
75+
func hostNameRewrite(request io.Reader, rewriteHost string, remoteIP string) (_ []byte, err error) {
7576
buf := pool.GetBuf(1024)
7677
defer pool.PutBuf(buf)
7778

7879
request.Read(buf)
79-
retBuffer, err := parseRequest(buf, rewriteHost)
80+
retBuffer, err := parseRequest(buf, rewriteHost, remoteIP)
8081
return retBuffer, err
8182
}
8283

83-
func parseRequest(org []byte, rewriteHost string) (ret []byte, err error) {
84+
func parseRequest(org []byte, rewriteHost string, remoteIP string) (ret []byte, err error) {
8485
tp := bytes.NewBuffer(org)
8586
// First line: GET /index.html HTTP/1.0
8687
var b []byte
@@ -106,29 +107,41 @@ func parseRequest(org []byte, rewriteHost string) (ret []byte, err error) {
106107
// GET /index.html HTTP/1.1
107108
// Host: www.google.com
108109
if req.URL.Host == "" {
109-
changedBuf, err := changeHostName(tp, rewriteHost)
110+
var changedBuf []byte
111+
if rewriteHost != "" {
112+
changedBuf, err = changeHostName(tp, rewriteHost)
113+
}
110114
buf := new(bytes.Buffer)
111115
buf.Write(b)
112-
buf.Write(changedBuf)
116+
buf.WriteString(fmt.Sprintf("X-Forwarded-For: %s\n", remoteIP))
117+
buf.WriteString(fmt.Sprintf("X-Real-IP: %s\n", remoteIP))
118+
if len(changedBuf) == 0 {
119+
tp.WriteTo(buf)
120+
} else {
121+
buf.Write(changedBuf)
122+
}
113123
return buf.Bytes(), err
114124
}
115125

116126
// RFC2616: second case
117127
// GET http://www.google.com/index.html HTTP/1.1
118128
// Host: doesntmatter
119129
// In this case, any Host line is ignored.
120-
hostPort := strings.Split(req.URL.Host, ":")
121-
if len(hostPort) == 1 {
122-
req.URL.Host = rewriteHost
123-
} else if len(hostPort) == 2 {
124-
req.URL.Host = fmt.Sprintf("%s:%s", rewriteHost, hostPort[1])
130+
if rewriteHost != "" {
131+
hostPort := strings.Split(req.URL.Host, ":")
132+
if len(hostPort) == 1 {
133+
req.URL.Host = rewriteHost
134+
} else if len(hostPort) == 2 {
135+
req.URL.Host = fmt.Sprintf("%s:%s", rewriteHost, hostPort[1])
136+
}
125137
}
126138
firstLine := req.Method + " " + req.URL.String() + " " + req.Proto
127139
buf := new(bytes.Buffer)
128140
buf.WriteString(firstLine)
141+
buf.WriteString(fmt.Sprintf("X-Forwarded-For: %s\n", remoteIP))
142+
buf.WriteString(fmt.Sprintf("X-Real-IP: %s\n", remoteIP))
129143
tp.WriteTo(buf)
130144
return buf.Bytes(), err
131-
132145
}
133146

134147
// parseRequestLine parses "GET /foo HTTP/1.1" into its three parts.
@@ -164,7 +177,7 @@ func changeHostName(buff *bytes.Buffer, rewriteHost string) (_ []byte, err error
164177
if portPos == -1 {
165178
hostHeader = fmt.Sprintf("Host: %s\n", rewriteHost)
166179
} else {
167-
hostHeader = fmt.Sprintf("Host: %s:%s\n", rewriteHost, kv[portPos+1:])
180+
hostHeader = fmt.Sprintf("Host: %s:%s\n", rewriteHost, kv[j+portPos+2:])
168181
}
169182
retBuf.WriteString(hostHeader)
170183
peek = peek[i+1:]

utils/vhost/vhost.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -182,9 +182,10 @@ func (l *Listener) Accept() (frpNet.Conn, error) {
182182
return nil, fmt.Errorf("Listener closed")
183183
}
184184

185-
// if rewriteFunc is exist and rewriteHost is set
185+
// if rewriteFunc is exist
186186
// rewrite http requests with a modified host header
187-
if l.mux.rewriteFunc != nil && l.rewriteHost != "" {
187+
// if l.rewriteHost is empty, nothing to do
188+
if l.mux.rewriteFunc != nil {
188189
sConn, err := l.mux.rewriteFunc(conn, l.rewriteHost)
189190
if err != nil {
190191
l.Warn("host header rewrite failed: %v", err)

0 commit comments

Comments
 (0)