code: func (s *SpdyRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) {
  	header := utilnet.CloneHeader(req.Header)
  	header.Add(httpstream.HeaderConnection, httpstream.HeaderUpgrade)
  	header.Add(httpstream.HeaderUpgrade, streamspdy.HeaderSpdy31)
  
  	// impersonation for remote clusters is handled by remote proxies
  	if !s.authCtx.cluster.isRemote {
  		header.Add("Impersonate-User", s.authCtx.User.GetName())
  		log.Debugf("Impersonate User: %v", s.authCtx.User)
  		for _, group := range s.authCtx.kubeGroups {
  			header.Add("Impersonate-Group", group)
  			log.Debugf("Impersonate Group: %v", group)
  		}
  		if s.bearerToken != "" {
  			log.Debugf("Using Bearer Token Auth")
  			header.Set("Authorization", fmt.Sprintf("Bearer %v", s.bearerToken))
  		}
  	}
  
  	var (
  		conn        net.Conn
  		rawResponse []byte
  		err         error
  	)
  
  	if s.followRedirects {
  		conn, rawResponse, err = utilnet.ConnectWithRedirects(req.Method, req.URL, header, req.Body, s)
  	} else {
  		clone := utilnet.CloneRequest(req)
  		clone.Header = header
  		conn, err = s.Dial(clone)
  	}
  	if err != nil {
  		return nil, err
  	}
  
  	responseReader := bufio.NewReader(
  		io.MultiReader(
  			bytes.NewBuffer(rawResponse),
  			conn,
  		),
  	)
  
  	resp, err := http.ReadResponse(responseReader, nil)
  	if err != nil {
  		if conn != nil {
  			conn.Close()
  		}
  		return nil, err
  	}
  
  	s.conn = conn
  
  	return resp, nil
  }
docs: // RoundTrip executes the Request and upgrades it. After a successful upgrade,
  // clients may call SpdyRoundTripper.Connection() to retrieve the upgraded
  // connection.