Hi Mark,

On Tue, Mar 1, 2016 at 6:53 PM, Mark Thomas <ma...@apache.org> wrote:

> On 01/03/2016 14:57, Martin Grigorov wrote:
> > On Tue, Mar 1, 2016 at 3:37 PM, <ma...@apache.org> wrote:
> >
> >> Author: markt
> >> Date: Tue Mar  1 14:37:46 2016
> >> New Revision: 1733080
> >>
> >> URL: http://svn.apache.org/viewvc?rev=1733080&view=rev
> >> Log:
> >> Expand the fix for BZ 59001 to cover the special sequences used in
> >> Tomcat's custom jar:war: URL
>
> <snip/>
>
> > How often this method is expected to be called? I guess at least once per
> > request.
>
> That is not correct. It is generally called during web application
> start. I'd typically expect it to be called twice per JAR plus a few
> more times per web application for configuration files (depending on
> Host configuration).
>

OK. If the method is not called very often then it is not a big deal.


>
> > My concern is about the performance of String#replaceAll. It uses Regex
> and
> > is slower than custom solutions like
> >
> https://github.com/apache/wicket/blob/ffa34c6bfbd2ccd8340e23ff1601edd3e0e941d6/wicket-util/src/main/java/org/apache/wicket/util/string/Strings.java#L748
> >
> > When I don't have access to such util methods in the classpath then I
> > prefer to pre-compile the Pattern as a constant and just match on it:
> > e.g. PERCENT_21_PATTERN.matcher(input).replaceAll("%21/")
>
> Given how infrequently this code will be called, when it will be called
> and the overhead of JAR handling overall compared to the contribution of
> these calls I don't think a custom replaceAll() is necessary (although
> if user feedback is different for some use cases we can always revisit
> that).
>
> The pre-compiled Pattern approach might be worth looking at. I'll see if
> I can put together a simple benchmark and add it to the unit tests.
>

I've seen the following commit with the compiled Pattern!


>
> > Additionally I have the feeling that 'tmp.replaceAll("^/", "%5e/");'
> won't
> > behave as desired. I think it would match for any String that starts
> with a
> > slash because of '^'. You may need to Pattern.quote() it.
>
> It does behave as intended. There was a test case that checked that that
> wasn't checked in with the original commit.
>

Are you sure? ;-)

public static void main(String[] args) {
System.err.println("aaa^/bbb".replaceAll("^/", "C"));
System.err.println("aaa^/bbb".replaceAll("\\^/", "C"));
}

Executing this prints:
aaa^/bbb
aaaCbbb

In the following commit this is escaped and works correctly!
Thanks!


>
> Mark
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
> For additional commands, e-mail: dev-h...@tomcat.apache.org
>
>

Reply via email to