diff options
| author | jwijenbergh <jeroenwijenbergh@protonmail.com> | 2022-03-11 13:52:49 +0100 |
|---|---|---|
| committer | jwijenbergh <jeroenwijenbergh@protonmail.com> | 2022-04-05 12:26:14 +0200 |
| commit | a019e95fdbaea3d7af2d8ad10903fd656bfc4466 (patch) | |
| tree | 4e852e36da327823a02678dfb766aca58fa0a23f /src/server.go | |
| parent | 5065de4cff907b70ea3446888a7bad243744a8ab (diff) | |
Refactor: Simplify errors for wrapping
Diffstat (limited to 'src/server.go')
| -rw-r--r-- | src/server.go | 108 |
1 files changed, 56 insertions, 52 deletions
diff --git a/src/server.go b/src/server.go index e878a08..ca130d0 100644 --- a/src/server.go +++ b/src/server.go @@ -10,40 +10,69 @@ func getFileUrl(url string) ([]byte, error) { // Do a Get request to the specified url resp, reqErr := http.Get(url) if reqErr != nil { - return nil, detailedVPNError{errRequestFileError, fmt.Sprintf("request failed for file url %s", url), reqErr} + return nil, &HTTPResourceError{URL: url, Err: reqErr} } // Close the response body at the end defer resp.Body.Close() // Check if http response code is ok if resp.StatusCode != http.StatusOK { - return nil, detailedVPNError{errRequestFileHTTPError, fmt.Sprintf("http status not ok for file url %s", url), nil} + return nil, &HTTPStatusError{URL: url, Status: resp.StatusCode} } // Read the body body, readErr := ioutil.ReadAll(resp.Body) if readErr != nil { - return nil, detailedVPNError{errRequestFileReadError, fmt.Sprintf("error reading body from file url %s", url), readErr} + return nil, &HTTPReadError{URL: url, Err: readErr} } return body, nil } +type DiscoFileError struct { + URL string + Err error +} + +func (e *DiscoFileError) Error() string { + return fmt.Sprintf("failed obtaining disco file %s with error %v", e.URL, e.Err) +} + +type DiscoSigFileError struct { + URL string + Err error +} + +func (e *DiscoSigFileError) Error() string { + return fmt.Sprintf("failed obtaining disco signature file %s with error %v", e.URL, e.Err) +} + +type DiscoVerifyError struct { + File string + Sigfile string + Err error +} + +func (e *DiscoVerifyError) Error() string { + return fmt.Sprintf("failed verifying file %s with signature %s due to error %v", e.File, e.Sigfile, e.Err) +} + // Helper function that gets a disco json -// TODO: Verify signature func getDiscoFile(jsonFile string) (string, error) { // Get json data - fileUrl := "https://disco.eduvpn.org/v2/" + jsonFile - fileBody, error := getFileUrl(fileUrl) + discoURL := "https://disco.eduvpn.org/v2/" + fileURL := discoURL + jsonFile + fileBody, fileErr := getFileUrl(fileURL) - if error != nil { - return "", error + if fileErr != nil { + return "", &DiscoFileError{fileURL, fileErr} } // Get signature - sigUrl := fileUrl + ".minisig" - sigBody, error := getFileUrl(sigUrl) + sigFile := jsonFile + ".minisig" + sigURL := discoURL + sigFile + sigBody, sigFileErr := getFileUrl(sigURL) - if error != nil { - return "", error + if sigFileErr != nil { + return "", &DiscoSigFileError{URL: sigURL, Err: sigFileErr} } // Verify signature @@ -54,62 +83,37 @@ func getDiscoFile(jsonFile string) (string, error) { verifySuccess, verifyErr := Verify(string(sigBody), fileBody, jsonFile, previousSigTime, forcePrehash) if !verifySuccess || verifyErr != nil { - return "", detailedVPNError{errVerifySigError, "Signature is not valid", verifyErr} + return "", &DiscoVerifyError{File: jsonFile, Sigfile: sigFile, Err: verifyErr} } return string(fileBody), nil } +type GetListError struct { + File string + Err error +} + +func (e *GetListError) Error() string { + return fmt.Sprintf("failed getting disco list file %s with error %v", e.File, e.Err) +} + // Get the organization list func GetOrganizationsList() (string, error) { - body, err := getDiscoFile("organization_list.json") + file := "organization_list.json" + body, err := getDiscoFile(file) if err != nil { - return "", err.(detailedRequestError).ToRequestError() + return "", &GetListError{File: file, Err: err} } return body, nil } // Get the server list func GetServersList() (string, error) { + file := "server_list.json" body, err := getDiscoFile("server_list.json") if err != nil { - return "", err.(detailedRequestError).ToRequestError() + return "", &GetListError{File: file, Err: err} } return body, nil } - -// RequestErrorCode Simplified error code for public interface. -type RequestErrorCode = VPNErrorCode -type RequestError = VPNError - -// detailedRequestErrorCode used for unit tests. -type detailedRequestErrorCode = detailedVPNErrorCode -type detailedRequestError = detailedVPNError - -const ( - ErrRequestFileError RequestErrorCode = iota + 1 - ErrVerifySigError -) - -const ( - errRequestFileError detailedRequestErrorCode = iota + 1 - errRequestFileHTTPError - errRequestFileReadError - errVerifySigError -) - -func (err detailedRequestError) ToRequestError() RequestError { - return RequestError{err.Code.ToRequestErrorCode(), err} -} - -func (code detailedRequestErrorCode) ToRequestErrorCode() RequestErrorCode { - switch code { - case errRequestFileError: - case errRequestFileReadError: - case errRequestFileHTTPError: - return ErrRequestFileError - case errVerifySigError: - return ErrVerifySigError - } - panic("invalid detailedRequestErrorCode") -} |
