[pkgsite] internal/index: check HTTP status in GetVersions

1 view
Skip to first unread message

race quite (Gerrit)

unread,
Aug 9, 2026, 2:55:48 PM (15 hours ago) Aug 9
to goph...@pubsubhelper.golang.org, golang-co...@googlegroups.com

race quite has uploaded the change for review

Commit message

internal/index: check HTTP status in GetVersions

GetVersions currently attempts to decode the response body without
checking the HTTP status. As a result, an empty error response is
treated as a successful response with no new module versions.

Return an error for non-200 responses before decoding the response
body. Include a limited portion of the response body in the error to
help diagnose failures.
Change-Id: I28640b004cd7280f0f91327aee58a663092ad056

Change diff

diff --git a/internal/index/index.go b/internal/index/index.go
index 33a408c..e3c7de8 100644
--- a/internal/index/index.go
+++ b/internal/index/index.go
@@ -9,6 +9,7 @@
"context"
"encoding/json"
"fmt"
+ "io"
"net/http"
"net/url"
"strconv"
@@ -60,6 +61,14 @@
return nil, fmt.Errorf("ctxhttp.Get(ctx, nil, %q): %v", u, err)
}
defer r.Body.Close()
+ if r.StatusCode != http.StatusOK {
+ body, _ := io.ReadAll(io.LimitReader(r.Body, 4<<10))
+ bodyText := strings.TrimSpace(string(body))
+ if bodyText == "" {
+ return nil, fmt.Errorf("module index returned %s", r.Status)
+ }
+ return nil, fmt.Errorf("module index returned %s: %s", r.Status, bodyText)
+ }

var versions []*internal.IndexVersion
dec := json.NewDecoder(r.Body)
diff --git a/internal/index/index_test.go b/internal/index/index_test.go
index ae8d777..23fb6cb 100644
--- a/internal/index/index_test.go
+++ b/internal/index/index_test.go
@@ -6,6 +6,10 @@

import (
"context"
+ "fmt"
+ "net/http"
+ "net/http/httptest"
+ "strings"
"testing"
"time"

@@ -59,3 +63,52 @@
})
}
}
+
+func TestGetVersionsHTTPStatus(t *testing.T) {
+ for _, test := range []struct {
+ name string
+ statusCode int
+ body string
+ wantErr string
+ }{
+ {
+ name: "500 empty body",
+ statusCode: http.StatusInternalServerError,
+ wantErr: "module index returned 500 Internal Server Error",
+ },
+ {
+ name: "500 text body",
+ statusCode: http.StatusInternalServerError,
+ body: "backend unavailable",
+ wantErr: "module index returned 500 Internal Server Error: backend unavailable",
+ },
+ {
+ name: "500 valid NDJSON body",
+ statusCode: http.StatusInternalServerError,
+ body: `{"Path":"example.com/mod","Version":"v1.0.0"}`,
+ wantErr: "module index returned 500 Internal Server Error",
+ },
+ {
+ name: "429",
+ statusCode: http.StatusTooManyRequests,
+ wantErr: "module index returned 429 Too Many Requests",
+ },
+ } {
+ t.Run(test.name, func(t *testing.T) {
+ server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ w.WriteHeader(test.statusCode)
+ fmt.Fprint(w, test.body)
+ }))
+ defer server.Close()
+
+ client, err := New(server.URL)
+ if err != nil {
+ t.Fatal(err)
+ }
+ _, err = client.GetVersions(context.Background(), time.Time{}, 10)
+ if err == nil || !strings.Contains(err.Error(), test.wantErr) {
+ t.Fatalf("client.GetVersions() error = %v, want error containing %q", err, test.wantErr)
+ }
+ })
+ }
+}

Change information

Files:
  • M internal/index/index.go
  • M internal/index/index_test.go
Change size: M
Delta: 2 files changed, 62 insertions(+), 0 deletions(-)
Open in Gerrit

Related details

Attention set is empty
Submit Requirements:
  • requirement is not satisfiedCode-Review
  • requirement satisfiedNo-Unresolved-Comments
  • requirement is not satisfiedReview-Enforcement
  • requirement is not satisfiedTryBots-Pass
  • requirement is not satisfiedkokoro-CI-Passes
Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
Gerrit-MessageType: newchange
Gerrit-Project: pkgsite
Gerrit-Branch: master
Gerrit-Change-Id: I28640b004cd7280f0f91327aee58a663092ad056
Gerrit-Change-Number: 812500
Gerrit-PatchSet: 1
Gerrit-Owner: race quite <quit...@gmail.com>
unsatisfied_requirement
satisfied_requirement
open
diffy

Emmanuel Odeke (Gerrit)

unread,
1:06 AM (5 hours ago) 1:06 AM
to race quite, goph...@pubsubhelper.golang.org, Dmitri Shuralyov, Damien Neil, golang-co...@googlegroups.com
Attention needed from Damien Neil, Dmitri Shuralyov and race quite

Emmanuel Odeke voted Commit-Queue+1

Commit-Queue+1
Open in Gerrit

Related details

Attention is currently required from:
  • Damien Neil
  • Dmitri Shuralyov
  • race quite
Submit Requirements:
  • requirement is not satisfiedCode-Review
  • requirement satisfiedNo-Unresolved-Comments
  • requirement is not satisfiedReview-Enforcement
  • requirement is not satisfiedTryBots-Pass
  • requirement is not satisfiedkokoro-CI-Passes
Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
Gerrit-MessageType: comment
Gerrit-Project: pkgsite
Gerrit-Branch: master
Gerrit-Change-Id: I28640b004cd7280f0f91327aee58a663092ad056
Gerrit-Change-Number: 812500
Gerrit-PatchSet: 1
Gerrit-Owner: race quite <quit...@gmail.com>
Gerrit-Reviewer: Damien Neil <dn...@google.com>
Gerrit-Reviewer: Dmitri Shuralyov <dmit...@golang.org>
Gerrit-Reviewer: Emmanuel Odeke <emma...@orijtech.com>
Gerrit-Attention: Dmitri Shuralyov <dmit...@golang.org>
Gerrit-Attention: race quite <quit...@gmail.com>
Gerrit-Attention: Damien Neil <dn...@google.com>
Gerrit-Comment-Date: Mon, 10 Aug 2026 05:06:12 +0000
Gerrit-HasComments: No
Gerrit-Has-Labels: Yes
unsatisfied_requirement
satisfied_requirement
open
diffy

kokoro (Gerrit)

unread,
1:36 AM (4 hours ago) 1:36 AM
to race quite, goph...@pubsubhelper.golang.org, golang...@luci-project-accounts.iam.gserviceaccount.com, Dmitri Shuralyov, Damien Neil, Emmanuel Odeke, golang-co...@googlegroups.com
Attention needed from Damien Neil, Dmitri Shuralyov and race quite

kokoro voted kokoro-CI+1

Kokoro presubmit build finished with status: SUCCESS
Logs at: https://source.cloud.google.com/results/invocations/8e741a66-9cf3-4062-b447-cdb4b891a672

kokoro-CI+1
Open in Gerrit

Related details

Attention is currently required from:
  • Damien Neil
  • Dmitri Shuralyov
  • race quite
Submit Requirements:
    • requirement is not satisfiedCode-Review
    • requirement satisfiedNo-Unresolved-Comments
    • requirement is not satisfiedReview-Enforcement
    • requirement satisfiedTryBots-Pass
    • requirement satisfiedkokoro-CI-Passes
    Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
    Gerrit-MessageType: comment
    Gerrit-Project: pkgsite
    Gerrit-Branch: master
    Gerrit-Change-Id: I28640b004cd7280f0f91327aee58a663092ad056
    Gerrit-Change-Number: 812500
    Gerrit-PatchSet: 1
    Gerrit-Owner: race quite <quit...@gmail.com>
    Gerrit-Reviewer: Damien Neil <dn...@google.com>
    Gerrit-Reviewer: Dmitri Shuralyov <dmit...@golang.org>
    Gerrit-Reviewer: Emmanuel Odeke <emma...@orijtech.com>
    Gerrit-Attention: Dmitri Shuralyov <dmit...@golang.org>
    Gerrit-Attention: race quite <quit...@gmail.com>
    Gerrit-Attention: Damien Neil <dn...@google.com>
    Gerrit-Comment-Date: Mon, 10 Aug 2026 05:36:37 +0000
    Gerrit-HasComments: No
    Gerrit-Has-Labels: Yes
    unsatisfied_requirement
    satisfied_requirement
    open
    diffy
    Reply all
    Reply to author
    Forward
    0 new messages