Hello, Ben! That's an interesting question with no clear answer (i.e. one that stands out much better than the others).
I'd go with option 2. We could create a new exception time for time and have PageRenderDispatcher and ComponentEventDispatcher catch it and return a proper 400 response. In addition, if we need more flexibility, we could create a service to define what to do with bad Tapestry URL encoding and have the default being a 400 response. On Fri, Aug 20, 2021 at 9:41 AM Ben Weidig <b...@netzgut.net> wrote: > Hi, > > we have a problem with the Tapestry URLEncoder and how invalid characters > are handled in the ActivationRequestParameterWorker. > > If a component request URL contains unsafe characters, an > IllegalArgumentException is thrown: > > https://github.com/apache/tapestry-5/blob/b347e650ebf1204b87220166c7d126129b5ee460/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/URLEncoderImpl.java#L144 > > Our logging setup sends a mail for every unhandled exception, and we > receive quite a lot of these exceptions due to dumb bots trying random > URLS. > > The strictness of the URLEncoder was discussed before, and the ticket is > still open: https://issues.apache.org/jira/browse/TAP5-1803 > The reasoning behind using a custom URLEncode and not the Java URLEncoder > is still sound IMO and shouldn't be changed. > > We internally discussed how we could mitigate the problem, and the > following ideas came to mind: > > Idea 1: @ActivationRequestParameter should have "emptyOnError" with a > default value of false. > If the decode fails, this option would set the decoded String to empty > String. > The value encoder would create a valid value for the component, and no 500 > error would occur. > There shouldn't be any backward compatibility issues due to the default > value "false". > But the new option would allow us to handle invalid values by actually > receiving a value in any case. > > The idea sounded good until I tested it, and an empty string isn't leading > to valid values from the ValueEncoder. > For example, in the case of numeric values, it would just trade the > IllegalArgumentException with NumberFormatException. > > > Idea 2: Stop the request and return an HTTP 400. > Why does an unencodable URL have to lead to an HTTP 500 status? > From an HTTP workflow point of view, the server receives a request it can't > handle, so an HTTP 400 would be a better option because the request is > faulty. > Catching any IllegalArgumentException in > > https://github.com/apache/tapestry-5/blob/b347e650ebf1204b87220166c7d126129b5ee460/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ActivationRequestParameterWorker.java#L136 > and stop the request and return status 400. > > The first problem we thought about is how to interrupt the request at that > particular point. > The crash, in our case, is on page activation in > ComponentEventRequestHandlerImpl. > There should be mechanism added to allow the page activation to tell the > ComponentEventRequestHandlerImpl that the activation failed due to "bad > request", and not a server error. > > > What do you think? > Do you have similar issues with bots and invalid requests? > Are we overthinking it, and there's a more straightforward way to deal with > the problem? > > Cheers > Ben > -- Thiago