blob: 96329b1cfe548c309f59620b1f6c7ce16ca44a8e [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
19import com.google.gitiles.doc.DocServlet;
Shawn Pearce3739fcd2017-06-30 15:38:17 -070020import com.google.gitiles.doc.HtmlSanitizer;
Dave Borowitz3b744b12016-08-19 16:11:10 -040021import java.io.IOException;
22import javax.servlet.ServletConfig;
23import javax.servlet.ServletException;
24import javax.servlet.http.HttpServlet;
25import javax.servlet.http.HttpServletRequest;
26import javax.servlet.http.HttpServletResponse;
Shawn Pearce68311c72015-06-09 17:01:34 -070027import org.eclipse.jgit.errors.RepositoryNotFoundException;
28import 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;
36import org.slf4j.Logger;
37import org.slf4j.LoggerFactory;
38
Shawn Pearce68311c72015-06-09 17:01:34 -070039/** Serves Markdown at the root of a host. */
40public class RootedDocServlet extends HttpServlet {
41 private static final Logger log = LoggerFactory.getLogger(ViewFilter.class);
42 private static final long serialVersionUID = 1L;
43 public static final String BRANCH = "refs/heads/md-pages";
44
45 private final RepositoryResolver<HttpServletRequest> resolver;
46 private final DocServlet docServlet;
47
Han-Wen Nienhuysc0200f62016-05-02 17:34:51 +020048 public RootedDocServlet(
49 RepositoryResolver<HttpServletRequest> resolver,
50 GitilesAccess.Factory accessFactory,
51 Renderer renderer) {
Shawn Pearce3739fcd2017-06-30 15:38:17 -070052 this(resolver, accessFactory, renderer, HtmlSanitizer.DISABLED_FACTORY);
53 }
54
55 public RootedDocServlet(
56 RepositoryResolver<HttpServletRequest> resolver,
57 GitilesAccess.Factory accessFactory,
58 Renderer renderer,
59 HtmlSanitizer.Factory htmlSanitizer) {
Shawn Pearce68311c72015-06-09 17:01:34 -070060 this.resolver = resolver;
Shawn Pearce3739fcd2017-06-30 15:38:17 -070061 docServlet = new DocServlet(accessFactory, renderer, htmlSanitizer);
Shawn Pearce68311c72015-06-09 17:01:34 -070062 }
63
64 @Override
65 public void init(ServletConfig config) throws ServletException {
66 super.init(config);
67 docServlet.init(config);
68 }
69
70 @Override
71 public void service(HttpServletRequest req, HttpServletResponse res)
72 throws IOException, ServletException {
73 try (Repository repo = resolver.open(req, null);
74 RevWalk rw = new RevWalk(repo)) {
75 ObjectId id = repo.resolve(BRANCH);
76 if (id == null) {
77 res.sendError(HttpServletResponse.SC_NOT_FOUND);
78 return;
79 }
80
81 RevObject obj = rw.peel(rw.parseAny(id));
82 if (!(obj instanceof RevCommit)) {
83 res.sendError(HttpServletResponse.SC_NOT_FOUND);
84 return;
85 }
86
87 req.setAttribute(ATTRIBUTE_REPOSITORY, repo);
Han-Wen Nienhuysc0200f62016-05-02 17:34:51 +020088 ViewFilter.setView(
89 req,
90 GitilesView.rootedDoc()
91 .setHostName(req.getServerName())
92 .setServletPath(req.getContextPath() + req.getServletPath())
93 .setRevision(BRANCH, obj)
94 .setPathPart(req.getPathInfo())
95 .build());
Shawn Pearce68311c72015-06-09 17:01:34 -070096
97 docServlet.service(req, res);
Han-Wen Nienhuysc0200f62016-05-02 17:34:51 +020098 } catch (RepositoryNotFoundException
99 | ServiceNotAuthorizedException
Shawn Pearce68311c72015-06-09 17:01:34 -0700100 | ServiceNotEnabledException e) {
101 log.error(String.format("cannot open repository for %s", req.getServerName()), e);
102 res.sendError(HttpServletResponse.SC_NOT_FOUND);
103 } finally {
104 ViewFilter.removeView(req);
105 req.removeAttribute(ATTRIBUTE_REPOSITORY);
106 }
107 }
108}