blob: 8f021e61b8c62628eba2e28b062546c425cc473d [file] [log] [blame]
Shawn Pearce68311c72015-06-09 17:01:34 -07001// Copyright 2015 Google Inc. All Rights Reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package com.google.gitiles;
16
17import static org.eclipse.jgit.http.server.ServletUtils.ATTRIBUTE_REPOSITORY;
18
Masaya Suzuki5cecb862019-03-25 17:35:44 -070019import com.google.gitiles.GitilesRequestFailureException.FailureReason;
Shawn Pearce68311c72015-06-09 17:01:34 -070020import com.google.gitiles.doc.DocServlet;
Shawn Pearce3739fcd2017-06-30 15:38:17 -070021import com.google.gitiles.doc.HtmlSanitizer;
Dave Borowitz3b744b12016-08-19 16:11:10 -040022import java.io.IOException;
23import javax.servlet.ServletConfig;
24import javax.servlet.ServletException;
25import javax.servlet.http.HttpServlet;
26import javax.servlet.http.HttpServletRequest;
27import javax.servlet.http.HttpServletResponse;
Shawn Pearce68311c72015-06-09 17:01:34 -070028import org.eclipse.jgit.lib.ObjectId;
29import org.eclipse.jgit.lib.Repository;
30import org.eclipse.jgit.revwalk.RevCommit;
31import org.eclipse.jgit.revwalk.RevObject;
32import org.eclipse.jgit.revwalk.RevWalk;
33import org.eclipse.jgit.transport.resolver.RepositoryResolver;
34import org.eclipse.jgit.transport.resolver.ServiceNotAuthorizedException;
35import org.eclipse.jgit.transport.resolver.ServiceNotEnabledException;
Shawn Pearce68311c72015-06-09 17:01:34 -070036
Shawn Pearce68311c72015-06-09 17:01:34 -070037/** Serves Markdown at the root of a host. */
38public class RootedDocServlet extends HttpServlet {
Shawn Pearce68311c72015-06-09 17:01:34 -070039 private static final long serialVersionUID = 1L;
40 public static final String BRANCH = "refs/heads/md-pages";
41
42 private final RepositoryResolver<HttpServletRequest> resolver;
43 private final DocServlet docServlet;
44
Han-Wen Nienhuysc0200f62016-05-02 17:34:51 +020045 public RootedDocServlet(
46 RepositoryResolver<HttpServletRequest> resolver,
47 GitilesAccess.Factory accessFactory,
48 Renderer renderer) {
Shawn Pearce3739fcd2017-06-30 15:38:17 -070049 this(resolver, accessFactory, renderer, HtmlSanitizer.DISABLED_FACTORY);
50 }
51
52 public RootedDocServlet(
53 RepositoryResolver<HttpServletRequest> resolver,
54 GitilesAccess.Factory accessFactory,
55 Renderer renderer,
56 HtmlSanitizer.Factory htmlSanitizer) {
Shawn Pearce68311c72015-06-09 17:01:34 -070057 this.resolver = resolver;
Shawn Pearce3739fcd2017-06-30 15:38:17 -070058 docServlet = new DocServlet(accessFactory, renderer, htmlSanitizer);
Shawn Pearce68311c72015-06-09 17:01:34 -070059 }
60
61 @Override
62 public void init(ServletConfig config) throws ServletException {
63 super.init(config);
64 docServlet.init(config);
65 }
66
67 @Override
68 public void service(HttpServletRequest req, HttpServletResponse res)
69 throws IOException, ServletException {
70 try (Repository repo = resolver.open(req, null);
71 RevWalk rw = new RevWalk(repo)) {
72 ObjectId id = repo.resolve(BRANCH);
73 if (id == null) {
Masaya Suzuki5cecb862019-03-25 17:35:44 -070074 throw new GitilesRequestFailureException(FailureReason.OBJECT_NOT_FOUND);
Shawn Pearce68311c72015-06-09 17:01:34 -070075 }
76
77 RevObject obj = rw.peel(rw.parseAny(id));
78 if (!(obj instanceof RevCommit)) {
Masaya Suzuki5cecb862019-03-25 17:35:44 -070079 throw new GitilesRequestFailureException(FailureReason.INCORRECT_OBJECT_TYPE);
Shawn Pearce68311c72015-06-09 17:01:34 -070080 }
81
82 req.setAttribute(ATTRIBUTE_REPOSITORY, repo);
Han-Wen Nienhuysc0200f62016-05-02 17:34:51 +020083 ViewFilter.setView(
84 req,
85 GitilesView.rootedDoc()
86 .setHostName(req.getServerName())
87 .setServletPath(req.getContextPath() + req.getServletPath())
88 .setRevision(BRANCH, obj)
89 .setPathPart(req.getPathInfo())
90 .build());
Shawn Pearce68311c72015-06-09 17:01:34 -070091
92 docServlet.service(req, res);
Masaya Suzuki5cecb862019-03-25 17:35:44 -070093 } catch (ServiceNotAuthorizedException e) {
94 throw new GitilesRequestFailureException(FailureReason.NOT_AUTHORIZED, e);
95 } catch (ServiceNotEnabledException e) {
96 throw new GitilesRequestFailureException(FailureReason.SERVICE_NOT_ENABLED, e);
Shawn Pearce68311c72015-06-09 17:01:34 -070097 } finally {
98 ViewFilter.removeView(req);
99 req.removeAttribute(ATTRIBUTE_REPOSITORY);
100 }
101 }
102}