2015-01-14 22:03 GMT+01:00 Christopher Schultz <ch...@christopherschultz.net>:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA256
>
> Jose,
>
> On 1/14/15 3:54 PM, Jose María Zaragoza wrote:
>> 2015-01-14 20:05 GMT+01:00 Christopher Schultz
>> <ch...@christopherschultz.net>: Jose,
>>
>> On 1/14/15 8:27 AM, Jose María Zaragoza wrote:
>>>>> 2015-01-14 12:46 GMT+01:00 André Warnier <a...@ice-sa.com>:
>>>>>> Jose María Zaragoza wrote:
>>>>>>>
>>>>>>> Hello:
>>>>>>>
>>>>>>> I would like to create a web filter to forward some
>>>>>>> requests to another webserver,
>>>>>>>
>>>>>>> The filter receives an
>>>>>>> "application/x-www-form-urlencoded" request , inspects
>>>>>>> the value of a parameter and chooses to forward to
>>>>>>> another remote webserver ( as a proxy )
>>>>>
>>>>>
>>>>> Thanks
>>>>>
>>>>> I agree with you . I'll try to use an Apache httpd front-end
>>>>>
>>>>> Anyway, I've seen that if I execute
>>>>>
>>>>> Map<String, String[]> parameter = ((HttpServletRequest)
>>>>> request).getParameterMap();
>>>>>
>>>>> , then request.getInputStream is empty
>>>>>
>>>>>
>>>>> But if I execute
>>>>>
>>>>> Map<String, String[]> parameter = ((HttpServletRequest)
>>>>> request).getParameterMap(); chain.doFilter(request,
>>>>> response);
>>>>>
>>>>> , the next filter in the chain receives the body ( as I
>>>>> expect it )
>>>>>
>>>>> I don't understand this behaviour
>>
>> I think that might be a bug... calling
>> HttpServletRequest.getParameter* should cause the request entity to
>> be parsed, as long as the content type is
>> application/x-www-form-urlencoded. I think getParameterMap counts,
>> but I'd have to review the spec & javadoc (where some fun spec
>> requirements are hidden!).
>>
>> Anyhow, when you call HttpServletRequest.getParameter*, the
>> container *must* consume the request, according to the spec.
>>
>>
>>> Thanks.
>>
>>> In my case, all requests to be forwarded are POST requests  (
>>> and content type is application/x-www-form-urlencoded ) According
>>> to your reply, if I've got a chain of filters and the first one
>>> calls getParameterMap , do the next filters lose the content of
>>> the payload ?
>
> Correct. Once the request entity has been read (which happens when you
> call request.getParameter*), it's no longer available to the application.
>
>>> I tested to call several times to getParameterMap method on the
>>> same webfilter and it always returned the right values. Looks
>>> like getParameterMap doesn't consume() payload, but ... if I call
>>> getInputStream() after getParameterMap() , the stream is empty
>>
>>> I'm using Tomcat 7.0.50 and I cannot understand the logic of
>>> this
>
> Interesting. I find that surprising... I'll look into that.


Some things are sure:

- getParameterMap() consumes the payload ( at least in POST
application/x-www-form-urlencoded requests )

- consecutives calls to request.getParameterMap() ( same filter or the
next one )  always return the data.

So, looks like getParameterMap()  implements some kind of cache
I guess this is specific for servlet spec implementation in Tomcat ,
so it wouldn't be portable




>
> - -chris
> -----BEGIN PGP SIGNATURE-----
> Version: GnuPG v1
> Comment: GPGTools - http://gpgtools.org
>
> iQIcBAEBCAAGBQJUttm6AAoJEBzwKT+lPKRYcSAP/jxIW6s7nsU+aI/XLVW02bxp
> Nqb6qkZAVuyvpLRxi6UXDIINR00jb06+ijaz21fLn0F3G0KNQXDPmKi+jcC6zX1P
> rB6pJsbfJQYGfkZ0pdF12q+WzFwq1CQbJ4fFlK6WDtKxzoo4XKjlFHwByEPU4yKU
> GgyEGX+OD0hIh6nzPyC5pR1iXBLC25f9rsqrlOL+S4sN2MXYLZlHUuBgqN0dOoqH
> MN4r5WaaDBQVhadMmi8PScZm3iFMwdjFro7ry4FOuqB5uH6cV6oLIpfzP6F9cTQ2
> AUKiL1z6m5VdzsTbtJN0LwqvbILECClcrXJK1OCDL/Uzj04uqCL/+r88mVdjswAJ
> lacktHZzF+oPoY2oDDgMAPZTuPlr6nM2D4LETVYpSpUZIGWlJsDmNF/Fe7MAcAo6
> ZoC16FSYDTDpEIwXmNzEgWRMn0400DLmdLaS+zO5Sr2h3EI793qVok8Q44yE2Tg8
> Um7AdcpBhPzinbXK/OZMoj0YwcBmQDwo4Srdz1hxABc2VG+siCUu1NbwDa3qU+Tx
> 8Spi1d3Wpnbv2Vuw+1oNnD79EsH1Q3ookRoQTn9B3GDsr7FWs+WZAlSDQERRe+nR
> 84qswLpAWIC63Geqr3pH4Trsxaa+ge4RX66J8u6vIGYGaxsKJWblqsj02o19Y+O0
> hu9eG7FK+q7/+7NR7cj5
> =mRkw
> -----END PGP SIGNATURE-----
>
> ---------------------------------------------------------------------
> 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

Reply via email to