Merge pull request #50 from xenolf/better-challenge-errors

Better challenge errors
This commit is contained in:
xenolf 2015-12-12 20:44:19 +01:00
commit bf740fa2ca
5 changed files with 47 additions and 16 deletions

View file

@ -4,6 +4,7 @@ import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"net/http" "net/http"
"strings"
) )
const ( const (
@ -28,6 +29,27 @@ type TOSError struct {
RemoteError RemoteError
} }
type domainError struct {
Domain string
Error error
}
type challengeError struct {
RemoteError
records []validationRecord
}
func (c challengeError) Error() string {
var errStr string
for _, validation := range c.records {
errStr = errStr + fmt.Sprintf("\tValidation for %s:%s\n\tResolved to:\n\t\t%s\n\tUsed: %s\n\n",
validation.Hostname, validation.Port, strings.Join(validation.ResolvedAddresses, "\n\t\t"), validation.UsedAddress)
}
return fmt.Sprintf("%s\nError Detail:\n%s", c.RemoteError.Error(), errStr)
}
func handleHTTPError(resp *http.Response) error { func handleHTTPError(resp *http.Response) error {
var errorDetail RemoteError var errorDetail RemoteError
decoder := json.NewDecoder(resp.Body) decoder := json.NewDecoder(resp.Body)
@ -46,7 +68,6 @@ func handleHTTPError(resp *http.Response) error {
return errorDetail return errorDetail
} }
type domainError struct { func handleChallengeError(chlng challenge) error {
Domain string return challengeError{chlng.Error, chlng.ValidationRecords}
Error error
} }

View file

@ -80,7 +80,7 @@ Loop:
case "pending": case "pending":
break break
case "invalid": case "invalid":
return errors.New("The server could not validate our request.") return handleChallengeError(challengeResponse)
default: default:
return errors.New("The server returned an unexpected state.") return errors.New("The server returned an unexpected state.")
} }

View file

@ -161,7 +161,7 @@ func TestHTTPInvalidServerState(t *testing.T) {
if err := solver.Solve(clientChallenge, "127.0.0.1"); err == nil { if err := solver.Solve(clientChallenge, "127.0.0.1"); err == nil {
t.Error("UNEXPECTED: Expected Solve to return an error but the error was nil.") t.Error("UNEXPECTED: Expected Solve to return an error but the error was nil.")
} else { } else {
expectedError := "The server could not validate our request." expectedError := "acme: Error 0 - - \nError Detail:\n"
if err.Error() != expectedError { if err.Error() != expectedError {
t.Errorf("Expected error |%s| but instead got |%s|", expectedError, err.Error()) t.Errorf("Expected error |%s| but instead got |%s|", expectedError, err.Error())
} }

View file

@ -72,6 +72,14 @@ type identifier struct {
Value string `json:"value"` Value string `json:"value"`
} }
type validationRecord struct {
URI string `json:"url,omitempty"`
Hostname string `json:"hostname,omitempty"`
Port string `json:"port,omitempty"`
ResolvedAddresses []string `json:"addressesResolved,omitempty"`
UsedAddress string `json:"addressUsed,omitempty"`
}
type challenge struct { type challenge struct {
Resource string `json:"resource,omitempty"` Resource string `json:"resource,omitempty"`
Type string `json:"type,omitempty"` Type string `json:"type,omitempty"`
@ -81,6 +89,8 @@ type challenge struct {
KeyAuthorization string `json:"keyAuthorization,omitempty"` KeyAuthorization string `json:"keyAuthorization,omitempty"`
TLS bool `json:"tls,omitempty"` TLS bool `json:"tls,omitempty"`
Iterations int `json:"n,omitempty"` Iterations int `json:"n,omitempty"`
Error RemoteError `json:"error,omitempty"`
ValidationRecords []validationRecord `json:"validationRecord,omitempty"`
} }
type csrMessage struct { type csrMessage struct {

View file

@ -90,7 +90,7 @@ Loop:
case "pending": case "pending":
break break
case "invalid": case "invalid":
return errors.New("The server could not validate our request.") return handleChallengeError(challengeResponse)
default: default:
return errors.New("The server returned an unexpected state.") return errors.New("The server returned an unexpected state.")
} }