code: func (r *Router) ServeTCP(conn net.Conn) {
  	// FIXME -- Check if ProxyProtocol changes the first bytes of the request
  
  	br := bufio.NewReader(conn)
  	serverName, tls, peeked := clientHelloServerName(br)
  	if !tls {
  		switch {
  		case r.catchAllNoTLS != nil:
  			r.catchAllNoTLS.ServeTCP(r.GetConn(conn, peeked))
  		case r.httpForwarder != nil:
  			r.httpForwarder.ServeTCP(r.GetConn(conn, peeked))
  		default:
  			conn.Close()
  		}
  		return
  	}
  
  	// FIXME Optimize and test the routing table before helloServerName
  	serverName = strings.ToLower(serverName)
  	if r.routingTable != nil && serverName != "" {
  		if target, ok := r.routingTable[serverName]; ok {
  			target.ServeTCP(r.GetConn(conn, peeked))
  			return
  		}
  	}
  
  	// FIXME Needs tests
  	if target, ok := r.routingTable["*"]; ok {
  		target.ServeTCP(r.GetConn(conn, peeked))
  		return
  	}
  
  	if r.httpsForwarder != nil {
  		r.httpsForwarder.ServeTCP(r.GetConn(conn, peeked))
  	} else {
  		conn.Close()
  	}
  }
docs: // ServeTCP forwards the connection to the right TCP/HTTP handler