| /* |
| * Copyright (C) 2009-2010, Google Inc. and others |
| * |
| * This program and the accompanying materials are made available under the |
| * terms of the Eclipse Distribution License v. 1.0 which is available at |
| * https://www.eclipse.org/org/documents/edl-v10.php. |
| * |
| * SPDX-License-Identifier: BSD-3-Clause |
| */ |
| |
| package org.eclipse.jgit.http.server.glue; |
| |
| import static java.lang.Integer.valueOf; |
| |
| import java.io.IOException; |
| import java.text.MessageFormat; |
| |
| import javax.servlet.Filter; |
| import javax.servlet.FilterChain; |
| import javax.servlet.FilterConfig; |
| import javax.servlet.ServletException; |
| import javax.servlet.ServletRequest; |
| import javax.servlet.ServletResponse; |
| |
| import org.eclipse.jgit.http.server.HttpServerText; |
| |
| /** |
| * 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 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. |
| */ |
| public RegexGroupFilter(int groupIdx) { |
| if (groupIdx < 1) |
| throw new IllegalArgumentException(MessageFormat.format( |
| HttpServerText.get().invalidIndex, valueOf(groupIdx))); |
| 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) |
| throws IOException, ServletException { |
| final WrappedRequest[] g = groupsFor(request); |
| if (groupIdx < g.length) |
| chain.doFilter(g[groupIdx], rsp); |
| else |
| throw new ServletException(MessageFormat.format( |
| HttpServerText.get().invalidRegexGroup, |
| valueOf(groupIdx + 1))); |
| } |
| |
| private static WrappedRequest[] groupsFor(ServletRequest r) { |
| return (WrappedRequest[]) r.getAttribute(MetaFilter.REGEX_GROUPS); |
| } |
| } |