You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@mina.apache.org by "chenqiang (JIRA)" <ji...@apache.org> on 2017/10/11 06:39:00 UTC

[jira] [Updated] (DIRMINA-1074) HttpServerDecoder bug

     [ https://issues.apache.org/jira/browse/DIRMINA-1074?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

chenqiang updated DIRMINA-1074:
-------------------------------
    Description: 
I used TCP to simulate a non normal HTTP get request
        StringBuilder sb = new StringBuilder("GET");
        sb.append(" ");
        sb.append("/system.ini?loginuse&loginpas");
        sb.append(" ");
        sb.append("HTTP/1.1");
        sb.append("\r\n");

        sb.append("Connection");
        sb.append(": ");
        sb.append("keep-alive");
        sb.append("\r\n");

        sb.append("Host");
        sb.append(": ");
        sb.append("host");
        sb.append("\r\n");
        sb.append("\r\n");
        //error data
        sb.append("000");
        sb.append("000");
        byte[] bytes = sb.toString().getBytes();
        Socket socket = new Socket("localhost", 8001);
        OutputStream outputStream = socket.getOutputStream();
        outputStream.write(bytes);
        outputStream.flush();

After parsing a request, HttpServerDecoder returns to ProtocolCodecFilter,
When you find that there is data in buffer, you will continue to call the HttpServerDecoder.decode method

Since the request header string is used directly in parseHttpRequestHead (buffer.array), the program is stuck in a dead loop
      final String raw = new String(buffer.array(), 0, buffer.limit());




  was:
我使用tcp模拟了一个非正常的http get请求
        StringBuilder sb = new StringBuilder("GET");
        sb.append(" ");
        sb.append("/system.ini?loginuse&loginpas");
        sb.append(" ");
        sb.append("HTTP/1.1");
        sb.append("\r\n");

        sb.append("Connection");
        sb.append(": ");
        sb.append("keep-alive");
        sb.append("\r\n");

        sb.append("Host");
        sb.append(": ");
        sb.append("host");
        sb.append("\r\n");
        sb.append("\r\n");
        //error data
        sb.append("000");
        sb.append("000");
        byte[] bytes = sb.toString().getBytes();
        Socket socket = new Socket("localhost", 8001);
        OutputStream outputStream = socket.getOutputStream();
        outputStream.write(bytes);
        outputStream.flush();

After parsing a request, HttpServerDecoder returns to ProtocolCodecFilter,
When you find that there is data in buffer, you will continue to call the HttpServerDecoder.decode method

Since the request header string is used directly in parseHttpRequestHead (buffer.array), the program is stuck in a dead loop
      final String raw = new String(buffer.array(), 0, buffer.limit());





> HttpServerDecoder bug
> ---------------------
>
>                 Key: DIRMINA-1074
>                 URL: https://issues.apache.org/jira/browse/DIRMINA-1074
>             Project: MINA
>          Issue Type: Bug
>          Components: Protocol - HTTP
>    Affects Versions: 2.0.16
>            Reporter: chenqiang
>
> I used TCP to simulate a non normal HTTP get request
>         StringBuilder sb = new StringBuilder("GET");
>         sb.append(" ");
>         sb.append("/system.ini?loginuse&loginpas");
>         sb.append(" ");
>         sb.append("HTTP/1.1");
>         sb.append("\r\n");
>         sb.append("Connection");
>         sb.append(": ");
>         sb.append("keep-alive");
>         sb.append("\r\n");
>         sb.append("Host");
>         sb.append(": ");
>         sb.append("host");
>         sb.append("\r\n");
>         sb.append("\r\n");
>         //error data
>         sb.append("000");
>         sb.append("000");
>         byte[] bytes = sb.toString().getBytes();
>         Socket socket = new Socket("localhost", 8001);
>         OutputStream outputStream = socket.getOutputStream();
>         outputStream.write(bytes);
>         outputStream.flush();
> After parsing a request, HttpServerDecoder returns to ProtocolCodecFilter,
> When you find that there is data in buffer, you will continue to call the HttpServerDecoder.decode method
> Since the request header string is used directly in parseHttpRequestHead (buffer.array), the program is stuck in a dead loop
>       final String raw = new String(buffer.array(), 0, buffer.limit());



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)