in src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocServlet.java [121:207]
public void service(HttpServletRequest req, HttpServletResponse res) throws IOException {
try {
validateRequestMethod(req);
ResourceKey key = ResourceKey.fromPath(getEncodedPath(req));
ProjectState state = getProject(key);
XDocProjectConfig cfg = cfgFactory.create(state);
if (key.file == null) {
res.sendRedirect(getRedirectUrl(req, key, cfg));
return;
}
MimeType mimeType = fileTypeRegistry.getMimeType(key.file, (byte[]) null);
mimeType =
new MimeType(
FileContentUtil.resolveContentType(
state, key.file, FileMode.FILE, mimeType.toString()));
FormatterProvider formatter = getFormatter(req, key, mimeType);
validateDiffMode(key);
ProjectControl projectControl = projectControlFactory.controlFor(key.project);
String rev =
getRevision(
key.diffMode == DiffMode.NO_DIFF
? MoreObjects.firstNonNull(key.revision, cfg.getIndexRef())
: key.revision,
projectControl);
String revB = getRevision(key.revisionB, projectControl);
try (Repository repo = repoManager.openRepository(key.project)) {
ObjectId revId =
resolveRevision(
repo,
key.diffMode == DiffMode.NO_DIFF
? MoreObjects.firstNonNull(rev, Constants.HEAD)
: rev);
if (revId != null && ObjectId.isId(rev)) {
validateCanReadCommit(repo, projectControl, revId);
}
ObjectId revIdB = resolveRevision(repo, revB);
if (revIdB != null && ObjectId.isId(revB)) {
validateCanReadCommit(repo, projectControl, revIdB);
}
if (isResourceNotModified(req, key, revId, revIdB)) {
res.sendError(SC_NOT_MODIFIED);
return;
}
Resource rsc;
if (formatter != null) {
rsc = docCache.get(formatter, key.project, key.file, revId, revIdB, key.diffMode);
} else if (isImage(mimeType)) {
rsc = getImageResource(repo, key.diffMode, revId, revIdB, key.file);
} else {
rsc = Resource.NOT_FOUND;
}
if (rsc != Resource.NOT_FOUND) {
res.setHeader(
HttpHeaders.ETAG, computeETag(key.project, revId, key.file, revIdB, key.diffMode));
}
if (key.diffMode == DiffMode.NO_DIFF && rev == null) {
// file was loaded from HEAD, since HEAD is modifiable the document
// should only be cached for a short period
CacheHeaders.setCacheablePrivate(res, 15, TimeUnit.MINUTES, false);
} else {
CacheHeaders.setCacheablePrivate(res, 7, TimeUnit.DAYS, false);
}
rsc.send(req, res);
return;
}
} catch (RepositoryNotFoundException
| NoSuchProjectException
| ResourceNotFoundException
| AuthException
| RevisionSyntaxException e) {
Resource.NOT_FOUND.send(req, res);
} catch (MethodNotAllowedException e) {
CacheHeaders.setNotCacheable(res);
res.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
} catch (PermissionBackendException e) {
//
}
}