From 0dfd3a421cc40717ba8f19aa43a4117aec233952 Mon Sep 17 00:00:00 2001 From: fatedier Date: Thu, 25 Apr 2019 12:29:34 +0800 Subject: [PATCH] frps: support custom_404_page --- conf/frps_full.ini | 3 +++ models/config/server_common.go | 6 ++++++ server/service.go | 3 +++ utils/vhost/resource.go | 27 +++++++++++++++++++++++++-- utils/vhost/reverseproxy.go | 3 ++- 5 files changed, 39 insertions(+), 3 deletions(-) diff --git a/conf/frps_full.ini b/conf/frps_full.ini index d45bb0a..a8c0e63 100644 --- a/conf/frps_full.ini +++ b/conf/frps_full.ini @@ -65,3 +65,6 @@ subdomain_host = frps.com # if tcp stream multiplexing is used, default is true tcp_mux = true + +# custom 404 page for HTTP requests +# custom_404_page = /path/to/404.html diff --git a/models/config/server_common.go b/models/config/server_common.go index d468376..1e54bdd 100644 --- a/models/config/server_common.go +++ b/models/config/server_common.go @@ -69,6 +69,7 @@ type ServerCommonConf struct { Token string `json:"token"` SubDomainHost string `json:"subdomain_host"` TcpMux bool `json:"tcp_mux"` + Custom404Page string `json:"custom_404_page"` AllowPorts map[int]struct{} MaxPoolCount int64 `json:"max_pool_count"` @@ -104,6 +105,7 @@ func GetDefaultServerConf() *ServerCommonConf { MaxPortsPerClient: 0, HeartBeatTimeout: 90, UserConnTimeout: 10, + Custom404Page: "", } } @@ -293,6 +295,10 @@ func UnmarshalServerConfFromIni(defaultCfg *ServerCommonConf, content string) (c cfg.TcpMux = true } + if tmpStr, ok = conf.Get("common", "custom_404_page"); ok { + cfg.Custom404Page = tmpStr + } + if tmpStr, ok = conf.Get("common", "heartbeat_timeout"); ok { v, errRet := strconv.ParseInt(tmpStr, 10, 64) if errRet != nil { diff --git a/server/service.go b/server/service.go index ac5602a..6cd8e50 100644 --- a/server/service.go +++ b/server/service.go @@ -108,6 +108,9 @@ func NewService() (svr *Service, err error) { return } + // Init 404 not found page + vhost.NotFoundPagePath = cfg.Custom404Page + var ( httpMuxOn bool httpsMuxOn bool diff --git a/utils/vhost/resource.go b/utils/vhost/resource.go index 40cb952..9553e7e 100644 --- a/utils/vhost/resource.go +++ b/utils/vhost/resource.go @@ -15,13 +15,18 @@ package vhost import ( + "bytes" "io/ioutil" "net/http" - "strings" + frpLog "github.com/fatedier/frp/utils/log" "github.com/fatedier/frp/utils/version" ) +var ( + NotFoundPagePath = "" +) + const ( NotFound = ` @@ -46,10 +51,28 @@ Please try again later.

` ) +func getNotFoundPageContent() []byte { + var ( + buf []byte + err error + ) + if NotFoundPagePath != "" { + buf, err = ioutil.ReadFile(NotFoundPagePath) + if err != nil { + frpLog.Warn("read custom 404 page error: %v", err) + buf = []byte(NotFound) + } + } else { + buf = []byte(NotFound) + } + return buf +} + func notFoundResponse() *http.Response { header := make(http.Header) header.Set("server", "frp/"+version.Full()) header.Set("Content-Type", "text/html") + res := &http.Response{ Status: "Not Found", StatusCode: 404, @@ -57,7 +80,7 @@ func notFoundResponse() *http.Response { ProtoMajor: 1, ProtoMinor: 0, Header: header, - Body: ioutil.NopCloser(strings.NewReader(NotFound)), + Body: ioutil.NopCloser(bytes.NewReader(getNotFoundPageContent())), } return res } diff --git a/utils/vhost/reverseproxy.go b/utils/vhost/reverseproxy.go index 5662589..45f25be 100644 --- a/utils/vhost/reverseproxy.go +++ b/utils/vhost/reverseproxy.go @@ -254,7 +254,8 @@ func (p *ReverseProxy) serveHTTP(rw http.ResponseWriter, req *http.Request) { if err != nil { p.logf("http: proxy error: %v", err) rw.WriteHeader(http.StatusNotFound) - rw.Write([]byte(NotFound)) + + rw.Write(getNotFoundPageContent()) return }