You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
81 lines
2.3 KiB
81 lines
2.3 KiB
/* |
|
* 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); |
|
} |
|
}
|
|
|