From 8dd38fd182e7976ff6e206d80f9d5f3784d5af6d Mon Sep 17 00:00:00 2001 From: Quentin McGaw Date: Tue, 29 Dec 2020 00:56:51 +0000 Subject: [PATCH] Code maintenance: better JSON decoding for HTTP --- internal/provider/piav4.go | 22 ++++++++-------------- internal/server/handlerv1.go | 8 ++------ internal/version/github.go | 15 ++++----------- 3 files changed, 14 insertions(+), 31 deletions(-) diff --git a/internal/provider/piav4.go b/internal/provider/piav4.go index b207e97e..cb004a7b 100644 --- a/internal/provider/piav4.go +++ b/internal/provider/piav4.go @@ -469,19 +469,18 @@ func fetchPIAToken(ctx context.Context, openFile os.OpenFileFunc, return "", err } defer response.Body.Close() - b, err := ioutil.ReadAll(response.Body) if response.StatusCode != http.StatusOK { + b, _ := ioutil.ReadAll(response.Body) shortenMessage := string(b) shortenMessage = strings.ReplaceAll(shortenMessage, "\n", "") shortenMessage = strings.ReplaceAll(shortenMessage, " ", " ") return "", fmt.Errorf("%s: response received: %q", response.Status, shortenMessage) - } else if err != nil { - return "", err } + decoder := json.NewDecoder(response.Body) var result struct { Token string `json:"token"` } - if err := json.Unmarshal(b, &result); err != nil { + if err := decoder.Decode(&result); err != nil { return "", err } else if len(result.Token) == 0 { return "", fmt.Errorf("token is empty") @@ -534,16 +533,13 @@ func fetchPIAPortForwardData(ctx context.Context, client *http.Client, gateway n if response.StatusCode != http.StatusOK { return 0, "", expiration, fmt.Errorf("cannot obtain signature: %s", response.Status) } - b, err := ioutil.ReadAll(response.Body) - if err != nil { - return 0, "", expiration, fmt.Errorf("cannot obtain signature: %w", err) - } + decoder := json.NewDecoder(response.Body) var data struct { Status string `json:"status"` Payload string `json:"payload"` Signature string `json:"signature"` } - if err := json.Unmarshal(b, &data); err != nil { + if err := decoder.Decode(&data); err != nil { return 0, "", expiration, fmt.Errorf("cannot decode received data: %w", err) } else if data.Status != "OK" { return 0, "", expiration, fmt.Errorf("response received from PIA has status %s", data.Status) @@ -580,15 +576,13 @@ func bindPIAPort(ctx context.Context, client *http.Client, gateway net.IP, data if response.StatusCode != http.StatusOK { return fmt.Errorf("cannot bind port: %s", response.Status) } - b, err := ioutil.ReadAll(response.Body) - if err != nil { - return fmt.Errorf("cannot bind port: %w", err) - } + + decoder := json.NewDecoder(response.Body) var responseData struct { Status string `json:"status"` Message string `json:"message"` } - if err := json.Unmarshal(b, &responseData); err != nil { + if err := decoder.Decode(&responseData); err != nil { return fmt.Errorf("cannot bind port: %w", err) } else if responseData.Status != "OK" { return fmt.Errorf("response received from PIA: %s (%s)", responseData.Status, responseData.Message) diff --git a/internal/server/handlerv1.go b/internal/server/handlerv1.go index 8ec53c2a..8663f37a 100644 --- a/internal/server/handlerv1.go +++ b/internal/server/handlerv1.go @@ -50,13 +50,9 @@ func (h *handlerV1) ServeHTTP(w http.ResponseWriter, r *http.Request) { } func (h *handlerV1) getVersion(w http.ResponseWriter) { - data, err := json.Marshal(h.buildInfo) - if err != nil { + encoder := json.NewEncoder(w) + if err := encoder.Encode(h.buildInfo); err != nil { h.logger.Warn(err) w.WriteHeader(http.StatusInternalServerError) - return - } - if _, err := w.Write(data); err != nil { - h.logger.Warn(err) } } diff --git a/internal/version/github.go b/internal/version/github.go index 0e0255a5..3930ea78 100644 --- a/internal/version/github.go +++ b/internal/version/github.go @@ -3,7 +3,6 @@ package version import ( "context" "encoding/json" - "io/ioutil" "net/http" "time" ) @@ -35,11 +34,8 @@ func getGithubReleases(ctx context.Context, client *http.Client) (releases []git return nil, err } defer response.Body.Close() - b, err := ioutil.ReadAll(response.Body) - if err != nil { - return nil, err - } - if err := json.Unmarshal(b, &releases); err != nil { + decoder := json.NewDecoder(response.Body) + if err := decoder.Decode(&releases); err != nil { return nil, err } return releases, nil @@ -56,11 +52,8 @@ func getGithubCommits(ctx context.Context, client *http.Client) (commits []githu return nil, err } defer response.Body.Close() - b, err := ioutil.ReadAll(response.Body) - if err != nil { - return nil, err - } - if err := json.Unmarshal(b, &commits); err != nil { + decoder := json.NewDecoder(response.Body) + if err := decoder.Decode(&commits); err != nil { return nil, err } return commits, nil