this.asIs = getAnyFile;
}
+ /** {@inheritDoc} */
@Override
public void init(FilterConfig config) throws ServletException {
// Do nothing.
}
+ /** {@inheritDoc} */
@Override
public void destroy() {
// Do nothing.
}
+ /** {@inheritDoc} */
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
import javax.servlet.http.HttpServletRequest;
-/** Parses Git client User-Agent strings. */
+/**
+ * Parses Git client User-Agent strings.
+ */
public class ClientVersionUtil {
private static final int[] v1_7_5 = { 1, 7, 5 };
private static final int[] v1_7_8_6 = { 1, 7, 8, 6 };
private static final int[] v1_7_9 = { 1, 7, 9 };
- /** @return maximum version array, indicating an invalid version of Git. */
+ /**
+ * An invalid version of Git
+ *
+ * @return maximum version array, indicating an invalid version of Git.
+ */
public static int[] invalidVersion() {
return new int[] { Integer.MAX_VALUE };
}
import org.eclipse.jgit.http.server.resolver.DefaultReceivePackFactory;
import org.eclipse.jgit.http.server.resolver.DefaultUploadPackFactory;
import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.transport.ReceivePack;
-import org.eclipse.jgit.transport.UploadPack;
import org.eclipse.jgit.transport.resolver.FileResolver;
import org.eclipse.jgit.transport.resolver.ReceivePackFactory;
import org.eclipse.jgit.transport.resolver.RepositoryResolver;
* Handles Git repository access over HTTP.
* <p>
* Applications embedding this filter should map a directory path within the
- * application to this filter. For a servlet version, see {@link GitServlet}.
+ * application to this filter. For a servlet version, see
+ * {@link org.eclipse.jgit.http.server.GitServlet}.
* <p>
* Applications may wish to add additional repository action URLs to this
- * servlet by taking advantage of its extension from {@link MetaFilter}.
- * Callers may register their own URL suffix translations through
- * {@link #serve(String)}, or their regex translations through
- * {@link #serveRegex(String)}. Each translation should contain a complete
- * filter pipeline which ends with the HttpServlet that should handle the
- * requested action.
+ * servlet by taking advantage of its extension from
+ * {@link org.eclipse.jgit.http.server.glue.MetaFilter}. Callers may register
+ * their own URL suffix translations through {@link #serve(String)}, or their
+ * regex translations through {@link #serveRegex(String)}. Each translation
+ * should contain a complete filter pipeline which ends with the HttpServlet
+ * that should handle the requested action.
*/
public class GitFilter extends MetaFilter {
private volatile boolean initialized;
}
/**
+ * Set AsIsFileService
+ *
* @param f
* the filter to validate direct access to repository files
* through a dumb client. If {@code null} then dumb client
}
/**
+ * Set upload-pack factory
+ *
* @param f
- * the factory to construct and configure an {@link UploadPack}
- * session when a fetch or clone is requested by a client.
+ * the factory to construct and configure an
+ * {@link org.eclipse.jgit.transport.UploadPack} session when a
+ * fetch or clone is requested by a client.
*/
@SuppressWarnings("unchecked")
public void setUploadPackFactory(UploadPackFactory<HttpServletRequest> f) {
}
/**
+ * Add upload-pack filter
+ *
* @param filter
* filter to apply before any of the UploadPack operations. The
* UploadPack instance is available in the request attribute
- * {@link ServletUtils#ATTRIBUTE_HANDLER}.
+ * {@link org.eclipse.jgit.http.server.ServletUtils#ATTRIBUTE_HANDLER}.
*/
public void addUploadPackFilter(Filter filter) {
assertNotInitialized();
}
/**
+ * Set the receive-pack factory
+ *
* @param f
- * the factory to construct and configure a {@link ReceivePack}
- * session when a push is requested by a client.
+ * the factory to construct and configure a
+ * {@link org.eclipse.jgit.transport.ReceivePack} session when a
+ * push is requested by a client.
*/
@SuppressWarnings("unchecked")
public void setReceivePackFactory(ReceivePackFactory<HttpServletRequest> f) {
}
/**
+ * Add receive-pack filter
+ *
* @param filter
* filter to apply before any of the ReceivePack operations. The
* ReceivePack instance is available in the request attribute
- * {@link ServletUtils#ATTRIBUTE_HANDLER}.
+ * {@link org.eclipse.jgit.http.server.ServletUtils#ATTRIBUTE_HANDLER}.
*/
public void addReceivePackFilter(Filter filter) {
assertNotInitialized();
throw new IllegalStateException(HttpServerText.get().alreadyInitializedByContainer);
}
+ /** {@inheritDoc} */
@Override
public void init(FilterConfig filterConfig) throws ServletException {
super.init(filterConfig);
}
}
+ /** {@inheritDoc} */
@Override
protected ServletBinder register(ServletBinder binder) {
if (resolver == null)
import org.eclipse.jgit.http.server.glue.MetaServlet;
import org.eclipse.jgit.http.server.resolver.AsIsFileService;
-import org.eclipse.jgit.transport.ReceivePack;
-import org.eclipse.jgit.transport.UploadPack;
import org.eclipse.jgit.transport.resolver.ReceivePackFactory;
import org.eclipse.jgit.transport.resolver.RepositoryResolver;
import org.eclipse.jgit.transport.resolver.UploadPackFactory;
*
* <p>
* Applications may wish to add additional repository action URLs to this
- * servlet by taking advantage of its extension from {@link MetaServlet}.
- * Callers may register their own URL suffix translations through
- * {@link #serve(String)}, or their regex translations through
- * {@link #serveRegex(String)}. Each translation should contain a complete
- * filter pipeline which ends with the HttpServlet that should handle the
- * requested action.
+ * servlet by taking advantage of its extension from
+ * {@link org.eclipse.jgit.http.server.glue.MetaServlet}. Callers may register
+ * their own URL suffix translations through {@link #serve(String)}, or their
+ * regex translations through {@link #serveRegex(String)}. Each translation
+ * should contain a complete filter pipeline which ends with the HttpServlet
+ * that should handle the requested action.
*/
public class GitServlet extends MetaServlet {
private static final long serialVersionUID = 1L;
}
/**
+ * Set AsIsFileService
+ *
* @param f
* the filter to validate direct access to repository files
* through a dumb client. If {@code null} then dumb client
}
/**
+ * Set upload-pack factory
+ *
* @param f
- * the factory to construct and configure an {@link UploadPack}
- * session when a fetch or clone is requested by a client.
+ * the factory to construct and configure an
+ * {@link org.eclipse.jgit.transport.UploadPack} session when a
+ * fetch or clone is requested by a client.
*/
public void setUploadPackFactory(UploadPackFactory<HttpServletRequest> f) {
gitFilter.setUploadPackFactory(f);
}
/**
+ * Add upload-pack filter
+ *
* @param filter
* filter to apply before any of the UploadPack operations. The
* UploadPack instance is available in the request attribute
- * {@link ServletUtils#ATTRIBUTE_HANDLER}.
+ * {@link org.eclipse.jgit.http.server.ServletUtils#ATTRIBUTE_HANDLER}.
*/
public void addUploadPackFilter(Filter filter) {
gitFilter.addUploadPackFilter(filter);
}
/**
+ * Set receive-pack factory
+ *
* @param f
- * the factory to construct and configure a {@link ReceivePack}
- * session when a push is requested by a client.
+ * the factory to construct and configure a
+ * {@link org.eclipse.jgit.transport.ReceivePack} session when a
+ * push is requested by a client.
*/
public void setReceivePackFactory(ReceivePackFactory<HttpServletRequest> f) {
gitFilter.setReceivePackFactory(f);
}
/**
+ * Add receive-pack filter
+ *
* @param filter
* filter to apply before any of the ReceivePack operations. The
* ReceivePack instance is available in the request attribute
- * {@link ServletUtils#ATTRIBUTE_HANDLER}.
+ * {@link org.eclipse.jgit.http.server.ServletUtils#ATTRIBUTE_HANDLER}.
*/
public void addReceivePackFilter(Filter filter) {
gitFilter.addReceivePackFilter(filter);
}
+ /** {@inheritDoc} */
@Override
public void init(final ServletConfig config) throws ServletException {
gitFilter.init(new FilterConfig() {
* an HTTP response code is returned instead.
* <p>
* This method may only be called before handing off the request to
- * {@link UploadPack#upload(java.io.InputStream, OutputStream, OutputStream)}
+ * {@link org.eclipse.jgit.transport.UploadPack#upload(java.io.InputStream, OutputStream, OutputStream)}
* or
- * {@link ReceivePack#receive(java.io.InputStream, OutputStream, OutputStream)}.
+ * {@link org.eclipse.jgit.transport.ReceivePack#receive(java.io.InputStream, OutputStream, OutputStream)}.
*
* @param req
* current request.
public class HttpServerText extends TranslationBundle {
/**
+ * Get an instance of this translation bundle
+ *
* @return an instance of this translation bundle
*/
public static HttpServerText get() {
class InfoPacksServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
+ /** {@inheritDoc} */
@Override
public void doGet(final HttpServletRequest req,
final HttpServletResponse rsp) throws IOException {
class InfoRefsServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
+ /** {@inheritDoc} */
@Override
public void doGet(final HttpServletRequest req,
final HttpServletResponse rsp) throws IOException {
* downstream servlet can directly access its contents on disk.
*/
class IsLocalFilter implements Filter {
+ /** {@inheritDoc} */
@Override
public void init(FilterConfig config) throws ServletException {
// Do nothing.
}
+ /** {@inheritDoc} */
@Override
public void destroy() {
// Do nothing.
}
+ /** {@inheritDoc} */
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;
-/** Adds HTTP response headers to prevent caching by proxies/browsers. */
+/** Add HTTP response headers to prevent caching by proxies/browsers. */
class NoCacheFilter implements Filter {
+ /** {@inheritDoc} */
@Override
public void init(FilterConfig config) throws ServletException {
// Do nothing.
}
+ /** {@inheritDoc} */
@Override
public void destroy() {
// Do nothing.
}
+ /** {@inheritDoc} */
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
abstract String etag(FileSender sender) throws IOException;
+ /** {@inheritDoc} */
@Override
public void doGet(final HttpServletRequest req,
final HttpServletResponse rsp) throws IOException {
serve(req, rsp, true);
}
+ /** {@inheritDoc} */
@Override
protected void doHead(final HttpServletRequest req,
final HttpServletResponse rsp) throws ServletException, IOException {
}
}
+ /** {@inheritDoc} */
@Override
public void doPost(final HttpServletRequest req,
final HttpServletResponse rsp) throws IOException {
import org.eclipse.jgit.transport.resolver.ServiceNotEnabledException;
/**
- * Opens a repository named by the path info through {@link RepositoryResolver}.
+ * Open a repository named by the path info through
+ * {@link org.eclipse.jgit.transport.resolver.RepositoryResolver}.
* <p>
- * This filter assumes it is invoked by {@link GitServlet} and is likely to not
- * work as expected if called from any other class. This filter assumes the path
- * info of the current request is a repository name which can be used by the
- * configured {@link RepositoryResolver} to open a {@link Repository} and attach
- * it to the current request.
+ * This filter assumes it is invoked by
+ * {@link org.eclipse.jgit.http.server.GitServlet} and is likely to not work as
+ * expected if called from any other class. This filter assumes the path info of
+ * the current request is a repository name which can be used by the configured
+ * {@link org.eclipse.jgit.transport.resolver.RepositoryResolver} to open a
+ * {@link org.eclipse.jgit.lib.Repository} and attach it to the current request.
* <p>
- * This filter sets request attribute {@link ServletUtils#ATTRIBUTE_REPOSITORY}
- * when it discovers the repository, and automatically closes and removes the
+ * This filter sets request attribute
+ * {@link org.eclipse.jgit.http.server.ServletUtils#ATTRIBUTE_REPOSITORY} when
+ * it discovers the repository, and automatically closes and removes the
* attribute when the request is complete.
*/
public class RepositoryFilter implements Filter {
*
* @param resolver
* the resolver which will be used to translate the URL name
- * component to the actual {@link Repository} instance for the
+ * component to the actual
+ * {@link org.eclipse.jgit.lib.Repository} instance for the
* current web request.
*/
public RepositoryFilter(final RepositoryResolver<HttpServletRequest> resolver) {
this.resolver = resolver;
}
+ /** {@inheritDoc} */
@Override
public void init(final FilterConfig config) throws ServletException {
context = config.getServletContext();
}
+ /** {@inheritDoc} */
@Override
public void destroy() {
context = null;
}
+ /** {@inheritDoc} */
@Override
public void doFilter(final ServletRequest request,
final ServletResponse response, final FilterChain chain)
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.Repository;
-/** Common utility functions for servlets. */
+/**
+ * Common utility functions for servlets.
+ */
public final class ServletUtils {
/** Request attribute which stores the {@link Repository} instance. */
public static final String ATTRIBUTE_REPOSITORY = "org.eclipse.jgit.Repository";
this.compressStream = compressStream;
}
+ /** {@inheritDoc} */
@Override
protected OutputStream overflow() throws IOException {
startedOutput = true;
return out;
}
+ /** {@inheritDoc} */
@Override
public void close() throws IOException {
super.close();
this.filters = filters.toArray(new Filter[filters.size()]);
}
+ /** {@inheritDoc} */
@Override
public void init(FilterConfig config) throws ServletException {
// Do nothing.
}
+ /** {@inheritDoc} */
@Override
public void destroy() {
// Do nothing.
}
+ /** {@inheritDoc} */
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
}
}
+ /**
+ * Begin service.
+ *
+ * @param req
+ * request
+ * @param db
+ * repository
+ * @throws IOException
+ * @throws ServiceNotEnabledException
+ * @throws ServiceNotAuthorizedException
+ */
protected abstract void begin(HttpServletRequest req, Repository db)
throws IOException, ServiceNotEnabledException,
ServiceNotAuthorizedException;
+ /**
+ * Advertise.
+ *
+ * @param req
+ * request
+ * @param pck
+ * @throws IOException
+ * @throws ServiceNotEnabledException
+ * @throws ServiceNotAuthorizedException
+ */
protected abstract void advertise(HttpServletRequest req,
PacketLineOutRefAdvertiser pck) throws IOException,
ServiceNotEnabledException, ServiceNotAuthorizedException;
this.fileName = name;
}
+ /** {@inheritDoc} */
@Override
public void doGet(final HttpServletRequest req,
final HttpServletResponse rsp) throws IOException {
}
}
+ /** {@inheritDoc} */
@Override
public void doPost(final HttpServletRequest req,
final HttpServletResponse rsp) throws IOException {
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
-/** Sends a fixed status code to the client. */
+/**
+ * Send a fixed status code to the client.
+ */
public class ErrorServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
this.status = status;
}
+ /** {@inheritDoc} */
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse rsp)
throws ServletException, IOException {
private volatile UrlPipeline[] pipelines;
- /** Empty filter with no bindings. */
+ /**
+ * Empty filter with no bindings.
+ */
public MetaFilter() {
this.bindings = new ArrayList<>();
}
return register(new RegexPipeline.Binder(pattern));
}
+ /** {@inheritDoc} */
@Override
public void init(FilterConfig filterConfig) throws ServletException {
servletContext = filterConfig.getServletContext();
}
+ /** {@inheritDoc} */
@Override
public void destroy() {
if (pipelines != null) {
};
}
+ /** {@inheritDoc} */
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
private final MetaFilter filter;
- /** Empty servlet with no bindings. */
+ /**
+ * Empty servlet with no bindings.
+ */
public MetaServlet() {
this(new MetaFilter());
}
filter = delegateFilter;
}
- /** @return filter this servlet delegates all routing logic to. */
+ /**
+ * Get delegate filter
+ *
+ * @return filter this servlet delegates all routing logic to.
+ */
protected MetaFilter getDelegateFilter() {
return filter;
}
return filter.serveRegex(expression);
}
+ /** {@inheritDoc} */
@Override
public void init(ServletConfig config) throws ServletException {
String name = filter.getClass().getName();
filter.init(new NoParameterFilterConfig(name, ctx));
}
+ /** {@inheritDoc} */
@Override
public void destroy() {
filter.destroy();
}
+ /** {@inheritDoc} */
@Override
protected void service(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
this.context = context;
}
+ /** {@inheritDoc} */
@Override
public String getInitParameter(String name) {
return null;
}
+ /** {@inheritDoc} */
@Override
public Enumeration<String> getInitParameterNames() {
return new Enumeration<String>() {
};
}
+ /** {@inheritDoc} */
@Override
public ServletContext getServletContext() {
return context;
}
+ /** {@inheritDoc} */
@Override
public String getFilterName() {
return filterName;
* Switch servlet path and path info to use another regex match group.
* <p>
* This filter is meant to be installed in the middle of a pipeline created by
- * {@link MetaServlet#serveRegex(String)}. The passed request's servlet path is
- * updated to be all text up to the start of the designated capture group, and
- * the path info is changed to the contents of the capture group.
- **/
+ * {@link org.eclipse.jgit.http.server.glue.MetaServlet#serveRegex(String)}. The
+ * passed request's servlet path is updated to be all text up to the start of
+ * the designated capture group, and the path info is changed to the contents of
+ * the capture group.
+ */
public class RegexGroupFilter implements Filter {
private final int groupIdx;
/**
+ * Constructor for RegexGroupFilter
+ *
* @param groupIdx
* capture group number, 1 through the number of groups.
*/
this.groupIdx = groupIdx - 1;
}
+ /** {@inheritDoc} */
@Override
public void init(FilterConfig config) throws ServletException {
// Do nothing.
}
+ /** {@inheritDoc} */
@Override
public void destroy() {
// Do nothing.
}
+ /** {@inheritDoc} */
@Override
public void doFilter(final ServletRequest request,
final ServletResponse rsp, final FilterChain chain)
}
}
+ /** {@inheritDoc} */
@Override
public String toString() {
return "Pipeline[regex: " + pattern + " ]";
import javax.servlet.Filter;
import javax.servlet.http.HttpServlet;
-/** Binds a servlet to a URL. */
+/**
+ * Binds a servlet to a URL.
+ */
public interface ServletBinder {
/**
+ * Set the filter to trigger while processing the path.
+ *
* @param filter
* the filter to trigger while processing the path.
* @return {@code this}.
public ServletBinder through(Filter filter);
/**
+ * Set the servlet to execute on this path
+ *
* @param servlet
* the servlet to execute on this path.
*/
this.filters = new ArrayList<>();
}
+ /** {@inheritDoc} */
@Override
public ServletBinder through(Filter filter) {
if (filter == null)
return this;
}
+ /** {@inheritDoc} */
@Override
public void with(HttpServlet servlet) {
if (servlet == null)
httpServlet = servlet;
}
- /** @return the configured servlet, or singleton returning 404 if none. */
+ /**
+ * Get the servlet
+ *
+ * @return the configured servlet, or singleton returning 404 if none.
+ */
protected HttpServlet getServlet() {
if (httpServlet != null)
return httpServlet;
return new ErrorServlet(HttpServletResponse.SC_NOT_FOUND);
}
- /** @return the configured filters; zero-length array if none. */
+ /**
+ * Get filters
+ *
+ * @return the configured filters; zero-length array if none.
+ */
protected Filter[] getFilters() {
return filters.toArray(new Filter[filters.size()]);
}
super.service(new WrappedRequest(req, newPath, newInfo), rsp);
}
+ /** {@inheritDoc} */
@Override
public String toString() {
return "Pipeline[ *" + suffix + " ]";
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
-/** Overrides the path and path info. */
+/**
+ * Overrides the path and path info.
+ */
public class WrappedRequest extends HttpServletRequestWrapper {
private final String path;
this.pathInfo = pathInfo;
}
+ /** {@inheritDoc} */
@Override
public String getPathTranslated() {
final String p = getPathInfo();
return p != null ? getSession().getServletContext().getRealPath(p) : null;
}
+ /** {@inheritDoc} */
@Override
public String getPathInfo() {
return pathInfo;
}
+ /** {@inheritDoc} */
@Override
public String getServletPath() {
return path;
import javax.servlet.http.HttpServletRequest;
-import org.eclipse.jgit.http.server.GitServlet;
import org.eclipse.jgit.lib.Config;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.transport.resolver.ServiceNotAuthorizedException;
* Older HTTP clients which do not speak the smart HTTP variant of the Git
* protocol fetch from a repository by directly getting its objects and pack
* files. This class, along with the {@code http.getanyfile} per-repository
- * configuration setting, can be used by {@link GitServlet} to control whether
- * or not these older clients are permitted to read these direct files.
+ * configuration setting, can be used by
+ * {@link org.eclipse.jgit.http.server.GitServlet} to control whether or not
+ * these older clients are permitted to read these direct files.
*/
public class AsIsFileService {
/** Always throws {@link ServiceNotEnabledException}. */
* throwing a checked exception if access should be denied.
* <p>
* The default implementation of this method checks {@code http.getanyfile},
- * throwing {@link ServiceNotEnabledException} if it was explicitly set to
- * {@code false}, and otherwise succeeding silently.
+ * throwing
+ * {@link org.eclipse.jgit.transport.resolver.ServiceNotEnabledException} if
+ * it was explicitly set to {@code false}, and otherwise succeeding
+ * silently.
*
* @param req
* current HTTP request, in case information from the request may
import org.eclipse.jgit.transport.resolver.ServiceNotEnabledException;
/**
- * Create and configure {@link ReceivePack} service instance.
+ * Create and configure {@link org.eclipse.jgit.transport.ReceivePack} service
+ * instance.
* <p>
* Writing by receive-pack is permitted if any of the following is true:
* <ul>
* <li>The container has authenticated the user and set
- * {@link HttpServletRequest#getRemoteUser()} to the authenticated name.
+ * {@link javax.servlet.http.HttpServletRequest#getRemoteUser()} to the
+ * authenticated name.
* <li>The repository configuration file has {@code http.receivepack} explicitly
* set to true.
* </ul>
}
}
+ /** {@inheritDoc} */
@Override
public ReceivePack create(final HttpServletRequest req, final Repository db)
throws ServiceNotEnabledException, ServiceNotAuthorizedException {
import org.eclipse.jgit.transport.resolver.UploadPackFactory;
/**
- * Create and configure {@link UploadPack} service instance.
+ * Create and configure {@link org.eclipse.jgit.transport.UploadPack} service
+ * instance.
* <p>
* Reading by upload-pack is permitted unless {@code http.uploadpack} is
* explicitly set to false.
}
}
+ /** {@inheritDoc} */
@Override
public UploadPack create(final HttpServletRequest req, final Repository db)
throws ServiceNotEnabledException, ServiceNotAuthorizedException {