@Override protected void doGetHtml(HttpServletRequest req, HttpServletResponse res) throws IOException { MarkdownConfig cfg = MarkdownConfig.get(getAccess(req).getConfig()); if (!cfg.render) { res.setStatus(SC_NOT_FOUND); return; } GitilesView view = ViewFilter.getView(req); Repository repo = ServletUtils.getRepository(req); try (RevWalk rw = new RevWalk(repo)) { ObjectReader reader = rw.getObjectReader(); String path = view.getPathPart(); RevTree root; try { root = rw.parseTree(view.getRevision().getId()); } catch (IncorrectObjectTypeException e) { res.setStatus(SC_NOT_FOUND); return; } MarkdownFile srcmd = findFile(rw, root, path); if (srcmd == null) { res.setStatus(SC_NOT_FOUND); return; } MarkdownFile navmd = findFile(rw, root, NAVBAR_MD); String curEtag = etag(srcmd, navmd); if (etagMatch(req, curEtag)) { res.setStatus(SC_NOT_MODIFIED); return; } view = view.toBuilder().setPathPart(srcmd.path).build(); try { srcmd.read(reader, cfg); if (navmd != null) { navmd.read(reader, cfg); } } catch (LargeObjectException.ExceedsLimit errBig) { fileTooBig(res, view, errBig); return; } catch (IOException err) { readError(res, view, err); return; } MarkdownToHtml.Builder fmt = MarkdownToHtml.builder() .setConfig(cfg) .setGitilesView(view) .setRequestUri(req.getRequestURI()) .setReader(reader) .setRootTree(root); res.setHeader(HttpHeaders.ETAG, curEtag); showDoc(req, res, view, cfg, fmt, navmd, srcmd); } }
private static void readError(HttpServletResponse res, GitilesView view, IOException err) { log.error( String.format( "cannot load markdown %s/%s %s %s", view.getHostName(), view.getRepositoryName(), view.getRevision(), view.getPathPart()), err); res.setStatus(SC_INTERNAL_SERVER_ERROR); }
private static void fileTooBig( HttpServletResponse res, GitilesView view, LargeObjectException.ExceedsLimit errBig) throws IOException { if (view.getType() == GitilesView.Type.ROOTED_DOC) { log.error( String.format( "markdown too large: %s/%s %s %s: %s", view.getHostName(), view.getRepositoryName(), view.getRevision(), view.getPathPart(), errBig.getMessage())); res.setStatus(SC_INTERNAL_SERVER_ERROR); } else { res.sendRedirect(GitilesView.show().copyFrom(view).toUrl()); } }