internal/proxydatasource: cache fetching errors

Update getModule to correctly cache fetching errors.

Don't cache context cancellation errors, to give the server a chance to
retry fetching a module if sudden interrupts occur.

Fixes golang/go#42886

Change-Id: I0fdcbcbb3c899c90dff745a69703a401981b98a7
Reviewed-on: https://go-review.googlesource.com/c/pkgsite/+/274152
Reviewed-by: Julie Qiu <julie@golang.org>
Reviewed-by: Jonathan Amsterdam <jba@google.com>
Trust: Julie Qiu <julie@golang.org>
Run-TryBot: Julie Qiu <julie@golang.org>
diff --git a/internal/proxydatasource/datasource.go b/internal/proxydatasource/datasource.go
index 767820a..65097e7 100644
--- a/internal/proxydatasource/datasource.go
+++ b/internal/proxydatasource/datasource.go
@@ -99,10 +99,14 @@
 			m.RemoveNonRedistributableData()
 		}
 	}
-	ds.versionCache[key] = &versionEntry{module: m, err: err}
+
 	if res.Error != nil {
+		if !errors.Is(ctx.Err(), context.Canceled) {
+			ds.versionCache[key] = &versionEntry{module: m, err: res.Error}
+		}
 		return nil, res.Error
 	}
+	ds.versionCache[key] = &versionEntry{module: m, err: err}
 
 	// Since we hold the lock and missed the cache, we can assume that we have
 	// never seen this module version. Therefore the following insert-and-sort