code: func h2cUpgrade(w http.ResponseWriter, r *http.Request) (net.Conn, error) {
  	if !isH2CUpgrade(r.Header) {
  		return nil, errors.New("non-conforming h2c headers")
  	}
  
  	// Initial bytes we put into conn to fool http2 server
  	initBytes, _, err := convertH1ReqToH2(r)
  	if err != nil {
  		return nil, err
  	}
  
  	hijacker, ok := w.(http.Hijacker)
  	if !ok {
  		return nil, errors.New("hijack not supported")
  	}
  	conn, rw, err := hijacker.Hijack()
  	if err != nil {
  		return nil, fmt.Errorf("hijack failed: %v", err)
  	}
  
  	rw.Write([]byte("HTTP/1.1 101 Switching Protocols\r\n" +
  		"Connection: Upgrade\r\n" +
  		"Upgrade: h2c\r\n\r\n"))
  	rw.Flush()
  
  	// A conforming client will now send an H2 client preface which need to drain
  	// since we already sent this.
  	if err := drainClientPreface(rw); err != nil {
  		return nil, err
  	}
  
  	c := &rwConn{
  		Conn:      conn,
  		Reader:    io.MultiReader(initBytes, rw),
  		BufWriter: newSettingsAckSwallowWriter(rw.Writer),
  	}
  	return c, nil
  }
docs: // h2cUpgrade establishes a h2c connection using the HTTP/1 upgrade (Section 3.2).