diff --git a/sources/cmd/server.go b/sources/cmd/server.go index 0444c25..a529c4a 100644 --- a/sources/cmd/server.go +++ b/sources/cmd/server.go @@ -36,6 +36,9 @@ import . "github.com/volution/kawipiko/lib/server" type server struct { httpServer *fasthttp.Server cdbReader *cdb.CDB + cachedFileFingerprints map[string][]byte + cachedDataMeta map[string][]byte + cachedDataContent map[string][]byte debug bool } @@ -60,7 +63,8 @@ func (_server *server) Serve (_context *fasthttp.RequestCtx) () { _method := _requestHeaders.Method () - _path := append (_pathBuffer[:0], _requestHeaders.RequestURI () ...) + _path := _pathBuffer[:0] + _path = append (_path, _requestHeaders.RequestURI () ...) if _pathLimit := bytes.IndexByte (_path, '?'); _pathLimit > 0 { _path = _path[: _pathLimit] } @@ -93,7 +97,7 @@ func (_server *server) Serve (_context *fasthttp.RequestCtx) () { if _code, _error := strconv.Atoi (BytesToString (_code)); _error == nil { _banner, _bannerFound := ErrorBannersData[uint (_code)] if (_code > 0) && _bannerFound { - _server.ServeStatic (_context, http.StatusOK, []byte (_banner), ErrorBannerContentType, ErrorBannerContentEncoding, true) + _server.ServeStatic (_context, http.StatusOK, _banner, ErrorBannerContentType, ErrorBannerContentEncoding, true) return } } @@ -134,25 +138,32 @@ func (_server *server) Serve (_context *fasthttp.RequestCtx) () { } _pathSuffixHasSlash := (len (_pathSuffix) != 0) && (_pathSuffix[0] == '/') - _key := _keyBuffer[:0] - _key = append (_key, _namespace ...) - _key = append (_key, ':') - _key = append (_key, _path ...) - _key = append (_key, _pathSuffix ...) - - if _value, _error := _server.cdbReader.GetWithCdbHash (_key); _error == nil { - if _value != nil { - _fingerprints = _value - if ((_namespace == NamespaceFoldersContent) || _pathSuffixHasSlash) && (!_pathIsRoot && !_pathHasSlash) { - _path = append (_path, '/') - _server.ServeRedirect (_context, http.StatusTemporaryRedirect, _path, true) - return - } - break _loop_1 - } + if _server.cachedFileFingerprints != nil { + _key := _keyBuffer[:0] + _key = append (_key, _path ...) + _key = append (_key, _pathSuffix ...) + _fingerprints, _ = _server.cachedFileFingerprints[BytesToString (_key)] } else { - _server.ServeError (_context, http.StatusInternalServerError, _error, false) - return + _key := _keyBuffer[:0] + _key = append (_key, _namespace ...) + _key = append (_key, ':') + _key = append (_key, _path ...) + _key = append (_key, _pathSuffix ...) + if _value, _error := _server.cdbReader.GetWithCdbHash (_key); _error == nil { + _fingerprints = _value + } else { + _server.ServeError (_context, http.StatusInternalServerError, _error, false) + return + } + } + + if _fingerprints != nil { + if ((_namespace == NamespaceFoldersContent) || _pathSuffixHasSlash) && (!_pathIsRoot && !_pathHasSlash) { + _path = append (_path, '/') + _server.ServeRedirect (_context, http.StatusTemporaryRedirect, _path, true) + return + } + break _loop_1 } } } @@ -170,20 +181,27 @@ func (_server *server) Serve (_context *fasthttp.RequestCtx) () { _pathLimit >= 0; _pathLimit = bytes.LastIndexByte (_path[: _pathLimit], '/') { - _key := _keyBuffer[:0] - _key = append (_key, NamespaceFilesContent ...) - _key = append (_key, ':') - _key = append (_key, _path[: _pathLimit] ...) - _key = append (_key, "/*" ...) - - if _value, _error := _server.cdbReader.GetWithCdbHash (_key); _error == nil { - if _value != nil { - _fingerprints = _value - break _loop_2 - } + if _server.cachedFileFingerprints != nil { + _key := _keyBuffer[:0] + _key = append (_key, _path[: _pathLimit] ...) + _key = append (_key, "/*" ...) + _fingerprints, _ = _server.cachedFileFingerprints[BytesToString (_key)] } else { - _server.ServeError (_context, http.StatusInternalServerError, _error, false) - return + _key := _keyBuffer[:0] + _key = append (_key, NamespaceFilesContent ...) + _key = append (_key, ':') + _key = append (_key, _path[: _pathLimit] ...) + _key = append (_key, "/*" ...) + if _value, _error := _server.cdbReader.GetWithCdbHash (_key); _error == nil { + _fingerprints = _value + } else { + _server.ServeError (_context, http.StatusInternalServerError, _error, false) + return + } + } + + if _fingerprints != nil { + break _loop_2 } } } @@ -199,77 +217,81 @@ func (_server *server) Serve (_context *fasthttp.RequestCtx) () { _server.ServeError (_context, http.StatusInternalServerError, nil, false) return } - _fingerprintContent := _fingerprints[:64] - _fingerprintMeta := _fingerprints[65:] + _fingerprintContent := _fingerprints[0:64] + _fingerprintMeta := _fingerprints[65:129] _responseHeaders.SetCanonical ([]byte ("Cache-Control"), []byte ("public, immutable, max-age=3600")) var _data []byte - { + if _server.cachedDataContent != nil { + _data, _ = _server.cachedDataContent[BytesToString (_fingerprintContent)] + } else { _key := _keyBuffer[:0] _key = append (_key, NamespaceDataContent ...) _key = append (_key, ':') _key = append (_key, _fingerprintContent ...) if _value, _error := _server.cdbReader.GetWithCdbHash (_key); _error == nil { - if _value != nil { - _data = _value - } else { - log.Printf ("[ee] [0165c193] missing data content for `%s`!\n", _requestHeaders.RequestURI ()) - _server.ServeError (_context, http.StatusInternalServerError, nil, false) - return - } + _data = _value } else { _server.ServeError (_context, http.StatusInternalServerError, _error, false) return } } + if _data == nil { + log.Printf ("[ee] [0165c193] missing data content for `%s`!\n", _requestHeaders.RequestURI ()) + _server.ServeError (_context, http.StatusInternalServerError, nil, false) + return + } - _responseStatus := http.StatusOK - { + var _dataMetaRaw []byte + if _server.cachedDataMeta != nil { + _dataMetaRaw, _ = _server.cachedDataMeta[BytesToString (_fingerprintMeta)] + } else { _key := _keyBuffer[:0] _key = append (_key, NamespaceDataMetadata ...) _key = append (_key, ':') _key = append (_key, _fingerprintMeta ...) if _value, _error := _server.cdbReader.GetWithCdbHash (_key); _error == nil { - if _value != nil { - _handleHeader := func (_name []byte, _value []byte) { - switch { - case len (_name) == 0 : { - log.Printf ("[90009821] invalid data metadata for `%s`!\n", _requestHeaders.RequestURI ()) - _responseStatus = http.StatusInternalServerError - } - case _name[0] != '_' : - _responseHeaders.SetCanonical (_name, _value) - case bytes.Equal (_name, []byte ("_Status")) : - if _value, _error := strconv.Atoi (BytesToString (_value)); _error == nil { - if (_value >= 200) && (_value <= 599) { - _responseStatus = _value - } else { - log.Printf ("[c2f7ec36] invalid data metadata for `%s`!\n", _requestHeaders.RequestURI ()) - _responseStatus = http.StatusInternalServerError - } - } else { - log.Printf ("[beedae55] invalid data metadata for `%s`!\n", _requestHeaders.RequestURI ()) - _responseStatus = http.StatusInternalServerError - } - default : - log.Printf ("[7acc7d90] invalid data metadata for `%s`!\n", _requestHeaders.RequestURI ()) - } - } - if _error := MetadataDecodeIterate (_value, _handleHeader); _error != nil { - _server.ServeError (_context, http.StatusInternalServerError, _error, false) - return - } - } else { - log.Printf ("[ee] [e8702411] missing data metadata for `%s`!\n", _requestHeaders.RequestURI ()) - _server.ServeError (_context, http.StatusInternalServerError, nil, false) - return - } + _dataMetaRaw = _value } else { _server.ServeError (_context, http.StatusInternalServerError, _error, false) return } } + if _dataMetaRaw == nil { + log.Printf ("[ee] [e8702411] missing data metadata for `%s`!\n", _requestHeaders.RequestURI ()) + _server.ServeError (_context, http.StatusInternalServerError, nil, false) + return + } + + _responseStatus := http.StatusOK + _handleHeader := func (_name []byte, _value []byte) { + switch { + case len (_name) == 0 : + log.Printf ("[90009821] invalid data metadata for `%s`!\n", _requestHeaders.RequestURI ()) + _responseStatus = http.StatusInternalServerError + case _name[0] != '_' : + _responseHeaders.SetCanonical (_name, _value) + case bytes.Equal (_name, []byte ("_Status")) : + if _value, _error := strconv.Atoi (BytesToString (_value)); _error == nil { + if (_value >= 200) && (_value <= 599) { + _responseStatus = _value + } else { + log.Printf ("[c2f7ec36] invalid data metadata for `%s`!\n", _requestHeaders.RequestURI ()) + _responseStatus = http.StatusInternalServerError + } + } else { + log.Printf ("[beedae55] invalid data metadata for `%s`!\n", _requestHeaders.RequestURI ()) + _responseStatus = http.StatusInternalServerError + } + default : + log.Printf ("[7acc7d90] invalid data metadata for `%s`!\n", _requestHeaders.RequestURI ()) + } + } + if _error := MetadataDecodeIterate (_dataMetaRaw, _handleHeader); _error != nil { + _server.ServeError (_context, http.StatusInternalServerError, _error, false) + return + } if _server.debug { log.Printf ("[dd] [b15f3cad] serving for `%s`...\n", _requestHeaders.RequestURI ()) @@ -337,7 +359,7 @@ func (_server *server) ServeError (_context *fasthttp.RequestCtx, _status uint, _responseHeaders.SetCanonical ([]byte ("Content-Encoding"), []byte (ErrorBannerContentEncoding)) if _banner, _bannerFound := ErrorBannersData[_status]; _bannerFound { - _response.SetBodyRaw ([]byte (_banner)) + _response.SetBodyRaw (_banner) } _response.SetStatusCode (int (_status)) @@ -361,6 +383,9 @@ func main_0 () (error) { var _archiveInmem bool var _archiveMmap bool var _archivePreload bool + var _indexPaths bool + var _indexDataMeta bool + var _indexDataContent bool var _processes uint var _threads uint var _slave uint @@ -403,6 +428,11 @@ func main_0 () (error) { --archive-mmap (memory-mapped archive file) --archive-preload (preload archive file) + --index-all + --index-paths + --index-data-meta + --index-data-content + --bind : --processes (of slave processes) @@ -421,6 +451,10 @@ func main_0 () (error) { _archiveInmem_0 := _flags.Bool ("archive-inmem", false, "") _archiveMmap_0 := _flags.Bool ("archive-mmap", false, "") _archivePreload_0 := _flags.Bool ("archive-preload", false, "") + _indexAll_0 := _flags.Bool ("index-all", false, "") + _indexPaths_0 := _flags.Bool ("index-paths", false, "") + _indexDataMeta_0 := _flags.Bool ("index-data-meta", false, "") + _indexDataContent_0 := _flags.Bool ("index-data-content", false, "") _processes_0 := _flags.Uint ("processes", 0, "") _threads_0 := _flags.Uint ("threads", 0, "") _slave_0 := _flags.Uint ("slave", 0, "") @@ -435,6 +469,10 @@ func main_0 () (error) { _archiveInmem = *_archiveInmem_0 _archiveMmap = *_archiveMmap_0 _archivePreload = *_archivePreload_0 + _indexAll := *_indexAll_0 + _indexPaths = _indexAll || *_indexPaths_0 + _indexDataMeta = _indexAll || *_indexDataMeta_0 + _indexDataContent = _indexAll || *_indexDataContent_0 _processes = *_processes_0 _threads = *_threads_0 _slave = *_slave_0 @@ -707,7 +745,7 @@ func main_0 () (error) { } } - if _schemaVersion, _error := _cdbReader.Get ([]byte (NamespaceSchemaVersion)); _error == nil { + if _schemaVersion, _error := _cdbReader.GetWithCdbHash ([]byte (NamespaceSchemaVersion)); _error == nil { if _schemaVersion == nil { AbortError (nil, "[09316866] missing archive schema version!") } else if string (_schemaVersion) != CurrentSchemaVersion { @@ -717,10 +755,109 @@ func main_0 () (error) { AbortError (_error, "[87cae197] failed opening archive!") } + var _cachedFileFingerprints map[string][]byte + if _indexPaths { + _cachedFileFingerprints = make (map[string][]byte, 128 * 1024) + } + var _cachedDataMeta map[string][]byte + if _indexDataMeta { + _cachedDataMeta = make (map[string][]byte, 128 * 1024) + } + var _cachedDataContent map[string][]byte + if _indexDataContent { + _cachedDataContent = make (map[string][]byte, 128 * 1024) + } + + if _indexPaths || _indexDataMeta || _indexDataContent { + if _debug { + log.Printf ("[ii] [fa5338fd] indexing archive...\n") + } + if _filesIndex, _error := _cdbReader.GetWithCdbHash ([]byte (NamespaceFilesIndex)); _error == nil { + if _filesIndex != nil { + _keyBuffer := [1024]byte {} + for { + _offset := bytes.IndexByte (_filesIndex, '\n') + if _offset == 0 { + continue + } + if _offset == -1 { + break + } + _filePath := _filesIndex[: _offset] + _filesIndex = _filesIndex[_offset + 1 :] + var _fingerprints []byte + var _fingerprintContent []byte + var _fingerprintMeta []byte + { + _key := _keyBuffer[:0] + _key = append (_key, NamespaceFilesContent ...) + _key = append (_key, ':') + _key = append (_key, _filePath ...) + if _fingerprints_0, _error := _cdbReader.GetWithCdbHash (_key); _error == nil { + if _fingerprints_0 != nil { + _fingerprints = _fingerprints_0 + _fingerprintContent = _fingerprints[0:64] + _fingerprintMeta = _fingerprints[65:129] + } else { + AbortError (_error, "[460b3cf1] failed indexing archive!") + } + } else { + AbortError (_error, "[216f2075] failed indexing archive!") + } + } + if _indexPaths { + _cachedFileFingerprints[BytesToString (_filePath)] = _fingerprints + } + if _indexDataMeta { + if _, _wasCached := _cachedDataMeta[BytesToString (_fingerprintMeta)]; !_wasCached { + _key := _keyBuffer[:0] + _key = append (_key, NamespaceDataMetadata ...) + _key = append (_key, ':') + _key = append (_key, _fingerprintMeta ...) + if _dataMeta, _error := _cdbReader.GetWithCdbHash (_key); _error == nil { + if _dataMeta != nil { + _cachedDataMeta[BytesToString (_fingerprintMeta)] = _dataMeta + } else { + AbortError (_error, "[6df556bf] failed indexing archive!") + } + } else { + AbortError (_error, "[0d730134] failed indexing archive!") + } + } + } + if _indexDataContent { + if _, _wasCached := _cachedDataContent[BytesToString (_fingerprintContent)]; !_wasCached { + _key := _keyBuffer[:0] + _key = append (_key, NamespaceDataContent ...) + _key = append (_key, ':') + _key = append (_key, _fingerprintContent ...) + if _dataContent, _error := _cdbReader.GetWithCdbHash (_key); _error == nil { + if _dataContent != nil { + _cachedDataContent[BytesToString (_fingerprintContent)] = _dataContent + } else { + AbortError (_error, "[4e27fe46] failed indexing archive!") + } + } else { + AbortError (_error, "[532845ad] failed indexing archive!") + } + } + } + } + } else { + log.Printf ("[ww] [30314f31] missing archive files index; ignoring!\n") + } + } else { + AbortError (_error, "[82299b3d] failed indexing arcdive!") + } + } + _server := & server { httpServer : nil, cdbReader : _cdbReader, + cachedFileFingerprints : _cachedFileFingerprints, + cachedDataMeta : _cachedDataMeta, + cachedDataContent : _cachedDataContent, debug : _debug, } diff --git a/sources/lib/server/banners.go b/sources/lib/server/banners.go index 47a1c8b..9b66bbe 100644 --- a/sources/lib/server/banners.go +++ b/sources/lib/server/banners.go @@ -10,7 +10,7 @@ import . "github.com/volution/kawipiko/lib/common" var AboutBannerContentType = MimeTypeText var AboutBannerContentEncoding = "identity" -var AboutBannerData = ( +var AboutBannerData = []byte ( "+---------------------------------------------------------------------------+\n" + ". .\n" + ". __ __ .\n" + @@ -57,10 +57,10 @@ var AboutBannerData = ( var ErrorBannerContentType = MimeTypeText var ErrorBannerContentEncoding = "identity" -var ErrorBannersData = map[uint]string { +var ErrorBannersData = map[uint][]byte { - 100 : ( + 100 : []byte ( "+---------------------------------------------------------------------------+\n" + "| kawipiko -- blazingly fast static HTTP server | https://bit.ly/kawipiko |\n" + "+---------------------------------------------------------------------------+\n" + @@ -84,7 +84,7 @@ var ErrorBannersData = map[uint]string { ""), - 101 : ( + 101 : []byte ( "+---------------------------------------------------------------------------+\n" + "| kawipiko -- blazingly fast static HTTP server | https://bit.ly/kawipiko |\n" + "+---------------------------------------------------------------------------+\n" + @@ -112,7 +112,7 @@ var ErrorBannersData = map[uint]string { ""), - 102 : ( + 102 : []byte ( "+---------------------------------------------------------------------------+\n" + "| kawipiko -- blazingly fast static HTTP server | https://bit.ly/kawipiko |\n" + "+---------------------------------------------------------------------------+\n" + @@ -136,7 +136,7 @@ var ErrorBannersData = map[uint]string { ""), - 103 : ( + 103 : []byte ( "+---------------------------------------------------------------------------+\n" + "| kawipiko -- blazingly fast static HTTP server | https://bit.ly/kawipiko |\n" + "+---------------------------------------------------------------------------+\n" + @@ -160,7 +160,7 @@ var ErrorBannersData = map[uint]string { ""), - 200 : ( + 200 : []byte ( "+---------------------------------------------------------------------------+\n" + "| kawipiko -- blazingly fast static HTTP server | https://bit.ly/kawipiko |\n" + "+---------------------------------------------------------------------------+\n" + @@ -184,7 +184,7 @@ var ErrorBannersData = map[uint]string { ""), - 201 : ( + 201 : []byte ( "+---------------------------------------------------------------------------+\n" + "| kawipiko -- blazingly fast static HTTP server | https://bit.ly/kawipiko |\n" + "+---------------------------------------------------------------------------+\n" + @@ -208,7 +208,7 @@ var ErrorBannersData = map[uint]string { ""), - 202 : ( + 202 : []byte ( "+---------------------------------------------------------------------------+\n" + "| kawipiko -- blazingly fast static HTTP server | https://bit.ly/kawipiko |\n" + "+---------------------------------------------------------------------------+\n" + @@ -232,7 +232,7 @@ var ErrorBannersData = map[uint]string { ""), - 203 : ( + 203 : []byte ( "+---------------------------------------------------------------------------+\n" + "| kawipiko -- blazingly fast static HTTP server | https://bit.ly/kawipiko |\n" + "+---------------------------------------------------------------------------+\n" + @@ -260,7 +260,7 @@ var ErrorBannersData = map[uint]string { ""), - 204 : ( + 204 : []byte ( "+---------------------------------------------------------------------------+\n" + "| kawipiko -- blazingly fast static HTTP server | https://bit.ly/kawipiko |\n" + "+---------------------------------------------------------------------------+\n" + @@ -284,7 +284,7 @@ var ErrorBannersData = map[uint]string { ""), - 205 : ( + 205 : []byte ( "+---------------------------------------------------------------------------+\n" + "| kawipiko -- blazingly fast static HTTP server | https://bit.ly/kawipiko |\n" + "+---------------------------------------------------------------------------+\n" + @@ -308,7 +308,7 @@ var ErrorBannersData = map[uint]string { ""), - 206 : ( + 206 : []byte ( "+---------------------------------------------------------------------------+\n" + "| kawipiko -- blazingly fast static HTTP server | https://bit.ly/kawipiko |\n" + "+---------------------------------------------------------------------------+\n" + @@ -332,7 +332,7 @@ var ErrorBannersData = map[uint]string { ""), - 207 : ( + 207 : []byte ( "+---------------------------------------------------------------------------+\n" + "| kawipiko -- blazingly fast static HTTP server | https://bit.ly/kawipiko |\n" + "+---------------------------------------------------------------------------+\n" + @@ -356,7 +356,7 @@ var ErrorBannersData = map[uint]string { ""), - 208 : ( + 208 : []byte ( "+---------------------------------------------------------------------------+\n" + "| kawipiko -- blazingly fast static HTTP server | https://bit.ly/kawipiko |\n" + "+---------------------------------------------------------------------------+\n" + @@ -384,7 +384,7 @@ var ErrorBannersData = map[uint]string { ""), - 226 : ( + 226 : []byte ( "+---------------------------------------------------------------------------+\n" + "| kawipiko -- blazingly fast static HTTP server | https://bit.ly/kawipiko |\n" + "+---------------------------------------------------------------------------+\n" + @@ -408,7 +408,7 @@ var ErrorBannersData = map[uint]string { ""), - 300 : ( + 300 : []byte ( "+---------------------------------------------------------------------------+\n" + "| kawipiko -- blazingly fast static HTTP server | https://bit.ly/kawipiko |\n" + "+---------------------------------------------------------------------------+\n" + @@ -432,7 +432,7 @@ var ErrorBannersData = map[uint]string { ""), - 301 : ( + 301 : []byte ( "+---------------------------------------------------------------------------+\n" + "| kawipiko -- blazingly fast static HTTP server | https://bit.ly/kawipiko |\n" + "+---------------------------------------------------------------------------+\n" + @@ -460,7 +460,7 @@ var ErrorBannersData = map[uint]string { ""), - 302 : ( + 302 : []byte ( "+---------------------------------------------------------------------------+\n" + "| kawipiko -- blazingly fast static HTTP server | https://bit.ly/kawipiko |\n" + "+---------------------------------------------------------------------------+\n" + @@ -484,7 +484,7 @@ var ErrorBannersData = map[uint]string { ""), - 303 : ( + 303 : []byte ( "+---------------------------------------------------------------------------+\n" + "| kawipiko -- blazingly fast static HTTP server | https://bit.ly/kawipiko |\n" + "+---------------------------------------------------------------------------+\n" + @@ -508,7 +508,7 @@ var ErrorBannersData = map[uint]string { ""), - 304 : ( + 304 : []byte ( "+---------------------------------------------------------------------------+\n" + "| kawipiko -- blazingly fast static HTTP server | https://bit.ly/kawipiko |\n" + "+---------------------------------------------------------------------------+\n" + @@ -532,7 +532,7 @@ var ErrorBannersData = map[uint]string { ""), - 305 : ( + 305 : []byte ( "+---------------------------------------------------------------------------+\n" + "| kawipiko -- blazingly fast static HTTP server | https://bit.ly/kawipiko |\n" + "+---------------------------------------------------------------------------+\n" + @@ -556,7 +556,7 @@ var ErrorBannersData = map[uint]string { ""), - 306 : ( + 306 : []byte ( "+---------------------------------------------------------------------------+\n" + "| kawipiko -- blazingly fast static HTTP server | https://bit.ly/kawipiko |\n" + "+---------------------------------------------------------------------------+\n" + @@ -580,7 +580,7 @@ var ErrorBannersData = map[uint]string { ""), - 307 : ( + 307 : []byte ( "+---------------------------------------------------------------------------+\n" + "| kawipiko -- blazingly fast static HTTP server | https://bit.ly/kawipiko |\n" + "+---------------------------------------------------------------------------+\n" + @@ -608,7 +608,7 @@ var ErrorBannersData = map[uint]string { ""), - 308 : ( + 308 : []byte ( "+---------------------------------------------------------------------------+\n" + "| kawipiko -- blazingly fast static HTTP server | https://bit.ly/kawipiko |\n" + "+---------------------------------------------------------------------------+\n" + @@ -636,7 +636,7 @@ var ErrorBannersData = map[uint]string { ""), - 400 : ( + 400 : []byte ( "+---------------------------------------------------------------------------+\n" + "| kawipiko -- blazingly fast static HTTP server | https://bit.ly/kawipiko |\n" + "+---------------------------------------------------------------------------+\n" + @@ -660,7 +660,7 @@ var ErrorBannersData = map[uint]string { ""), - 401 : ( + 401 : []byte ( "+---------------------------------------------------------------------------+\n" + "| kawipiko -- blazingly fast static HTTP server | https://bit.ly/kawipiko |\n" + "+---------------------------------------------------------------------------+\n" + @@ -684,7 +684,7 @@ var ErrorBannersData = map[uint]string { ""), - 402 : ( + 402 : []byte ( "+---------------------------------------------------------------------------+\n" + "| kawipiko -- blazingly fast static HTTP server | https://bit.ly/kawipiko |\n" + "+---------------------------------------------------------------------------+\n" + @@ -708,7 +708,7 @@ var ErrorBannersData = map[uint]string { ""), - 403 : ( + 403 : []byte ( "+---------------------------------------------------------------------------+\n" + "| kawipiko -- blazingly fast static HTTP server | https://bit.ly/kawipiko |\n" + "+---------------------------------------------------------------------------+\n" + @@ -732,7 +732,7 @@ var ErrorBannersData = map[uint]string { ""), - 404 : ( + 404 : []byte ( "+---------------------------------------------------------------------------+\n" + "| kawipiko -- blazingly fast static HTTP server | https://bit.ly/kawipiko |\n" + "+---------------------------------------------------------------------------+\n" + @@ -756,7 +756,7 @@ var ErrorBannersData = map[uint]string { ""), - 405 : ( + 405 : []byte ( "+---------------------------------------------------------------------------+\n" + "| kawipiko -- blazingly fast static HTTP server | https://bit.ly/kawipiko |\n" + "+---------------------------------------------------------------------------+\n" + @@ -784,7 +784,7 @@ var ErrorBannersData = map[uint]string { ""), - 406 : ( + 406 : []byte ( "+---------------------------------------------------------------------------+\n" + "| kawipiko -- blazingly fast static HTTP server | https://bit.ly/kawipiko |\n" + "+---------------------------------------------------------------------------+\n" + @@ -808,7 +808,7 @@ var ErrorBannersData = map[uint]string { ""), - 407 : ( + 407 : []byte ( "+---------------------------------------------------------------------------+\n" + "| kawipiko -- blazingly fast static HTTP server | https://bit.ly/kawipiko |\n" + "+---------------------------------------------------------------------------+\n" + @@ -840,7 +840,7 @@ var ErrorBannersData = map[uint]string { ""), - 408 : ( + 408 : []byte ( "+---------------------------------------------------------------------------+\n" + "| kawipiko -- blazingly fast static HTTP server | https://bit.ly/kawipiko |\n" + "+---------------------------------------------------------------------------+\n" + @@ -864,7 +864,7 @@ var ErrorBannersData = map[uint]string { ""), - 409 : ( + 409 : []byte ( "+---------------------------------------------------------------------------+\n" + "| kawipiko -- blazingly fast static HTTP server | https://bit.ly/kawipiko |\n" + "+---------------------------------------------------------------------------+\n" + @@ -888,7 +888,7 @@ var ErrorBannersData = map[uint]string { ""), - 410 : ( + 410 : []byte ( "+---------------------------------------------------------------------------+\n" + "| kawipiko -- blazingly fast static HTTP server | https://bit.ly/kawipiko |\n" + "+---------------------------------------------------------------------------+\n" + @@ -912,7 +912,7 @@ var ErrorBannersData = map[uint]string { ""), - 411 : ( + 411 : []byte ( "+---------------------------------------------------------------------------+\n" + "| kawipiko -- blazingly fast static HTTP server | https://bit.ly/kawipiko |\n" + "+---------------------------------------------------------------------------+\n" + @@ -936,7 +936,7 @@ var ErrorBannersData = map[uint]string { ""), - 412 : ( + 412 : []byte ( "+---------------------------------------------------------------------------+\n" + "| kawipiko -- blazingly fast static HTTP server | https://bit.ly/kawipiko |\n" + "+---------------------------------------------------------------------------+\n" + @@ -964,7 +964,7 @@ var ErrorBannersData = map[uint]string { ""), - 413 : ( + 413 : []byte ( "+---------------------------------------------------------------------------+\n" + "| kawipiko -- blazingly fast static HTTP server | https://bit.ly/kawipiko |\n" + "+---------------------------------------------------------------------------+\n" + @@ -992,7 +992,7 @@ var ErrorBannersData = map[uint]string { ""), - 414 : ( + 414 : []byte ( "+---------------------------------------------------------------------------+\n" + "| kawipiko -- blazingly fast static HTTP server | https://bit.ly/kawipiko |\n" + "+---------------------------------------------------------------------------+\n" + @@ -1016,7 +1016,7 @@ var ErrorBannersData = map[uint]string { ""), - 415 : ( + 415 : []byte ( "+---------------------------------------------------------------------------+\n" + "| kawipiko -- blazingly fast static HTTP server | https://bit.ly/kawipiko |\n" + "+---------------------------------------------------------------------------+\n" + @@ -1044,7 +1044,7 @@ var ErrorBannersData = map[uint]string { ""), - 416 : ( + 416 : []byte ( "+---------------------------------------------------------------------------+\n" + "| kawipiko -- blazingly fast static HTTP server | https://bit.ly/kawipiko |\n" + "+---------------------------------------------------------------------------+\n" + @@ -1072,7 +1072,7 @@ var ErrorBannersData = map[uint]string { ""), - 417 : ( + 417 : []byte ( "+---------------------------------------------------------------------------+\n" + "| kawipiko -- blazingly fast static HTTP server | https://bit.ly/kawipiko |\n" + "+---------------------------------------------------------------------------+\n" + @@ -1100,7 +1100,7 @@ var ErrorBannersData = map[uint]string { ""), - 421 : ( + 421 : []byte ( "+---------------------------------------------------------------------------+\n" + "| kawipiko -- blazingly fast static HTTP server | https://bit.ly/kawipiko |\n" + "+---------------------------------------------------------------------------+\n" + @@ -1128,7 +1128,7 @@ var ErrorBannersData = map[uint]string { ""), - 422 : ( + 422 : []byte ( "+---------------------------------------------------------------------------+\n" + "| kawipiko -- blazingly fast static HTTP server | https://bit.ly/kawipiko |\n" + "+---------------------------------------------------------------------------+\n" + @@ -1156,7 +1156,7 @@ var ErrorBannersData = map[uint]string { ""), - 423 : ( + 423 : []byte ( "+---------------------------------------------------------------------------+\n" + "| kawipiko -- blazingly fast static HTTP server | https://bit.ly/kawipiko |\n" + "+---------------------------------------------------------------------------+\n" + @@ -1180,7 +1180,7 @@ var ErrorBannersData = map[uint]string { ""), - 424 : ( + 424 : []byte ( "+---------------------------------------------------------------------------+\n" + "| kawipiko -- blazingly fast static HTTP server | https://bit.ly/kawipiko |\n" + "+---------------------------------------------------------------------------+\n" + @@ -1208,7 +1208,7 @@ var ErrorBannersData = map[uint]string { ""), - 425 : ( + 425 : []byte ( "+---------------------------------------------------------------------------+\n" + "| kawipiko -- blazingly fast static HTTP server | https://bit.ly/kawipiko |\n" + "+---------------------------------------------------------------------------+\n" + @@ -1232,7 +1232,7 @@ var ErrorBannersData = map[uint]string { ""), - 426 : ( + 426 : []byte ( "+---------------------------------------------------------------------------+\n" + "| kawipiko -- blazingly fast static HTTP server | https://bit.ly/kawipiko |\n" + "+---------------------------------------------------------------------------+\n" + @@ -1256,7 +1256,7 @@ var ErrorBannersData = map[uint]string { ""), - 428 : ( + 428 : []byte ( "+---------------------------------------------------------------------------+\n" + "| kawipiko -- blazingly fast static HTTP server | https://bit.ly/kawipiko |\n" + "+---------------------------------------------------------------------------+\n" + @@ -1284,7 +1284,7 @@ var ErrorBannersData = map[uint]string { ""), - 429 : ( + 429 : []byte ( "+---------------------------------------------------------------------------+\n" + "| kawipiko -- blazingly fast static HTTP server | https://bit.ly/kawipiko |\n" + "+---------------------------------------------------------------------------+\n" + @@ -1312,7 +1312,7 @@ var ErrorBannersData = map[uint]string { ""), - 431 : ( + 431 : []byte ( "+---------------------------------------------------------------------------+\n" + "| kawipiko -- blazingly fast static HTTP server | https://bit.ly/kawipiko |\n" + "+---------------------------------------------------------------------------+\n" + @@ -1340,7 +1340,7 @@ var ErrorBannersData = map[uint]string { ""), - 451 : ( + 451 : []byte ( "+---------------------------------------------------------------------------+\n" + "| kawipiko -- blazingly fast static HTTP server | https://bit.ly/kawipiko |\n" + "+---------------------------------------------------------------------------+\n" + @@ -1368,7 +1368,7 @@ var ErrorBannersData = map[uint]string { ""), - 500 : ( + 500 : []byte ( "+---------------------------------------------------------------------------+\n" + "| kawipiko -- blazingly fast static HTTP server | https://bit.ly/kawipiko |\n" + "+---------------------------------------------------------------------------+\n" + @@ -1396,7 +1396,7 @@ var ErrorBannersData = map[uint]string { ""), - 501 : ( + 501 : []byte ( "+---------------------------------------------------------------------------+\n" + "| kawipiko -- blazingly fast static HTTP server | https://bit.ly/kawipiko |\n" + "+---------------------------------------------------------------------------+\n" + @@ -1420,7 +1420,7 @@ var ErrorBannersData = map[uint]string { ""), - 502 : ( + 502 : []byte ( "+---------------------------------------------------------------------------+\n" + "| kawipiko -- blazingly fast static HTTP server | https://bit.ly/kawipiko |\n" + "+---------------------------------------------------------------------------+\n" + @@ -1444,7 +1444,7 @@ var ErrorBannersData = map[uint]string { ""), - 503 : ( + 503 : []byte ( "+---------------------------------------------------------------------------+\n" + "| kawipiko -- blazingly fast static HTTP server | https://bit.ly/kawipiko |\n" + "+---------------------------------------------------------------------------+\n" + @@ -1472,7 +1472,7 @@ var ErrorBannersData = map[uint]string { ""), - 504 : ( + 504 : []byte ( "+---------------------------------------------------------------------------+\n" + "| kawipiko -- blazingly fast static HTTP server | https://bit.ly/kawipiko |\n" + "+---------------------------------------------------------------------------+\n" + @@ -1496,7 +1496,7 @@ var ErrorBannersData = map[uint]string { ""), - 505 : ( + 505 : []byte ( "+---------------------------------------------------------------------------+\n" + "| kawipiko -- blazingly fast static HTTP server | https://bit.ly/kawipiko |\n" + "+---------------------------------------------------------------------------+\n" + @@ -1524,7 +1524,7 @@ var ErrorBannersData = map[uint]string { ""), - 506 : ( + 506 : []byte ( "+---------------------------------------------------------------------------+\n" + "| kawipiko -- blazingly fast static HTTP server | https://bit.ly/kawipiko |\n" + "+---------------------------------------------------------------------------+\n" + @@ -1552,7 +1552,7 @@ var ErrorBannersData = map[uint]string { ""), - 507 : ( + 507 : []byte ( "+---------------------------------------------------------------------------+\n" + "| kawipiko -- blazingly fast static HTTP server | https://bit.ly/kawipiko |\n" + "+---------------------------------------------------------------------------+\n" + @@ -1580,7 +1580,7 @@ var ErrorBannersData = map[uint]string { ""), - 508 : ( + 508 : []byte ( "+---------------------------------------------------------------------------+\n" + "| kawipiko -- blazingly fast static HTTP server | https://bit.ly/kawipiko |\n" + "+---------------------------------------------------------------------------+\n" + @@ -1604,7 +1604,7 @@ var ErrorBannersData = map[uint]string { ""), - 510 : ( + 510 : []byte ( "+---------------------------------------------------------------------------+\n" + "| kawipiko -- blazingly fast static HTTP server | https://bit.ly/kawipiko |\n" + "+---------------------------------------------------------------------------+\n" + @@ -1628,7 +1628,7 @@ var ErrorBannersData = map[uint]string { ""), - 511 : ( + 511 : []byte ( "+---------------------------------------------------------------------------+\n" + "| kawipiko -- blazingly fast static HTTP server | https://bit.ly/kawipiko |\n" + "+---------------------------------------------------------------------------+\n" +