[server] Switch from standard net/http
to fasthttp
web server
This commit is contained in:
parent
bb91e438a8
commit
dff1321a35
2 changed files with 39 additions and 29 deletions
|
@ -17,6 +17,8 @@ import "time"
|
||||||
// import "github.com/colinmarc/cdb"
|
// import "github.com/colinmarc/cdb"
|
||||||
import cdb "github.com/cipriancraciun/go-cdb-lib"
|
import cdb "github.com/cipriancraciun/go-cdb-lib"
|
||||||
|
|
||||||
|
import "github.com/valyala/fasthttp"
|
||||||
|
|
||||||
import . "../lib/common"
|
import . "../lib/common"
|
||||||
import . "../lib/server"
|
import . "../lib/server"
|
||||||
|
|
||||||
|
@ -29,13 +31,16 @@ type server struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
func (_server *server) ServeHTTP (_response http.ResponseWriter, _request *http.Request) () {
|
func (_server *server) HandleHTTP (_context *fasthttp.RequestCtx) () {
|
||||||
|
_uri := _context.URI ()
|
||||||
|
_request := &_context.Request
|
||||||
|
_requestHeaders := &_request.Header
|
||||||
|
_response := &_context.Response
|
||||||
|
_responseHeaders := &_response.Header
|
||||||
|
|
||||||
_timestamp := time.Now ()
|
_timestamp := time.Now ()
|
||||||
_timestampHttp := _timestamp.Format (http.TimeFormat)
|
_timestampHttp := _timestamp.Format (http.TimeFormat)
|
||||||
|
|
||||||
_responseHeaders := _response.Header ()
|
|
||||||
|
|
||||||
// _responseHeaders.Set ("Content-Security-Policy", "upgrade-insecure-requests")
|
// _responseHeaders.Set ("Content-Security-Policy", "upgrade-insecure-requests")
|
||||||
_responseHeaders.Set ("Referrer-Policy", "strict-origin-when-cross-origin")
|
_responseHeaders.Set ("Referrer-Policy", "strict-origin-when-cross-origin")
|
||||||
_responseHeaders.Set ("X-Frame-Options", "SAMEORIGIN")
|
_responseHeaders.Set ("X-Frame-Options", "SAMEORIGIN")
|
||||||
|
@ -46,12 +51,12 @@ func (_server *server) ServeHTTP (_response http.ResponseWriter, _request *http.
|
||||||
_responseHeaders.Set ("last-modified", _timestampHttp)
|
_responseHeaders.Set ("last-modified", _timestampHttp)
|
||||||
_responseHeaders.Set ("age", "0")
|
_responseHeaders.Set ("age", "0")
|
||||||
|
|
||||||
_method := _request.Method
|
_method := string (_requestHeaders.Method ())
|
||||||
_path := _request.URL.Path
|
_path := string (_uri.Path ())
|
||||||
|
|
||||||
if _method != http.MethodGet {
|
if _method != http.MethodGet {
|
||||||
log.Printf ("[ww] [bce7a75b] invalid method `%s` for `%s`!", _method, _path)
|
log.Printf ("[ww] [bce7a75b] invalid method `%s` for `%s`!", _method, _path)
|
||||||
_server.ServeError (_response, http.StatusMethodNotAllowed, nil)
|
_server.ServeError (_context, http.StatusMethodNotAllowed, nil)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -68,7 +73,7 @@ func (_server *server) ServeHTTP (_response http.ResponseWriter, _request *http.
|
||||||
_fingerprint = string (_value)
|
_fingerprint = string (_value)
|
||||||
if (_namespace == NamespaceFoldersContent) || (_namespace == NamespaceFoldersEntries) {
|
if (_namespace == NamespaceFoldersContent) || (_namespace == NamespaceFoldersEntries) {
|
||||||
if (_path == _path_0) && (_path != "/") {
|
if (_path == _path_0) && (_path != "/") {
|
||||||
_server.ServeRedirect (_response, http.StatusTemporaryRedirect, _path + "/")
|
_server.ServeRedirect (_context, http.StatusTemporaryRedirect, _path + "/")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -89,7 +94,7 @@ func (_server *server) ServeHTTP (_response http.ResponseWriter, _request *http.
|
||||||
_fingerprint = string (_value)
|
_fingerprint = string (_value)
|
||||||
break _found
|
break _found
|
||||||
} else {
|
} else {
|
||||||
_server.ServeError (_response, http.StatusInternalServerError, _error)
|
_server.ServeError (_context, http.StatusInternalServerError, _error)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -97,7 +102,7 @@ func (_server *server) ServeHTTP (_response http.ResponseWriter, _request *http.
|
||||||
break _found
|
break _found
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
_server.ServeError (_response, http.StatusInternalServerError, _error)
|
_server.ServeError (_context, http.StatusInternalServerError, _error)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -105,15 +110,15 @@ func (_server *server) ServeHTTP (_response http.ResponseWriter, _request *http.
|
||||||
if _fingerprint == "" {
|
if _fingerprint == "" {
|
||||||
if _path != "/favicon.ico" {
|
if _path != "/favicon.ico" {
|
||||||
log.Printf ("[ww] [7416f61d] not found for `%s`!", _path)
|
log.Printf ("[ww] [7416f61d] not found for `%s`!", _path)
|
||||||
_server.ServeError (_response, http.StatusNotFound, nil)
|
_server.ServeError (_context, http.StatusNotFound, nil)
|
||||||
} else {
|
} else {
|
||||||
_data, _dataContentType := FaviconData ()
|
_data, _dataContentType := FaviconData ()
|
||||||
_responseHeaders.Set ("content-type", _dataContentType)
|
_responseHeaders.Set ("content-type", _dataContentType)
|
||||||
_responseHeaders.Set ("content-encoding", "identity")
|
_responseHeaders.Set ("content-encoding", "identity")
|
||||||
_responseHeaders.Set ("etag", "f00f5f99bb3d45ef9806547fe5fe031a")
|
_responseHeaders.Set ("etag", "f00f5f99bb3d45ef9806547fe5fe031a")
|
||||||
_responseHeaders.Set ("cache-control", "public, immutable, max-age=3600")
|
_responseHeaders.Set ("cache-control", "public, immutable, max-age=3600")
|
||||||
_response.WriteHeader (http.StatusOK)
|
_response.SetStatusCode (http.StatusOK)
|
||||||
_response.Write (_data)
|
_response.SetBody (_data)
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -125,11 +130,11 @@ func (_server *server) ServeHTTP (_response http.ResponseWriter, _request *http.
|
||||||
if _value != nil {
|
if _value != nil {
|
||||||
_data = _value
|
_data = _value
|
||||||
} else {
|
} else {
|
||||||
_server.ServeError (_response, http.StatusInternalServerError, fmt.Errorf ("[0165c193] missing data content: `%s`", _fingerprint))
|
_server.ServeError (_context, http.StatusInternalServerError, fmt.Errorf ("[0165c193] missing data content: `%s`", _fingerprint))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
_server.ServeError (_response, http.StatusInternalServerError, _error)
|
_server.ServeError (_context, http.StatusInternalServerError, _error)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -142,15 +147,15 @@ func (_server *server) ServeHTTP (_response http.ResponseWriter, _request *http.
|
||||||
if _metadata_0, _error := MetadataDecode (_value); _error == nil {
|
if _metadata_0, _error := MetadataDecode (_value); _error == nil {
|
||||||
_metadata = _metadata_0
|
_metadata = _metadata_0
|
||||||
} else {
|
} else {
|
||||||
_server.ServeError (_response, http.StatusInternalServerError, _error)
|
_server.ServeError (_context, http.StatusInternalServerError, _error)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
_server.ServeError (_response, http.StatusInternalServerError, fmt.Errorf ("[e8702411] missing data metadata: `%s`", _fingerprint))
|
_server.ServeError (_context, http.StatusInternalServerError, fmt.Errorf ("[e8702411] missing data metadata: `%s`", _fingerprint))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
_server.ServeError (_response, http.StatusInternalServerError, _error)
|
_server.ServeError (_context, http.StatusInternalServerError, _error)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -164,21 +169,22 @@ func (_server *server) ServeHTTP (_response http.ResponseWriter, _request *http.
|
||||||
}
|
}
|
||||||
_responseHeaders.Set ("cache-control", "public, immutable, max-age=3600")
|
_responseHeaders.Set ("cache-control", "public, immutable, max-age=3600")
|
||||||
|
|
||||||
_response.WriteHeader (http.StatusOK)
|
_response.SetStatusCode (http.StatusOK)
|
||||||
_response.Write (_data)
|
_response.SetBody (_data)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
func (_server *server) ServeRedirect (_response http.ResponseWriter, _status uint, _urlRaw string) () {
|
func (_server *server) ServeRedirect (_context *fasthttp.RequestCtx, _status uint, _urlRaw string) () {
|
||||||
_responseHeaders := _response.Header ()
|
_response := &_context.Response
|
||||||
|
_responseHeaders := &_response.Header
|
||||||
|
|
||||||
var _url string
|
var _url string
|
||||||
if _url_0, _error := url.Parse (_urlRaw); _error == nil {
|
if _url_0, _error := url.Parse (_urlRaw); _error == nil {
|
||||||
_url = _url_0.String ()
|
_url = _url_0.String ()
|
||||||
} else {
|
} else {
|
||||||
_server.ServeError (_response, http.StatusInternalServerError, _error)
|
_server.ServeError (_context, http.StatusInternalServerError, _error)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -188,20 +194,21 @@ func (_server *server) ServeRedirect (_response http.ResponseWriter, _status uin
|
||||||
_responseHeaders.Set ("cache-control", "public, immutable, max-age=3600")
|
_responseHeaders.Set ("cache-control", "public, immutable, max-age=3600")
|
||||||
_responseHeaders.Set ("location", _url)
|
_responseHeaders.Set ("location", _url)
|
||||||
|
|
||||||
_response.WriteHeader (int (_status))
|
_response.SetStatusCode (int (_status))
|
||||||
_response.Write ([]byte (fmt.Sprintf ("[%d] %s", _status, _url)))
|
_response.SetBody ([]byte (fmt.Sprintf ("[%d] %s", _status, _url)))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
func (_server *server) ServeError (_response http.ResponseWriter, _status uint, _error error) () {
|
func (_server *server) ServeError (_context *fasthttp.RequestCtx, _status uint, _error error) () {
|
||||||
_responseHeaders := _response.Header ()
|
_response := &_context.Response
|
||||||
|
_responseHeaders := &_response.Header
|
||||||
|
|
||||||
_responseHeaders.Set ("content-type", MimeTypeText)
|
_responseHeaders.Set ("content-type", MimeTypeText)
|
||||||
_responseHeaders.Set ("content-encoding", "identity")
|
_responseHeaders.Set ("content-encoding", "identity")
|
||||||
_responseHeaders.Set ("cache-control", "no-cache")
|
_responseHeaders.Set ("cache-control", "no-cache")
|
||||||
|
|
||||||
_response.WriteHeader (int (_status))
|
_response.SetStatusCode (int (_status))
|
||||||
_response.Write ([]byte (fmt.Sprintf ("[%d]", _status)))
|
_response.SetBody ([]byte (fmt.Sprintf ("[%d]", _status)))
|
||||||
|
|
||||||
LogError (_error, "")
|
LogError (_error, "")
|
||||||
}
|
}
|
||||||
|
@ -283,7 +290,7 @@ func main_0 () (error) {
|
||||||
log.Printf ("[ii] [f11e4e37] listening on `http://%s/`", _bind)
|
log.Printf ("[ii] [f11e4e37] listening on `http://%s/`", _bind)
|
||||||
}
|
}
|
||||||
|
|
||||||
if _error := http.ListenAndServe (_bind, _server); _error != nil {
|
if _error := fasthttp.ListenAndServe (_bind, _server.HandleHTTP); _error != nil {
|
||||||
AbortError (_error, "[44f45c67] failed starting server!")
|
AbortError (_error, "[44f45c67] failed starting server!")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -36,6 +36,7 @@ func MetadataEncode (_metadata map[string]string) ([]byte, error) {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
func MetadataDecode (_data []byte) ([][2]string, error) {
|
func MetadataDecode (_data []byte) ([][2]string, error) {
|
||||||
_metadata := make ([][2]string, 0, 16)
|
_metadata := make ([][2]string, 0, 16)
|
||||||
for _, _data := range bytes.Split (_data, []byte ("\n")) {
|
for _, _data := range bytes.Split (_data, []byte ("\n")) {
|
||||||
|
@ -53,6 +54,8 @@ func MetadataDecode (_data []byte) ([][2]string, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
var metadataKeyRegex *regexp.Regexp = regexp.MustCompile (`\A[a-z0-9](?:[a-z0-9-]?[a-z]+)*\z`)
|
var metadataKeyRegex *regexp.Regexp = regexp.MustCompile (`\A[a-z0-9](?:[a-z0-9-]?[a-z]+)*\z`)
|
||||||
var metadataValueRegex *regexp.Regexp = regexp.MustCompile (`\A[[:graph:]](?: ?[[:graph:]]+)*\z`)
|
var metadataValueRegex *regexp.Regexp = regexp.MustCompile (`\A[[:graph:]](?: ?[[:graph:]]+)*\z`)
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue