Improvements in error handling & descriptions
This commit is contained in:
@@ -20,21 +20,29 @@ func (e *GeminiError) Error() string {
|
||||
return fmt.Sprintf("gemini error: code %d %s", e.Code, e.Msg)
|
||||
}
|
||||
|
||||
// NewGeminiError creates a new GeminiError based on the status code and header.
|
||||
// Status codes are based on the Gemini protocol specification:
|
||||
// - 1x: Input required
|
||||
// - 2x: Success (not handled as errors)
|
||||
// - 3x: Redirect
|
||||
// - 4x: Temporary failure
|
||||
// - 5x: Permanent failure
|
||||
// - 6x: Client certificate required/rejected
|
||||
func NewGeminiError(code int, header string) error {
|
||||
var msg string
|
||||
switch {
|
||||
case code >= 10 && code < 20:
|
||||
msg = "needs input"
|
||||
msg = fmt.Sprintf("input required: %s", header)
|
||||
case code >= 30 && code < 40:
|
||||
msg = "redirect"
|
||||
msg = fmt.Sprintf("redirect: %s", header)
|
||||
case code >= 40 && code < 50:
|
||||
msg = "bad request"
|
||||
msg = fmt.Sprintf("request failed: %s", header)
|
||||
case code >= 50 && code < 60:
|
||||
msg = "server error"
|
||||
msg = fmt.Sprintf("server error: %s", header)
|
||||
case code >= 60 && code < 70:
|
||||
msg = "TLS error"
|
||||
msg = fmt.Sprintf("TLS error: %s", header)
|
||||
default:
|
||||
msg = "unexpected Status code"
|
||||
msg = fmt.Sprintf("unexpected status code %d: %s", code, header)
|
||||
}
|
||||
return &GeminiError{
|
||||
Msg: msg,
|
||||
@@ -43,6 +51,7 @@ func NewGeminiError(code int, header string) error {
|
||||
}
|
||||
}
|
||||
|
||||
// IsGeminiError checks if the given error is a GeminiError.
|
||||
func IsGeminiError(err error) bool {
|
||||
if err == nil {
|
||||
return false
|
||||
|
||||
Reference in New Issue
Block a user