浏览代码

Merge pull request #45312 from rumpl/c8d-fix-http-fallback

c8d: Fix checking TLS handshake for insecure registries
Sebastiaan van Stijn 2 年之前
父节点
当前提交
3d0bdfaa70
共有 1 个文件被更改,包括 12 次插入7 次删除
  1. 12 7
      daemon/containerd/resolver.go

+ 12 - 7
daemon/containerd/resolver.go

@@ -1,8 +1,9 @@
 package containerd
 package containerd
 
 
 import (
 import (
+	"crypto/tls"
+	"errors"
 	"net/http"
 	"net/http"
-	"strings"
 
 
 	"github.com/containerd/containerd/remotes"
 	"github.com/containerd/containerd/remotes"
 	"github.com/containerd/containerd/remotes/docker"
 	"github.com/containerd/containerd/remotes/docker"
@@ -72,12 +73,16 @@ type httpFallback struct {
 
 
 func (f httpFallback) RoundTrip(r *http.Request) (*http.Response, error) {
 func (f httpFallback) RoundTrip(r *http.Request) (*http.Response, error) {
 	resp, err := f.super.RoundTrip(r)
 	resp, err := f.super.RoundTrip(r)
-	if err != nil {
-		if strings.Contains(err.Error(), "http: server gave HTTP response to HTTPS client") {
-			plain := r.Clone(r.Context())
-			plain.URL.Scheme = "http"
-			return http.DefaultTransport.RoundTrip(plain)
-		}
+	var tlsErr tls.RecordHeaderError
+	if errors.As(err, &tlsErr) && string(tlsErr.RecordHeader[:]) == "HTTP/" {
+		// server gave HTTP response to HTTPS client
+		plainHttpUrl := *r.URL
+		plainHttpUrl.Scheme = "http"
+
+		plainHttpRequest := *r
+		plainHttpRequest.URL = &plainHttpUrl
+
+		return http.DefaultTransport.RoundTrip(&plainHttpRequest)
 	}
 	}
 
 
 	return resp, err
 	return resp, err