The bug is that HttpServletRequest#getPathInfo in jetty (and other popular servlet implementations, see ) don't consider semicolons and the characters that follow before the query fragment as part of the path for some reason. Eg for "foo;bar?a=b" getPathInfo returns "foo" rather than "foo;bar".
One workaround is to use getRequestURI which will return "foo;bar", but unlike getPathInfo the result is not decoded, therefore the parts of the path that need encoding (eg contain spaces) and get encoded when the URI object is created will not get decoded. URL decoding the value getRequestURI returns doesn't work however because it will decode paths that contain reserved URI characters (eg will decode "+" into a space) - the decoding needs to be the same path decoding that eg jetty would perform , ie doesn't decode reserved characters.
A suggestion from Todd is to encode the path used when creating the URL. Eg URL encode each individual segment of the path when creating the "/data" URL, and then decode each segment when retrieving the path with getPathInfo.