Re: Possible bug in HttpServletRequest#getRequestDispatcher()

2018-08-02 Thread Michael Osipov

Am 2018-08-02 um 16:30 schrieb Mark Thomas:

On 02/08/18 11:15, Mark Thomas wrote:

On 30/07/18 19:48, Michael Osipov wrote:

Am 2018-07-25 um 22:13 schrieb Michael Osipov:

Hi folks,

I might have found a bug and looking for someone to confirm. (Tested
in Tomcat 8.5.32).


I agree that this is a bug.


Fixed in 9.0.x, 8.5.x and 7.0.x for the next release of each.


Perfect, thank you! Didn't expect that you fix it that fast. That darn 
URLEncoder has to be deprecated...and removed.


Michael

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



Re: Possible bug in HttpServletRequest#getRequestDispatcher()

2018-08-02 Thread Mark Thomas
On 02/08/18 11:15, Mark Thomas wrote:
> On 30/07/18 19:48, Michael Osipov wrote:
>> Am 2018-07-25 um 22:13 schrieb Michael Osipov:
>>> Hi folks,
>>>
>>> I might have found a bug and looking for someone to confirm. (Tested
>>> in Tomcat 8.5.32).
> 
> I agree that this is a bug.

Fixed in 9.0.x, 8.5.x and 7.0.x for the next release of each.

Mark

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



Re: Possible bug in HttpServletRequest#getRequestDispatcher()

2018-08-02 Thread Mark Thomas
On 30/07/18 19:48, Michael Osipov wrote:
> Am 2018-07-25 um 22:13 schrieb Michael Osipov:
>> Hi folks,
>>
>> I might have found a bug and looking for someone to confirm. (Tested
>> in Tomcat 8.5.32).

I agree that this is a bug.

Mark

>>
>> Consider the following servlet:
>>> @WebServlet("/request-dispatcher")
>>> public class TestServlet extends HttpServlet {
>>> private static final long serialVersionUID = 1L;
>>>
>>> protected void doGet(HttpServletRequest request,
>>> HttpServletResponse response)
>>>     throws ServletException, IOException {
>>>     String jsp = request.getParameter("jsp");
>>>     if (jsp == null || jsp.isEmpty())
>>>     response.sendError(HttpServletResponse.SC_BAD_REQUEST);
>>>     else {
>>>     System.out.println("Requested JSP: " + jsp);
>>>     RequestDispatcher dispatcher =
>>> request.getRequestDispatcher("/" + jsp);
>>>     dispatcher.forward(request, response);
>>>     }
>>> }
>>> }
>>
>> Now this call:
>>> $ curl --verbose
>>> http://localhost:8080/test/request-dispatcher?jsp=1380%2B0.jsp
>>> * STATE: INIT => CONNECT handle 0x25de150; line 1392 (connection #-5000)
>>> * Added connection 0. The cache now contains 1 members
>>> * STATE: CONNECT => WAITRESOLVE handle 0x25de150; line 1428
>>> (connection #0)
>>>   % Total    % Received % Xferd  Average Speed   Time    Time
>>> Time  Current
>>>  Dload  Upload   Total   Spent   
>>> Left  Speed
>>>   0 0    0 0    0 0  0  0 --:--:-- --:--:--
>>> --:--:-- 0*   Trying ::1...
>>> * TCP_NODELAY set
>>> * STATE: WAITRESOLVE => WAITCONNECT handle 0x25de150; line 1509
>>> (connection #0)
>>> * Connected to localhost (::1) port 8080 (#0)
>>> * STATE: WAITCONNECT => SENDPROTOCONNECT handle 0x25de150; line 1561
>>> (connection #0)
>>> * Marked for [keep alive]: HTTP default
>>> * STATE: SENDPROTOCONNECT => DO handle 0x25de150; line 1579
>>> (connection #0)
 GET /test/request-dispatcher?jsp=1380%2B0.jsp HTTP/1.1
 Host: localhost:8080
 User-Agent: curl/7.58.0
 Accept: */*

>>> * STATE: DO => DO_DONE handle 0x25de150; line 1658 (connection #0)
>>> * STATE: DO_DONE => WAITPERFORM handle 0x25de150; line 1783
>>> (connection #0)
>>> * STATE: WAITPERFORM => PERFORM handle 0x25de150; line 1799
>>> (connection #0)
>>> * HTTP 1.1 or later with persistent connection, pipelining supported
>>> < HTTP/1.1 404
>>> < Content-Type: text/html;charset=utf-8
>>> < Content-Language: en
>>> < Content-Length: 1093
>>> < Date: Wed, 25 Jul 2018 19:44:30 GMT
>>
>> Now this one:
>>> $ curl -I http://localhost:8080/test/1380+0.jsp
>>> --verbose   * STATE: INIT => CONNECT handle
>>> 0x66e150; line 1392 (connection #-5000)
>>> * Added connection 0. The cache now contains 1 members
>>> * STATE: CONNECT => WAITRESOLVE handle 0x66e150; line 1428
>>> (connection #0)
>>>   % Total    % Received % Xferd  Average Speed   Time    Time
>>> Time  Current
>>>  Dload  Upload   Total   Spent   
>>> Left  Speed
>>>   0 0    0 0    0 0  0  0 --:--:-- --:--:--
>>> --:--:-- 0*   Trying ::1...
>>> * TCP_NODELAY set
>>> * STATE: WAITRESOLVE => WAITCONNECT handle 0x66e150; line 1509
>>> (connection #0)
>>> * Connected to localhost (::1) port 8080 (#0)
>>> * STATE: WAITCONNECT => SENDPROTOCONNECT handle 0x66e150; line 1561
>>> (connection #0)
>>> * Marked for [keep alive]: HTTP default
>>> * STATE: SENDPROTOCONNECT => DO handle 0x66e150; line 1579
>>> (connection #0)
 HEAD /test/1380+0.jsp HTTP/1.1
 Host: localhost:8080
 User-Agent: curl/7.58.0
 Accept: */*

>>> * STATE: DO => DO_DONE handle 0x66e150; line 1658 (connection #0)
>>> * STATE: DO_DONE => WAITPERFORM handle 0x66e150; line 1783
>>> (connection #0)
>>> * STATE: WAITPERFORM => PERFORM handle 0x66e150; line 1799
>>> (connection #0)
>>> * HTTP 1.1 or later with persistent connection, pipelining supported
>>> < HTTP/1.1 200
>>> < Set-Cookie: JSESSIONID=FC911829DB08950A03808483C61DFBDF;
>>> Path=/test; HttpOnly
>>> < Content-Type: text/html;charset=UTF-8
>>> < Transfer-Encoding: chunked
>>> < Date: Wed, 25 Jul 2018 19:45:12 GMT
>>
>> I know that #getRequestDispatcher() requires a RFC 3986 compliant URI
>> which this one is according to JS' encodeURI().
>>
>> The root cause, imho, is ApplicationContext.java:432:
>>> decodedPath = URLDecoder.decode(normalizedPath, "UTF-8");
>>
>> This is deemed to fail because URLDecoder has not been designed for
>> URIs, but for "This class contains static methods for decoding a
>> String from the application/x-www-form-urlencoded MIME format."
>>
>> It is used in
>>> ApplicationContext.java
>>> WebappLoader.java
>>> CGIServlet.java
>>> JspRuntimeContext.java
>>
>> I consider this to be a bug, I know that Tomcat has its own
>> URLEncoder, but it seems that we need a compliant URLDecoder or use
>> UDecoder?.
>>
>> Can someone confirm?
> 
> No opinion on? 

Re: Possible bug in HttpServletRequest#getRequestDispatcher()

2018-07-30 Thread Michael Osipov

Am 2018-07-25 um 22:13 schrieb Michael Osipov:

Hi folks,

I might have found a bug and looking for someone to confirm. (Tested in 
Tomcat 8.5.32).


Consider the following servlet:

@WebServlet("/request-dispatcher")
public class TestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

protected void doGet(HttpServletRequest request, 
HttpServletResponse response)

    throws ServletException, IOException {
    String jsp = request.getParameter("jsp");
    if (jsp == null || jsp.isEmpty())
    response.sendError(HttpServletResponse.SC_BAD_REQUEST);
    else {
    System.out.println("Requested JSP: " + jsp);
    RequestDispatcher dispatcher = 
request.getRequestDispatcher("/" + jsp);

    dispatcher.forward(request, response);
    }
}
}


Now this call:
$ curl --verbose 
http://localhost:8080/test/request-dispatcher?jsp=1380%2B0.jsp

* STATE: INIT => CONNECT handle 0x25de150; line 1392 (connection #-5000)
* Added connection 0. The cache now contains 1 members
* STATE: CONNECT => WAITRESOLVE handle 0x25de150; line 1428 
(connection #0)
  % Total    % Received % Xferd  Average Speed   Time    Time 
Time  Current
 Dload  Upload   Total   Spent
Left  Speed
  0 0    0 0    0 0  0  0 --:--:-- --:--:-- 
--:--:-- 0*   Trying ::1...

* TCP_NODELAY set
* STATE: WAITRESOLVE => WAITCONNECT handle 0x25de150; line 1509 
(connection #0)

* Connected to localhost (::1) port 8080 (#0)
* STATE: WAITCONNECT => SENDPROTOCONNECT handle 0x25de150; line 1561 
(connection #0)

* Marked for [keep alive]: HTTP default
* STATE: SENDPROTOCONNECT => DO handle 0x25de150; line 1579 
(connection #0)

GET /test/request-dispatcher?jsp=1380%2B0.jsp HTTP/1.1
Host: localhost:8080
User-Agent: curl/7.58.0
Accept: */*


* STATE: DO => DO_DONE handle 0x25de150; line 1658 (connection #0)
* STATE: DO_DONE => WAITPERFORM handle 0x25de150; line 1783 
(connection #0)
* STATE: WAITPERFORM => PERFORM handle 0x25de150; line 1799 
(connection #0)

* HTTP 1.1 or later with persistent connection, pipelining supported
< HTTP/1.1 404
< Content-Type: text/html;charset=utf-8
< Content-Language: en
< Content-Length: 1093
< Date: Wed, 25 Jul 2018 19:44:30 GMT


Now this one:
$ curl -I http://localhost:8080/test/1380+0.jsp 
--verbose   * STATE: INIT => CONNECT handle 
0x66e150; line 1392 (connection #-5000)

* Added connection 0. The cache now contains 1 members
* STATE: CONNECT => WAITRESOLVE handle 0x66e150; line 1428 (connection 
#0)
  % Total    % Received % Xferd  Average Speed   Time    Time 
Time  Current
 Dload  Upload   Total   Spent
Left  Speed
  0 0    0 0    0 0  0  0 --:--:-- --:--:-- 
--:--:-- 0*   Trying ::1...

* TCP_NODELAY set
* STATE: WAITRESOLVE => WAITCONNECT handle 0x66e150; line 1509 
(connection #0)

* Connected to localhost (::1) port 8080 (#0)
* STATE: WAITCONNECT => SENDPROTOCONNECT handle 0x66e150; line 1561 
(connection #0)

* Marked for [keep alive]: HTTP default
* STATE: SENDPROTOCONNECT => DO handle 0x66e150; line 1579 (connection 
#0)

HEAD /test/1380+0.jsp HTTP/1.1
Host: localhost:8080
User-Agent: curl/7.58.0
Accept: */*


* STATE: DO => DO_DONE handle 0x66e150; line 1658 (connection #0)
* STATE: DO_DONE => WAITPERFORM handle 0x66e150; line 1783 (connection 
#0)
* STATE: WAITPERFORM => PERFORM handle 0x66e150; line 1799 (connection 
#0)

* HTTP 1.1 or later with persistent connection, pipelining supported
< HTTP/1.1 200
< Set-Cookie: JSESSIONID=FC911829DB08950A03808483C61DFBDF; Path=/test; 
HttpOnly

< Content-Type: text/html;charset=UTF-8
< Transfer-Encoding: chunked
< Date: Wed, 25 Jul 2018 19:45:12 GMT


I know that #getRequestDispatcher() requires a RFC 3986 compliant URI 
which this one is according to JS' encodeURI().


The root cause, imho, is ApplicationContext.java:432:

decodedPath = URLDecoder.decode(normalizedPath, "UTF-8");


This is deemed to fail because URLDecoder has not been designed for 
URIs, but for "This class contains static methods for decoding a String 
from the application/x-www-form-urlencoded MIME format."


It is used in

ApplicationContext.java
WebappLoader.java
CGIServlet.java
JspRuntimeContext.java


I consider this to be a bug, I know that Tomcat has its own URLEncoder, 
but it seems that we need a compliant URLDecoder or use UDecoder?.


Can someone confirm?


No opinion on? Shall I create a bug report?

Michael


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



Possible bug in HttpServletRequest#getRequestDispatcher()

2018-07-25 Thread Michael Osipov

Hi folks,

I might have found a bug and looking for someone to confirm. (Tested in 
Tomcat 8.5.32).


Consider the following servlet:

@WebServlet("/request-dispatcher")
public class TestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

protected void doGet(HttpServletRequest request, HttpServletResponse 
response)
throws ServletException, IOException {
String jsp = request.getParameter("jsp");
if (jsp == null || jsp.isEmpty())
response.sendError(HttpServletResponse.SC_BAD_REQUEST);
else {
System.out.println("Requested JSP: " + jsp);
RequestDispatcher dispatcher = 
request.getRequestDispatcher("/" + jsp);
dispatcher.forward(request, response);
}
}
}


Now this call:

$ curl --verbose http://localhost:8080/test/request-dispatcher?jsp=1380%2B0.jsp
* STATE: INIT => CONNECT handle 0x25de150; line 1392 (connection #-5000)
* Added connection 0. The cache now contains 1 members
* STATE: CONNECT => WAITRESOLVE handle 0x25de150; line 1428 (connection #0)
  % Total% Received % Xferd  Average Speed   TimeTime Time  Current
 Dload  Upload   Total   SpentLeft  Speed
  0 00 00 0  0  0 --:--:-- --:--:-- --:--:-- 0* 
  Trying ::1...
* TCP_NODELAY set
* STATE: WAITRESOLVE => WAITCONNECT handle 0x25de150; line 1509 (connection #0)
* Connected to localhost (::1) port 8080 (#0)
* STATE: WAITCONNECT => SENDPROTOCONNECT handle 0x25de150; line 1561 
(connection #0)
* Marked for [keep alive]: HTTP default
* STATE: SENDPROTOCONNECT => DO handle 0x25de150; line 1579 (connection #0)

GET /test/request-dispatcher?jsp=1380%2B0.jsp HTTP/1.1
Host: localhost:8080
User-Agent: curl/7.58.0
Accept: */*


* STATE: DO => DO_DONE handle 0x25de150; line 1658 (connection #0)
* STATE: DO_DONE => WAITPERFORM handle 0x25de150; line 1783 (connection #0)
* STATE: WAITPERFORM => PERFORM handle 0x25de150; line 1799 (connection #0)
* HTTP 1.1 or later with persistent connection, pipelining supported
< HTTP/1.1 404
< Content-Type: text/html;charset=utf-8
< Content-Language: en
< Content-Length: 1093
< Date: Wed, 25 Jul 2018 19:44:30 GMT


Now this one:

$ curl -I http://localhost:8080/test/1380+0.jsp --verbose   * 
STATE: INIT => CONNECT handle 0x66e150; line 1392 (connection #-5000)
* Added connection 0. The cache now contains 1 members
* STATE: CONNECT => WAITRESOLVE handle 0x66e150; line 1428 (connection #0)
  % Total% Received % Xferd  Average Speed   TimeTime Time  Current
 Dload  Upload   Total   SpentLeft  Speed
  0 00 00 0  0  0 --:--:-- --:--:-- --:--:-- 0* 
  Trying ::1...
* TCP_NODELAY set
* STATE: WAITRESOLVE => WAITCONNECT handle 0x66e150; line 1509 (connection #0)
* Connected to localhost (::1) port 8080 (#0)
* STATE: WAITCONNECT => SENDPROTOCONNECT handle 0x66e150; line 1561 (connection 
#0)
* Marked for [keep alive]: HTTP default
* STATE: SENDPROTOCONNECT => DO handle 0x66e150; line 1579 (connection #0)

HEAD /test/1380+0.jsp HTTP/1.1
Host: localhost:8080
User-Agent: curl/7.58.0
Accept: */*


* STATE: DO => DO_DONE handle 0x66e150; line 1658 (connection #0)
* STATE: DO_DONE => WAITPERFORM handle 0x66e150; line 1783 (connection #0)
* STATE: WAITPERFORM => PERFORM handle 0x66e150; line 1799 (connection #0)
* HTTP 1.1 or later with persistent connection, pipelining supported
< HTTP/1.1 200
< Set-Cookie: JSESSIONID=FC911829DB08950A03808483C61DFBDF; Path=/test; HttpOnly
< Content-Type: text/html;charset=UTF-8
< Transfer-Encoding: chunked
< Date: Wed, 25 Jul 2018 19:45:12 GMT


I know that #getRequestDispatcher() requires a RFC 3986 compliant URI 
which this one is according to JS' encodeURI().


The root cause, imho, is ApplicationContext.java:432:

decodedPath = URLDecoder.decode(normalizedPath, "UTF-8");


This is deemed to fail because URLDecoder has not been designed for 
URIs, but for "This class contains static methods for decoding a String 
from the application/x-www-form-urlencoded MIME format."


It is used in

ApplicationContext.java
WebappLoader.java
CGIServlet.java
JspRuntimeContext.java


I consider this to be a bug, I know that Tomcat has its own URLEncoder, 
but it seems that we need a compliant URLDecoder or use UDecoder?.


Can someone confirm?

Michael

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