@@ -57,30 +57,31 @@ func GetHttpRequestInfo(c frpNet.Conn) (_ frpNet.Conn, _ map[string]string, err
57
57
}
58
58
59
59
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 )
61
61
return & HttpMuxer {mux }, err
62
62
}
63
63
64
- func HttpHostNameRewrite (c frpNet.Conn , rewriteHost string ) (_ frpNet.Conn , err error ) {
64
+ func ModifyHttpRequest (c frpNet.Conn , rewriteHost string ) (_ frpNet.Conn , err error ) {
65
65
sc , rd := frpNet .NewShareConn (c )
66
66
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 {
68
69
return sc , err
69
70
}
70
71
err = sc .WriteBuff (buff )
71
72
return sc , err
72
73
}
73
74
74
- func hostNameRewrite (request io.Reader , rewriteHost string ) (_ []byte , err error ) {
75
+ func hostNameRewrite (request io.Reader , rewriteHost string , remoteIP string ) (_ []byte , err error ) {
75
76
buf := pool .GetBuf (1024 )
76
77
defer pool .PutBuf (buf )
77
78
78
79
request .Read (buf )
79
- retBuffer , err := parseRequest (buf , rewriteHost )
80
+ retBuffer , err := parseRequest (buf , rewriteHost , remoteIP )
80
81
return retBuffer , err
81
82
}
82
83
83
- func parseRequest (org []byte , rewriteHost string ) (ret []byte , err error ) {
84
+ func parseRequest (org []byte , rewriteHost string , remoteIP string ) (ret []byte , err error ) {
84
85
tp := bytes .NewBuffer (org )
85
86
// First line: GET /index.html HTTP/1.0
86
87
var b []byte
@@ -106,29 +107,41 @@ func parseRequest(org []byte, rewriteHost string) (ret []byte, err error) {
106
107
// GET /index.html HTTP/1.1
107
108
// Host: www.google.com
108
109
if req .URL .Host == "" {
109
- changedBuf , err := changeHostName (tp , rewriteHost )
110
+ var changedBuf []byte
111
+ if rewriteHost != "" {
112
+ changedBuf , err = changeHostName (tp , rewriteHost )
113
+ }
110
114
buf := new (bytes.Buffer )
111
115
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
+ }
113
123
return buf .Bytes (), err
114
124
}
115
125
116
126
// RFC2616: second case
117
127
// GET http://www.google.com/index.html HTTP/1.1
118
128
// Host: doesntmatter
119
129
// 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
+ }
125
137
}
126
138
firstLine := req .Method + " " + req .URL .String () + " " + req .Proto
127
139
buf := new (bytes.Buffer )
128
140
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 ))
129
143
tp .WriteTo (buf )
130
144
return buf .Bytes (), err
131
-
132
145
}
133
146
134
147
// 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
164
177
if portPos == - 1 {
165
178
hostHeader = fmt .Sprintf ("Host: %s\n " , rewriteHost )
166
179
} 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 :])
168
181
}
169
182
retBuf .WriteString (hostHeader )
170
183
peek = peek [i + 1 :]
0 commit comments