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/gemini/error.go

96 lines
3.4 KiB
Go

package gemini
import (
"gophi/core"
"github.com/grufwub/go-errors"
)
// Gemini specific base errors
var (
errInvalidScheme = errors.BaseError("invalid request scheme")
errProxyRequest = errors.BaseError("host:port pair differ from our own")
)
// Gemini status codes
var (
statusInput = "10"
statusSensitive = "11"
statusTemporaryRedirect = "30"
statusPermanentRedirect = "31"
statusTemporaryFailure = "40"
statusServerUnavailable = "41"
statusCGIError = "42"
statusProxyError = "43"
statusSlowDown = "44"
statusPermanentFailure = "50"
statusNotFound = "51"
statusGone = "52"
statusProxyRequestRefused = "53"
statusBadRequest = "59"
statusClientCertificateRequired = "60"
statusClientCertificateNotAuthorized = "61"
statusCertificateNotValid = "62"
)
// Gemini error responses
var (
// more specific respnoses
errConnReadRsp = buildResponseHeader(statusTemporaryFailure, "Read Failure")
errRestrictedRsp = buildResponseHeader(statusNotFound, "Restricted Path")
errInvalidSchemeRsp = buildResponseHeader(statusProxyRequestRefused, "Unsupported Scheme")
errProxyRequestRsp = buildResponseHeader(statusProxyRequestRefused, "Proxying Unsupported")
// generic responses
errNotFoundRsp = buildResponseHeader(statusNotFound, "Not Found")
errTemporaryFailureRsp = buildResponseHeader(statusTemporaryFailure, "Temporary Failure")
errPermanentFailureRsp = buildResponseHeader(statusPermanentFailure, "Permanent Failure")
errBadRequestRsp = buildResponseHeader(statusBadRequest, "Bad Request")
)
// 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 errConnReadRsp, 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 errTemporaryFailureRsp, true
case errors.Is(err, core.ErrMutexDowngrade):
return errTemporaryFailureRsp, 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 errRestrictedRsp, true
case errors.Is(err, core.ErrInvalidRequest):
return errBadRequestRsp, true
case errors.Is(err, core.ErrParsingScheme):
return errBadRequestRsp, true
case errors.Is(err, core.ErrParsingHost):
return errBadRequestRsp, true
case errors.Is(err, core.ErrParsingURI):
return errBadRequestRsp, true
case errors.Is(err, core.ErrCGIStart):
return errPermanentFailureRsp, true
case errors.Is(err, core.ErrCGIExitCode):
return errTemporaryFailureRsp, true
case errors.Is(err, errInvalidScheme):
return errInvalidSchemeRsp, true
case errors.Is(err, errProxyRequest):
return errProxyRequestRsp, true
default:
return nil, false
}
}