class Actions {
        // handlers called on the source node
        public static final String GET_BLOB_HEAD = "internal:crate:blob/shard/tmp_transfer/get_head";
        public static final String GET_TRANSFER_INFO = "internal:crate:blob/shard/tmp_transfer/get_info";

        // handlers called on the target node
        public static final String PUT_BLOB_HEAD_CHUNK = "internal:crate:blob/shard/tmp_transfer/put_head_chunk";
    }

    @Inject
    public BlobHeadRequestHandler(TransportService transportService, ClusterService clusterService,
                                  BlobTransferTarget blobTransferTarget, ThreadPool threadPool) {
        this.blobTransferTarget = blobTransferTarget;
        this.clusterService = clusterService;
        this.transportService = transportService;
        this.threadPool = threadPool;
    }

    public void registerHandler() {<FILL_FUNCTION_BODY>

        transportService.registerRequestHandler(
            Actions.GET_BLOB_HEAD,
            ThreadPool.Names.GENERIC,
            GetBlobHeadRequest::new,
            new GetBlobHeadHandler()
        );
        transportService.registerRequestHandler(
            Actions.GET_TRANSFER_INFO,
            ThreadPool.Names.GENERIC,
            BlobInfoRequest::new,
            new GetTransferInfoHandler()
        );
        transportService.registerRequestHandler(
            Actions.PUT_BLOB_HEAD_CHUNK,
            ThreadPool.Names.GENERIC,
            PutBlobHeadChunkRequest::new,
            new PutBlobHeadChunkHandler()
        );
    
<no_super_class>