Merge "Refactor XDocServlet: Validate request method in helper method"
diff --git a/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocServlet.java b/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocServlet.java
index e281ef3..40ce348 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocServlet.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocServlet.java
@@ -23,6 +23,7 @@
import com.google.common.net.HttpHeaders;
import com.google.gerrit.extensions.restapi.AuthException;
import com.google.gerrit.extensions.restapi.IdString;
+import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
import com.google.gerrit.httpd.resources.Resource;
import com.google.gerrit.httpd.resources.SmallResource;
@@ -106,37 +107,33 @@
@Override
public void service(HttpServletRequest req, HttpServletResponse res)
throws IOException {
- if (!"GET".equals(req.getMethod()) && !"HEAD".equals(req.getMethod())) {
- CacheHeaders.setNotCacheable(res);
- res.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
- return;
- }
+ try {
+ validateRequestMethod(req);
- ResourceKey key = ResourceKey.fromPath(req.getPathInfo());
- ProjectState state = projectCache.get(key.project);
- if (state == null) {
- Resource.NOT_FOUND.send(req, res);
- return;
- }
- XDocProjectConfig cfg = cfgFactory.create(state);
- if (key.file == null) {
- res.sendRedirect(getRedirectUrl(req, key, cfg));
- return;
- }
-
- MimeType mimeType = fileTypeRegistry.getMimeType(key.file, null);
- FormatterProvider formatter;
- if (req.getParameter("raw") != null) {
- formatter = formatters.getRawFormatter();
- } else {
- formatter = formatters.get(state, key.file);
- if (formatter == null && !isSafeImage(mimeType)) {
+ ResourceKey key = ResourceKey.fromPath(req.getPathInfo());
+ ProjectState state = projectCache.get(key.project);
+ if (state == null) {
Resource.NOT_FOUND.send(req, res);
return;
}
- }
+ XDocProjectConfig cfg = cfgFactory.create(state);
+ if (key.file == null) {
+ res.sendRedirect(getRedirectUrl(req, key, cfg));
+ return;
+ }
- try {
+ MimeType mimeType = fileTypeRegistry.getMimeType(key.file, null);
+ FormatterProvider formatter;
+ if (req.getParameter("raw") != null) {
+ formatter = formatters.getRawFormatter();
+ } else {
+ formatter = formatters.get(state, key.file);
+ if (formatter == null && !isSafeImage(mimeType)) {
+ Resource.NOT_FOUND.send(req, res);
+ return;
+ }
+ }
+
ProjectControl projectControl = projectControlFactory.validateFor(key.project);
String rev = key.revision;
if (rev == null) {
@@ -212,7 +209,9 @@
} catch (RepositoryNotFoundException | NoSuchProjectException
| ResourceNotFoundException | AuthException | RevisionSyntaxException e) {
Resource.NOT_FOUND.send(req, res);
- return;
+ } catch (MethodNotAllowedException e) {
+ CacheHeaders.setNotCacheable(res);
+ res.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
}
}
@@ -251,6 +250,13 @@
}
}
+ private static void validateRequestMethod(HttpServletRequest req)
+ throws MethodNotAllowedException {
+ if (!("GET".equals(req.getMethod()) || "HEAD".equals(req.getMethod()))) {
+ throw new MethodNotAllowedException();
+ }
+ }
+
private boolean isSafeImage(MimeType mimeType) {
return isImage(mimeType) && fileTypeRegistry.isSafeInline(mimeType);
}