-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA256 Jérémie,
On 2/20/15 4:48 AM, Jérémie Barthés wrote: > "instead of just a snippet of "fixed" code" > > Sorry Chris,i didn't read this. > > How do you want me to provide the patch ? Presumably, you have a copy of the source code. If you checked-out from svn, just do this: /path/to/tomcat-8.0.15 $ svn diff > patch.file and post the patch file. If you just downloaded the source in e.g. ZIP, tarball, etc., re-fetch a pristine copy of the file and then do: /path/to/tomcat-8.0.15 $ diff path/to/original/RewriteValve.java \ java/org/apache/catalina/valves/rewrite/RewriteValve.java \ > patch.file - -chris > Le 20/02/2015 10:31, Jérémie Barthés a écrit : >> I send you the patch i did to fix my issue with the RewriteValve >> (it was for the 8.0.15), The goal of that patch is to block the >> RewriteValve if a 302 automatic folder '/' redirection occurs. >> The RewriteValve will rewrite the redirected URL. >> >> first step : http://localhost:8080/mypath/async => rewritten to >> http://localhost:8080/examples/jsp/async, 302 redirection >> occurs, rollback and redirect to >> http://localhost:8080/mypath/async/ second step : now the server >> receive http://localhost:8080/mypath/async/ => forward to >> http://localhost:8080/examples/jsp/async/ mission complete >> >> The patch may be a little bit dirty since it the first time i add >> code into tomcat and i don't understand all of this. >> >> It starts at the line 481 of the RewriteValve.java >> >> //boolean to know if the rewritten resource is a folder and need >> a redirection boolean folderRedirect = false; try{ >> request.getMappingData().recycle(); >> request.getConnector().getService().getMapper().map(request.getCoyoteRequest().serverName(), >> >> request.getCoyoteRequest().requestURI(), >> null, request.getMappingData()); >> if(request.getMappingData().redirectPath.toString()!=null){ >> folderRedirect = true; } } catch (Exception e){ //ignore } >> >> request.getMappingData().recycle(); // Reinvoke the whole request >> recursively try { >> request.getConnector().getProtocolHandler().getAdapter().service >> (request.getCoyoteRequest(), response.getCoyoteResponse()); >> >> if(folderRedirect && response.getCoyoteResponse().getStatus() == >> 302){ >> if(!request.getCoyoteRequest().requestURI().getByteChunk().toString().endsWith("/")){ >> >> >> String requestParam = >> request.getQueryString() == null ? "" : '?' + >> request.getQueryString(); response.setHeader("Location", >> request.getCoyoteRequest().requestURI().getByteChunk().toString() >> + '/' + requestParam); } } } catch (Exception e) { // This >> doesn't actually happen in the Catalina adapter implementation } >> >> >> Le 20/02/2015 09:34, Felix Schumacher a écrit : >>> Am 20.02.2015 08:49, schrieb Rainer Jung: >>>> Am 19.02.2015 um 22:13 schrieb Felix Schumacher: >>>>> Am 19.02.2015 um 21:41 schrieb André Warnier: >>>>>> Jérémie Barthés wrote: ... >>>>>> >>>>>>> >>>>>>> Make a file rewrite.config in conf/Catalina/localhost/ >>>>>>> that contains : RewriteRule ^/mypath/(.*)$ >>>>>>> /examples/jsp/$1 >>>>>>> >>>>>>> copy the line <Valve >>>>>>> className="org.apache.catalina.valves.rewrite.RewriteValve" >>>>>>> /> in the conf/server.xml file, line 131 >>>>>>> >>>>>> >>>>>> Since this is a Valve, it will run before Tomcat attempts >>>>>> to match the URL to an actual directory or webapp. >>>>>> >>>>>>> >>>>>>> try the followings URLs : >>>>>>> >>>>>> >>>>>> 1) http://localhost:8080/mypath/async >>>>>> >>>>>> This matches the rewrite rule, so it will be rewritten to >>>>>> URL >>>>>> >>>>>> /examples/jsp/async >>>>>> >>>>>> Then Tomcat will attempt to match this to a directory or >>>>>> webapp, and find that >>>>>> (catalina_base)/webapps/examples/jsp/async is a >>>>>> directory. It will thus respond to the browser with a 302 >>>>>> re-direct to >>>>>> >>>>>> http://localhost:8080/examples/jsp/async/ >>>>>> >>>>>> which is actually the "correct" URL. And this is what >>>>>> will be shown in the browser URL bar. This, in my view, >>>>>> is expected behaviour. The server does that, so that >>>>>> when an actual response is generated (for the correct >>>>>> URL http://localhost:8080/examples/jsp/async/), the >>>>>> browser can cache this response under the correct URL. >>>>>> >>>>>> Then the browser re-issues a request for >>>>>> >>>>>> http://localhost:8080/examples/jsp/async/ >>>>>> >>>>>> and that is when Tomcat will actually generate a "real" >>>>>> response, because this time it is a correct URL. So the >>>>>> response appears to the browser, as coming from >>>>>> >>>>>> http://localhost:8080/examples/jsp/async/ >>>>>> >>>>>> which is correct. >>>>>> >>>>>> 2) http://localhost:8080/mypath/async/ >>>>>> >>>>>> This also matches the rewrite rule, so it gets rewritten >>>>>> to >>>>>> >>>>>> http://localhost:8080/examples/jsp/async/ >>>>>> >>>>>> which is a correct URL. Thus Tomcat will immediately >>>>>> generate a real response (without an intermediate 302 >>>>>> redirect), which will be appear in the browser URL bar as >>>>>> a response to >>>>>> >>>>>> http://localhost:8080/mypath/async/ >>>>>> >>>>>> This is also expected behaviour. >>>>>> >>>>>> I believe that if you do not want to see the first >>>>>> redirect URL >>>>>> >>>>>> http://localhost:8080/examples/jsp/async/ >>>>>> >>>>>> in the browser, you have to modify your rewrite rules, >>>>>> perhaps by using a RewriteCond with the -d flag, to check >>>>>> first if the URL points to an existing directory, and if >>>>>> yes add the terminating "/" yourself (with a RewriteRule) >>>>>> before other rewrite tests/rules take place. >>>>> This rewrite.config >>>> >>>> ... >>>> >>>>> will do the trick. I think -d will not work, since >>>>> /mypath/async is not existant, it only "feels" like a >>>>> directory. >>>> >>>> Not clear: the implementation for "-d" is (case 0 below, from >>>> file ResolverImpl.java): >>>> >>>> 148 @Override 149 public boolean resolveResource(int >>>> type, String name) { 150 WebResourceRoot resources = >>>> request.getContext().getResources(); 151 WebResource >>>> resource = resources.getResource(name); 152 if >>>> (!resource.exists()) { 153 return false; 154 >>>> } else { 155 switch (type) { 156 case >>>> 0: 157 return (resource.isDirectory()); 158 >>>> case 1: 159 return (resource.isFile()); 160 >>>> case 2: 161 return (resource.isFile() && >>>> resource.getContentLength() > 0); 162 default: >>>> 163 return false; 164 } 165 >>>> } 166 } >>>> >>>> Since it checks resources and the OP was actually talking >>>> about a path that is a folder in his webapp, "-d" could >>>> work. >>> >>> Right, but given the examples and instructions from the op, it >>> seems to me, that async (source) is not a directory. >>> >>> I think the op wants to mimic [P] behaviour, which is not >>> implemented and wants to point out that the valve behaves >>> differently when operating on a directory like url and one that >>> is not. In the former it will do an internal forward in the >>> latter an external redirect. >>> >>> As proxy mode is not supported and documented, I tend to say, >>> that it is a mildly annoying inconsitency, but not a bug per >>> se. >>> >>> Regards Felix >>> >>>> >>>> Regards, >>>> >>>> Rainer >>>> >>>> --------------------------------------------------------------------- >>>> >>>> To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org >>>> For additional commands, e-mail: >>>> users-h...@tomcat.apache.org >>> >>> >>> --------------------------------------------------------------------- >>> >>> To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org >>> For additional commands, e-mail: users-h...@tomcat.apache.org >>> >> >> >> --------------------------------------------------------------------- >> >> To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org >> For additional commands, e-mail: users-h...@tomcat.apache.org >> > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org > For additional commands, e-mail: users-h...@tomcat.apache.org > -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 Comment: GPGTools - http://gpgtools.org iQIcBAEBCAAGBQJU52OrAAoJEBzwKT+lPKRYEMIP/i+iITuiZovejOUkx6dMB2AZ nj61DU2MQOx2vOHObP3oyyKwvhK2/X26D/C7X9M0zhv5XvI8pEe/taD5JtsXeMFy dSC7AsLts1Rd3raADT6d5c4QTvaoXhqoHVC8VfyBWk8s1VloMdzVj4sLNzoX6c59 xkPj7rlNyRIqiK02wDdkr1ApW1FtYjwIT2tdciE4JJzjSVZ4U0C81XDDfIsFLEZR C8lHl/vQFohcTeh/xmM/7fDYwO2bqUi7pYN6pal7pijjzdZ1lQg+HietyD6no3ta 4HNTfu2Exz+beEvGwY3h0+wrAFwBlwleKdahHitW+Yi/6TMZiKfp9HpjAMcWJpcH B1iKty8C64lmiwcqMKnU43D2rtUnu9sfGRXDcScl+85m2SYc/W7WUkrjN7hhldoe B3u4FJ7fD28oWtHsNnAmQ9jdyCFvHWIumawuS5w+wg9OwcQbiUBs1R7p1CK5jxMw IZnjZdSdtIWHBhNksHbfEsAcWsx6ZGF8Z55U1BllHaGQ6aLh0OacE+6qf87gDPVO +TZRJA0mWOjxZ6I1SG8kuXjPQ7NfQwkmyLq3QrO77NF5USsD0z9fb+Y2w1rW4VJl gw5BGdup7SuIkLqR/y6/J8KqvgDYXARZAUbuuTg87nzLBH/DgU+fQxY4O8T+pc62 mvHseJIiMJBmXZNfxE2G =um4m -----END PGP SIGNATURE----- --------------------------------------------------------------------- To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org For additional commands, e-mail: users-h...@tomcat.apache.org