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.
96 lines
3.4 KiB
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
|
|
}
|
|
}
|