@Override
  protected ModelAndView doHandle(
      @NotNull HttpServletRequest request, @NotNull HttpServletResponse response) throws Exception {
    String buildIdParam = request.getParameter("buildId");
    String path = request.getParameter("file");
    String torrentPath = path + TorrentUtil.TORRENT_FILE_SUFFIX;

    File torrentFile = null;
    long buildId = Long.parseLong(buildIdParam);
    SBuild build = myBuildsManager.findBuildInstanceById(buildId);
    if (build != null) {
      torrentFile = myTorrentsManager.getTorrentFile(build, torrentPath);
      if (!torrentFile.isFile()) {
        torrentFile = null;
      }
    }

    if (torrentFile == null) {
      response.sendError(HttpServletResponse.SC_NOT_FOUND);
    } else {
      response.setContentType(WebUtil.getMimeType(request, torrentFile.getName()));
      // force set content-disposition to attachment
      WebUtil.setContentDisposition(request, response, torrentFile.getName(), false);
      ServletOutputStream output = response.getOutputStream();
      FileInputStream fis = null;
      try {
        fis = new FileInputStream(torrentFile);
        StreamUtil.copyStreamContent(fis, output);
      } finally {
        FileUtil.close(fis);
        output.close();
      }
    }

    return null;
  }