internal/fetch: support disabling proxy fetch

Change-Id: Iedc1a7d278b100dd0f59045929dbd5a4e3bc0785
Reviewed-on: https://go-review.googlesource.com/c/pkgsite/+/278612
Trust: Jonathan Amsterdam <jba@google.com>
Run-TryBot: Jonathan Amsterdam <jba@google.com>
TryBot-Result: kokoro <noreply+kokoro@google.com>
Reviewed-by: Julie Qiu <julie@golang.org>
diff --git a/internal/fetch/fetch.go b/internal/fetch/fetch.go
index e757759..939474c 100644
--- a/internal/fetch/fetch.go
+++ b/internal/fetch/fetch.go
@@ -109,7 +109,7 @@
 // Callers of FetchModule must
 //   defer fr.Defer()
 // immediately after the call.
-func FetchModule(ctx context.Context, modulePath, requestedVersion string, proxyClient *proxy.Client, sourceClient *source.Client) (fr *FetchResult) {
+func FetchModule(ctx context.Context, modulePath, requestedVersion string, proxyClient *proxy.Client, sourceClient *source.Client, disableProxyFetch bool) (fr *FetchResult) {
 	start := time.Now()
 	fr = &FetchResult{
 		ModulePath:       modulePath,
@@ -152,7 +152,11 @@
 		}
 		fr.ResolvedVersion = resolvedVersion
 	} else {
-		info, err := proxyClient.GetInfo(ctx, modulePath, requestedVersion)
+		getInfo := proxyClient.GetInfo
+		if disableProxyFetch {
+			getInfo = proxyClient.GetInfoNoFetch
+		}
+		info, err := getInfo(ctx, modulePath, requestedVersion)
 		if err != nil {
 			fr.Error = err
 			return fr
diff --git a/internal/fetch/helper_test.go b/internal/fetch/helper_test.go
index 54a746d..a44e5af 100644
--- a/internal/fetch/helper_test.go
+++ b/internal/fetch/helper_test.go
@@ -137,7 +137,7 @@
 		Files:      mod.mod.Files,
 	}})
 	defer teardownProxy()
-	got := FetchModule(ctx, modulePath, fetchVersion, proxyClient, sourceClient)
+	got := FetchModule(ctx, modulePath, fetchVersion, proxyClient, sourceClient, false)
 	if !withLicenseDetector {
 		return got, nil
 	}
diff --git a/internal/frontend/fetch.go b/internal/frontend/fetch.go
index b85415a..0c20eae 100644
--- a/internal/frontend/fetch.go
+++ b/internal/frontend/fetch.go
@@ -523,7 +523,7 @@
 		derrors.Wrap(&err, "FetchAndUpdateState(%q, %q)", modulePath, requestedVersion)
 	}()
 
-	fr := fetch.FetchModule(ctx, modulePath, requestedVersion, proxyClient, sourceClient)
+	fr := fetch.FetchModule(ctx, modulePath, requestedVersion, proxyClient, sourceClient, false)
 	defer fr.Defer()
 	if fr.Error == nil {
 		// Only attempt to insert the module into module_version_states if the
diff --git a/internal/proxydatasource/datasource.go b/internal/proxydatasource/datasource.go
index 17b2dcc..6e9a3ed 100644
--- a/internal/proxydatasource/datasource.go
+++ b/internal/proxydatasource/datasource.go
@@ -87,7 +87,7 @@
 	if e, ok := ds.versionCache[key]; ok {
 		return e.module, e.err
 	}
-	res := fetch.FetchModule(ctx, modulePath, version, ds.proxyClient, ds.sourceClient)
+	res := fetch.FetchModule(ctx, modulePath, version, ds.proxyClient, ds.sourceClient, false)
 	defer res.Defer()
 	m := res.Module
 	if m != nil {
diff --git a/internal/testing/integration/frontend_test.go b/internal/testing/integration/frontend_test.go
index aba8b4d..78b4903 100644
--- a/internal/testing/integration/frontend_test.go
+++ b/internal/testing/integration/frontend_test.go
@@ -96,7 +96,7 @@
 
 func fetchAndInsertModule(ctx context.Context, t *testing.T, tm *proxy.Module, proxyClient *proxy.Client) {
 	sourceClient := source.NewClient(1 * time.Second)
-	res := fetch.FetchModule(ctx, tm.ModulePath, tm.Version, proxyClient, sourceClient)
+	res := fetch.FetchModule(ctx, tm.ModulePath, tm.Version, proxyClient, sourceClient, false)
 	defer res.Defer()
 	if res.Error != nil {
 		t.Fatal(res.Error)
diff --git a/internal/worker/fetch.go b/internal/worker/fetch.go
index f42bf1a..5861831 100644
--- a/internal/worker/fetch.go
+++ b/internal/worker/fetch.go
@@ -154,7 +154,7 @@
 	}
 
 	start := time.Now()
-	fr := fetch.FetchModule(ctx, modulePath, requestedVersion, proxyClient, sourceClient)
+	fr := fetch.FetchModule(ctx, modulePath, requestedVersion, proxyClient, sourceClient, false)
 	if fr == nil {
 		panic("fetch.FetchModule should never return a nil FetchResult")
 	}