1 /* 2 * Copyright (C) 2009-2010, Google Inc. and others 3 * 4 * This program and the accompanying materials are made available under the 5 * terms of the Eclipse Distribution License v. 1.0 which is available at 6 * https://www.eclipse.org/org/documents/edl-v10.php. 7 * 8 * SPDX-License-Identifier: BSD-3-Clause 9 */ 10 11 package org.eclipse.jgit.http.server; 12 13 import java.util.Enumeration; 14 15 import javax.servlet.Filter; 16 import javax.servlet.FilterConfig; 17 import javax.servlet.ServletConfig; 18 import javax.servlet.ServletContext; 19 import javax.servlet.ServletException; 20 import javax.servlet.http.HttpServletRequest; 21 22 import org.eclipse.jgit.http.server.glue.MetaServlet; 23 import org.eclipse.jgit.http.server.resolver.AsIsFileService; 24 import org.eclipse.jgit.transport.resolver.ReceivePackFactory; 25 import org.eclipse.jgit.transport.resolver.RepositoryResolver; 26 import org.eclipse.jgit.transport.resolver.UploadPackFactory; 27 28 /** 29 * Handles Git repository access over HTTP. 30 * <p> 31 * Applications embedding this servlet should map a directory path within the 32 * application to this servlet, for example: 33 * 34 * <pre> 35 * <servlet> 36 * <servlet-name>GitServlet</servlet-name> 37 * <servlet-class>org.eclipse.jgit.http.server.GitServlet</servlet-class> 38 * <init-param> 39 * <param-name>base-path</param-name> 40 * <param-value>/var/srv/git</param-value> 41 * </init-param> 42 * <init-param> 43 * <param-name>export-all</param-name> 44 * <param-value>0</param-value> 45 * </init-param> 46 * </servlet> 47 * <servlet-mapping> 48 * <servlet-name>GitServlet</servlet-name> 49 * <url-pattern>/git/*</url-pattern> 50 * </servlet-mapping> 51 * </pre> 52 * 53 * <p> 54 * Applications may wish to add additional repository action URLs to this 55 * servlet by taking advantage of its extension from 56 * {@link org.eclipse.jgit.http.server.glue.MetaServlet}. Callers may register 57 * their own URL suffix translations through {@link #serve(String)}, or their 58 * regex translations through {@link #serveRegex(String)}. Each translation 59 * should contain a complete filter pipeline which ends with the HttpServlet 60 * that should handle the requested action. 61 */ 62 public class GitServlet extends MetaServlet { 63 private static final long serialVersionUID = 1L; 64 65 private final GitFilter gitFilter; 66 67 /** 68 * New servlet that will load its base directory from {@code web.xml}. 69 * <p> 70 * The required parameter {@code base-path} must be configured to point to 71 * the local filesystem directory where all served Git repositories reside. 72 */ 73 public GitServlet() { 74 super(new GitFilter()); 75 gitFilter = (GitFilter) getDelegateFilter(); 76 } 77 78 /** 79 * New servlet configured with a specific resolver. 80 * 81 * @param resolver 82 * the resolver to use when matching URL to Git repository. If 83 * null the {@code base-path} parameter will be looked for in the 84 * parameter table during init, which usually comes from the 85 * {@code web.xml} file of the web application. 86 */ 87 public void setRepositoryResolver(RepositoryResolver<HttpServletRequest> resolver) { 88 gitFilter.setRepositoryResolver(resolver); 89 } 90 91 /** 92 * Set AsIsFileService 93 * 94 * @param f 95 * the filter to validate direct access to repository files 96 * through a dumb client. If {@code null} then dumb client 97 * support is completely disabled. 98 */ 99 public void setAsIsFileService(AsIsFileService f) { 100 gitFilter.setAsIsFileService(f); 101 } 102 103 /** 104 * Set upload-pack factory 105 * 106 * @param f 107 * the factory to construct and configure an 108 * {@link org.eclipse.jgit.transport.UploadPack} session when a 109 * fetch or clone is requested by a client. 110 */ 111 public void setUploadPackFactory(UploadPackFactory<HttpServletRequest> f) { 112 gitFilter.setUploadPackFactory(f); 113 } 114 115 /** 116 * Set a custom error handler for git-upload-pack. 117 * 118 * @param h 119 * A custom error handler for git-upload-pack. 120 * @since 5.9.1 121 */ 122 public void setUploadPackErrorHandler(UploadPackErrorHandler h) { 123 gitFilter.setUploadPackErrorHandler(h); 124 } 125 126 /** 127 * Add upload-pack filter 128 * 129 * @param filter 130 * filter to apply before any of the UploadPack operations. The 131 * UploadPack instance is available in the request attribute 132 * {@link org.eclipse.jgit.http.server.ServletUtils#ATTRIBUTE_HANDLER}. 133 */ 134 public void addUploadPackFilter(Filter filter) { 135 gitFilter.addUploadPackFilter(filter); 136 } 137 138 /** 139 * Set receive-pack factory 140 * 141 * @param f 142 * the factory to construct and configure a 143 * {@link org.eclipse.jgit.transport.ReceivePack} session when a 144 * push is requested by a client. 145 */ 146 public void setReceivePackFactory(ReceivePackFactory<HttpServletRequest> f) { 147 gitFilter.setReceivePackFactory(f); 148 } 149 150 /** 151 * Set a custom error handler for git-receive-pack. 152 * 153 * @param h 154 * A custom error handler for git-receive-pack. 155 * @since 5.9.1 156 */ 157 public void setReceivePackErrorHandler(ReceivePackErrorHandler h) { 158 gitFilter.setReceivePackErrorHandler(h); 159 } 160 161 /** 162 * Add receive-pack filter 163 * 164 * @param filter 165 * filter to apply before any of the ReceivePack operations. The 166 * ReceivePack instance is available in the request attribute 167 * {@link org.eclipse.jgit.http.server.ServletUtils#ATTRIBUTE_HANDLER}. 168 */ 169 public void addReceivePackFilter(Filter filter) { 170 gitFilter.addReceivePackFilter(filter); 171 } 172 173 /** {@inheritDoc} */ 174 @Override 175 public void init(ServletConfig config) throws ServletException { 176 gitFilter.init(new FilterConfig() { 177 @Override 178 public String getFilterName() { 179 return gitFilter.getClass().getName(); 180 } 181 182 @Override 183 public String getInitParameter(String name) { 184 return config.getInitParameter(name); 185 } 186 187 @Override 188 public Enumeration<String> getInitParameterNames() { 189 return config.getInitParameterNames(); 190 } 191 192 @Override 193 public ServletContext getServletContext() { 194 return config.getServletContext(); 195 } 196 }); 197 } 198 }