Skip to content

Commit

Permalink
frps: support custom_404_page
Browse files Browse the repository at this point in the history
  • Loading branch information
fatedier committed Apr 25, 2019
1 parent 6a1f15b commit 0dfd3a4
Show file tree
Hide file tree
Showing 5 changed files with 39 additions and 3 deletions.
3 changes: 3 additions & 0 deletions conf/frps_full.ini
Original file line number Diff line number Diff line change
Expand Up @@ -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
6 changes: 6 additions & 0 deletions models/config/server_common.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"`
Expand Down Expand Up @@ -104,6 +105,7 @@ func GetDefaultServerConf() *ServerCommonConf {
MaxPortsPerClient: 0,
HeartBeatTimeout: 90,
UserConnTimeout: 10,
Custom404Page: "",
}
}

Expand Down Expand Up @@ -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 {
Expand Down
3 changes: 3 additions & 0 deletions server/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
27 changes: 25 additions & 2 deletions utils/vhost/resource.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 = `<!DOCTYPE html>
<html>
Expand All @@ -46,18 +51,36 @@ Please try again later.</p>
`
)

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,
Proto: "HTTP/1.0",
ProtoMajor: 1,
ProtoMinor: 0,
Header: header,
Body: ioutil.NopCloser(strings.NewReader(NotFound)),
Body: ioutil.NopCloser(bytes.NewReader(getNotFoundPageContent())),
}
return res
}
Expand Down
3 changes: 2 additions & 1 deletion utils/vhost/reverseproxy.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}

Expand Down

0 comments on commit 0dfd3a4

Please sign in to comment.