You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
gophi/gopher/error.go

85 lines
3.0 KiB
Go

package gopher
import (
"gophi/core"
"github.com/grufwub/go-errors"
)
// Gopher specific errors
var (
errInvalidGophermap = errors.BaseError("invalid gophermap")
errSubgophermapIsDir = errors.BaseError("subgophermap path is dir")
errSubgophermapSize = errors.BaseError("subgophermap size too large")
)
// Gopher response error text
const (
statusBadRequest = "400 Bad Request"
statusUnauthorized = "401 Unauthorised"
statusForbidden = "403 Forbidden"
statusNotFound = "404 Not Found"
statusRequestTimeout = "408 Request Time-out"
statusGone = "410 Gone"
statusInternalServerError = "500 Internal Server Error"
statusNotImplemented = "501 Not Implemented"
statusServiceUnavailable = "503 Service Unavailable"
)
// Gopher error responses
var (
errBadRequestRsp = buildErrorLine(statusBadRequest)
errUnauthorizedRsp = buildErrorLine(statusUnauthorized)
errForbiddenRsp = buildErrorLine(statusForbidden)
errNotFoundRsp = buildErrorLine(statusNotFound)
errRequestTimeoutRsp = buildErrorLine(statusRequestTimeout)
errGoneRsp = buildErrorLine(statusGone)
errInternalServerErrorRsp = buildErrorLine(statusInternalServerError)
errNotImplementedRsp = buildErrorLine(statusNotImplemented)
errServiceUnavailableRsp = buildErrorLine(statusServiceUnavailable)
)
// generateErrorResponse takes an error code and generates an error response byte slice
func generateErrorResponse(err error) ([]byte, bool) {
switch {
case errors.Is(err, core.ErrConnWrite):
return nil, false // no point responding if we couldn't write
case errors.Is(err, core.ErrConnRead):
return errServiceUnavailableRsp, true
case errors.Is(err, core.ErrConnClose):
return nil, false // no point responding if we couldn't close
case errors.Is(err, core.ErrMutexUpgrade):
return errServiceUnavailableRsp, true
case errors.Is(err, core.ErrMutexDowngrade):
return errServiceUnavailableRsp, true
case errors.Is(err, core.ErrFileOpen):
return errNotFoundRsp, true
case errors.Is(err, core.ErrFileStat):
return errNotFoundRsp, true
case errors.Is(err, core.ErrFileRead):
return errNotFoundRsp, true
case errors.Is(err, core.ErrFileType):
return errNotFoundRsp, true
case errors.Is(err, core.ErrDirectoryRead):
return errNotFoundRsp, true
case errors.Is(err, core.ErrRestrictedPath):
return errForbiddenRsp, true
case errors.Is(err, core.ErrInvalidRequest):
return errBadRequestRsp, true
case errors.Is(err, core.ErrParsingScheme):
return errBadRequestRsp, true
case errors.Is(err, core.ErrCGIStart):
return errInternalServerErrorRsp, true
case errors.Is(err, core.ErrCGIExitCode):
return errServiceUnavailableRsp, true
case errors.Is(err, errInvalidGophermap):
return errInternalServerErrorRsp, true
case errors.Is(err, errSubgophermapIsDir):
return errInternalServerErrorRsp, true
case errors.Is(err, errSubgophermapSize):
return errInternalServerErrorRsp, true
default:
return nil, false
}
}