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.
85 lines
3.0 KiB
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
|
|
}
|
|
}
|