code: func (sm *Manager) HandleHTTPRequest(ctx context.Context, w http.ResponseWriter, r *http.Request) error {
  	hijacker, ok := w.(http.Hijacker)
  	if !ok {
  		return errors.New("handler does not support hijack")
  	}
  
  	id := r.Header.Get(headerSessionID)
  
  	proto := r.Header.Get("Upgrade")
  
  	sm.mu.Lock()
  	if _, ok := sm.sessions[id]; ok {
  		sm.mu.Unlock()
  		return errors.Errorf("session %s already exists", id)
  	}
  
  	if proto == "" {
  		sm.mu.Unlock()
  		return errors.New("no upgrade proto in request")
  	}
  
  	if proto != "h2c" {
  		sm.mu.Unlock()
  		return errors.Errorf("protocol %s not supported", proto)
  	}
  
  	conn, _, err := hijacker.Hijack()
  	if err != nil {
  		sm.mu.Unlock()
  		return errors.Wrap(err, "failed to hijack connection")
  	}
  
  	resp := &http.Response{
  		StatusCode: http.StatusSwitchingProtocols,
  		ProtoMajor: 1,
  		ProtoMinor: 1,
  		Header:     http.Header{},
  	}
  	resp.Header.Set("Connection", "Upgrade")
  	resp.Header.Set("Upgrade", proto)
  
  	// set raw mode
  	conn.Write([]byte{})
  	resp.Write(conn)
  
  	return sm.handleConn(ctx, conn, r.Header)
  }
docs: // HandleHTTPRequest handles an incoming HTTP request