diff --git a/utils/vhost/resource.go b/utils/vhost/resource.go new file mode 100644 index 0000000..6189b35 --- /dev/null +++ b/utils/vhost/resource.go @@ -0,0 +1,62 @@ +// Copyright 2017 fatedier, fatedier@gmail.com +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package vhost + +import ( + "io/ioutil" + "net/http" + "strings" + + "github.com/fatedier/frp/utils/version" +) + +const ( + NotFound = ` + +
+Sorry, the page you are looking for is currently unavailable.
+Please try again later.
The server is powered by frp.
+Faithfully yours, frp.
+ + +` +) + +func notFoundResponse() *http.Response { + header := make(http.Header) + header.Set("server", "frp/"+version.Full()) + res := &http.Response{ + Status: "Not Found", + StatusCode: 400, + Proto: "HTTP/1.0", + ProtoMajor: 1, + ProtoMinor: 0, + Header: header, + Body: ioutil.NopCloser(strings.NewReader(NotFound)), + } + return res +} diff --git a/utils/vhost/vhost.go b/utils/vhost/vhost.go index 98df5ad..21771d0 100644 --- a/utils/vhost/vhost.go +++ b/utils/vhost/vhost.go @@ -126,7 +126,7 @@ func (v *VhostMuxer) handle(c frpNet.Conn) { sConn, reqInfoMap, err := v.vhostFunc(c) if err != nil { - log.Error("get hostname from http/https request error: %v", err) + log.Warn("get hostname from http/https request error: %v", err) c.Close() return } @@ -135,17 +135,19 @@ func (v *VhostMuxer) handle(c frpNet.Conn) { path := strings.ToLower(reqInfoMap["Path"]) l, ok := v.getListener(name, path) if !ok { + res := notFoundResponse() + res.Write(c) log.Debug("http request for host [%s] path [%s] not found", name, path) c.Close() return } // if authFunc is exist and userName/password is set - // verify user access + // then verify user access if l.mux.authFunc != nil && l.userName != "" && l.passWord != "" { bAccess, err := l.mux.authFunc(c, l.userName, l.passWord, reqInfoMap["Authorization"]) if bAccess == false || err != nil { - l.Debug("check Authorization failed") + l.Debug("check http Authorization failed") res := noAuthResponse() res.Write(c) c.Close()