summaryrefslogtreecommitdiff
path: root/libgo/go/cmd/go/internal/web/http.go
diff options
context:
space:
mode:
Diffstat (limited to 'libgo/go/cmd/go/internal/web/http.go')
-rw-r--r--libgo/go/cmd/go/internal/web/http.go29
1 files changed, 23 insertions, 6 deletions
diff --git a/libgo/go/cmd/go/internal/web/http.go b/libgo/go/cmd/go/internal/web/http.go
index b790fe9916e..5e4319b00e9 100644
--- a/libgo/go/cmd/go/internal/web/http.go
+++ b/libgo/go/cmd/go/internal/web/http.go
@@ -14,7 +14,7 @@ package web
import (
"crypto/tls"
"fmt"
- "io/ioutil"
+ "mime"
"net/http"
urlpkg "net/url"
"os"
@@ -64,7 +64,7 @@ func get(security SecurityMode, url *urlpkg.URL) (*Response, error) {
Status: "404 testing",
StatusCode: 404,
Header: make(map[string][]string),
- Body: ioutil.NopCloser(strings.NewReader("")),
+ Body: http.NoBody,
}
if cfg.BuildX {
fmt.Fprintf(os.Stderr, "# get %s: %v (%.3fs)\n", Redacted(url), res.Status, time.Since(start).Seconds())
@@ -111,7 +111,7 @@ func get(security SecurityMode, url *urlpkg.URL) (*Response, error) {
fetched, res, err = fetch(secure)
if err != nil {
if cfg.BuildX {
- fmt.Fprintf(os.Stderr, "# get %s: %v\n", Redacted(url), err)
+ fmt.Fprintf(os.Stderr, "# get %s: %v\n", Redacted(secure), err)
}
if security != Insecure || url.Scheme == "https" {
// HTTPS failed, and we can't fall back to plain HTTP.
@@ -146,7 +146,7 @@ func get(security SecurityMode, url *urlpkg.URL) (*Response, error) {
insecure.Scheme = "http"
if insecure.User != nil && security != Insecure {
if cfg.BuildX {
- fmt.Fprintf(os.Stderr, "# get %s: insecure credentials\n", Redacted(url))
+ fmt.Fprintf(os.Stderr, "# get %s: insecure credentials\n", Redacted(insecure))
}
return nil, fmt.Errorf("refusing to pass credentials to insecure URL: %s", Redacted(insecure))
}
@@ -154,7 +154,7 @@ func get(security SecurityMode, url *urlpkg.URL) (*Response, error) {
fetched, res, err = fetch(insecure)
if err != nil {
if cfg.BuildX {
- fmt.Fprintf(os.Stderr, "# get %s: %v\n", Redacted(url), err)
+ fmt.Fprintf(os.Stderr, "# get %s: %v\n", Redacted(insecure), err)
}
// HTTP failed, and we already tried HTTPS if applicable.
// Report the error from the HTTP attempt.
@@ -165,8 +165,9 @@ func get(security SecurityMode, url *urlpkg.URL) (*Response, error) {
// Note: accepting a non-200 OK here, so people can serve a
// meta import in their http 404 page.
if cfg.BuildX {
- fmt.Fprintf(os.Stderr, "# get %s: %v (%.3fs)\n", Redacted(url), res.Status, time.Since(start).Seconds())
+ fmt.Fprintf(os.Stderr, "# get %s: %v (%.3fs)\n", Redacted(fetched), res.Status, time.Since(start).Seconds())
}
+
r := &Response{
URL: Redacted(fetched),
Status: res.Status,
@@ -174,6 +175,20 @@ func get(security SecurityMode, url *urlpkg.URL) (*Response, error) {
Header: map[string][]string(res.Header),
Body: res.Body,
}
+
+ if res.StatusCode != http.StatusOK {
+ contentType := res.Header.Get("Content-Type")
+ if mediaType, params, _ := mime.ParseMediaType(contentType); mediaType == "text/plain" {
+ switch charset := strings.ToLower(params["charset"]); charset {
+ case "us-ascii", "utf-8", "":
+ // Body claims to be plain text in UTF-8 or a subset thereof.
+ // Try to extract a useful error message from it.
+ r.errorDetail.r = res.Body
+ r.Body = &r.errorDetail
+ }
+ }
+ }
+
return r, nil
}
@@ -190,6 +205,7 @@ func getFile(u *urlpkg.URL) (*Response, error) {
Status: http.StatusText(http.StatusNotFound),
StatusCode: http.StatusNotFound,
Body: http.NoBody,
+ fileErr: err,
}, nil
}
@@ -199,6 +215,7 @@ func getFile(u *urlpkg.URL) (*Response, error) {
Status: http.StatusText(http.StatusForbidden),
StatusCode: http.StatusForbidden,
Body: http.NoBody,
+ fileErr: err,
}, nil
}