code: func (s *Server) handleSnapshotRequest(conn net.Conn) error {
  	var args structs.SnapshotRequest
  	dec := codec.NewDecoder(conn, &codec.MsgpackHandle{})
  	if err := dec.Decode(&args); err != nil {
  		return fmt.Errorf("failed to decode request: %v", err)
  	}
  
  	var reply structs.SnapshotResponse
  	snap, err := s.dispatchSnapshotRequest(&args, conn, &reply)
  	if err != nil {
  		reply.Error = err.Error()
  		goto RESPOND
  	}
  	defer func() {
  		if err := snap.Close(); err != nil {
  			s.logger.Printf("[ERR] consul: Failed to close snapshot: %v", err)
  		}
  	}()
  
  RESPOND:
  	enc := codec.NewEncoder(conn, &codec.MsgpackHandle{})
  	if err := enc.Encode(&reply); err != nil {
  		return fmt.Errorf("failed to encode response: %v", err)
  	}
  	if snap != nil {
  		if _, err := io.Copy(conn, snap); err != nil {
  			return fmt.Errorf("failed to stream snapshot: %v", err)
  		}
  	}
  
  	return nil
  }
docs: // handleSnapshotRequest reads the request from the conn and dispatches it. This
  // will be called from a goroutine after an incoming stream is determined to be
  // a snapshot request.