I've sent this to bugzilla #120.

If the content header length exceeds 2K Orion throws the following
exception:

Orion 1.3.8 throws an java.lang.ArrayIndexOutOfBoundsException
        at com.evermind.server.http.ek.uz(JAX)
        at com.evermind.server.http.EvermindHttpServletRequest.yl(JAX)
        at com.evermind.server.http.EvermindHttpServletRequest.x8(JAX)
        at
com.evermind.server.http.EvermindHttpServletRequest.getParameter(JAX)
        at com.evermind.server.http.HttpApplication.w5(JAX)
        at com.evermind.server.http.JSPServlet.service(JAX)
        at com.evermind.server.http.d1.si(JAX)
        at com.evermind.server.http.d1.forward(JAX)
        at com.evermind.server.http.ed.sp(JAX)
        at com.evermind.server.http.ed.so(JAX)
        at com.evermind.util.f.run(JAX)

This is the JSP I wrote to test this case: Set the "length for next action"
to 
1000 and hit next a couple of times and you will see the error.

Thanks,
- Jaideep Roy


------- Additional Comments From [EMAIL PROTECTED]
<mailto:[EMAIL PROTECTED]> 2000-10-16 22:21 -------
Here's the jsp:

<%@ page import="java.io.*" %>
<%@ page import="java.util.*" %>
<%@ page import="java.text.*" %>
<%@ page import="javax.servlet.*" %>
<%@ page import="javax.servlet.http.*" %>
<%@ page import="java.net.*" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
        <META HTTP-EQUIV="pragma" CONTENT="no-cache">
        <META HTTP-EQUIV="expires" CONTENT="Wed, 26 Feb 1997 08:21:55 GMT">
        <TITLE>Max Url Tester</TITLE>
</HEAD>
<BODY>
        <p> This JSP is to test sending URLs.  As the size of the action url
on 
the form 
        and the size of the what is stored in the headers nears 2000 bytes, 
Orion has 
        problems parsing the data.  This can be easily be reached by
submitting 
the form 
        twice while creating an form action of 1000 characters<p>
<%

        SimpleDateFormat formatter
             = new SimpleDateFormat ("yyyy.MM.dd G 'at' hh:mm:ss a zzz");
        Date currentTime_1 = new Date();
        String dateString = formatter.format(currentTime_1);
        out.print("<br> Current Time="+dateString); 


        // figure out the length of the headers
        int headLength = 0;
        int refererLength = 0;
        Enumeration e = request.getHeaderNames();

        for (; e!=null && e.hasMoreElements();)
        {
                String name = (String)e.nextElement();
                headLength += name.length();

                Enumeration ev = request.getHeaders(name);

                for (; ev!=null && ev.hasMoreElements();)
                {
                        String value = (String)ev.nextElement();
                        headLength += value.length();
                        if (name.equalsIgnoreCase("referer")) {
                                refererLength  += value.length();
                        }

                }

        } 
        String query = request.getQueryString();
        if (query == null) {
                query = "";
        }
        out.println("<br>headerLength="+headLength );
        out.println("<br> -- header.refererLength="+refererLength );
        int lastQueryLength = 8 + request.getServerName().length()
+request.getServletPath().length()+query.length(); 
        out.println("<br>last Query Length="+lastQueryLength);


        // create next action url
            String parm = "abcdefghijklmnopqrstuvwxyz0123456789";
            String urlLengthStr = request.getParameter("urllength");
            String parmLengthStr = request.getParameter("parmlength");
            int urlLength = 600;
            int parmLength = 20;
            if (urlLengthStr != null && urlLengthStr.length()>0) {
                                urlLengthStr = urlLengthStr.trim();
                    urlLength = Integer.parseInt(urlLengthStr);
            }
            if (parmLengthStr != null && parmLengthStr.length()>0) {
                                urlLengthStr = urlLengthStr.trim();
                parmLength = Integer.parseInt(parmLengthStr);
                if (parmLength < parm.length()) {
                    parm = parm.substring(0,parmLength);
                }

            }
            StringBuffer action = new StringBuffer();
            int i=1;
            action.append("<http://>" + request.getServerName()
+request.getServletPath());
            action.append('?');
            action.append("parm"+i);
            action.append('=');
            action.append(parm);
            while (action.length() < urlLength) {
                action.append('&');
                action.append("parm"+i);
                action.append('=');
                action.append(parm);
                                i++;
            }

        out.println("<br>next action len = "+action.length());
        int nextTotal = action.length() + headLength - refererLength + 
lastQueryLength;
        out.println("<br>next total request len = "+nextTotal);
        if (nextTotal > 2000) {
                out.println("<h1>Next submit will probably fail</h1>");
        }
        else if (nextTotal > 1900) {
                out.println("<h1>Next submit may fail</h1>");
        }
        else {
                int tooBig = nextTotal - lastQueryLength;
                out.println("<br>Next size without query="+tooBig);
        }
        

%>
<FORM NAME="MainForm" method ="Post" action = "<%=action.toString()%>">

<table width="100%" border=0 cellpadding=5>
        <tr>
        <td>&nbsp;&nbsp;
                Length for next action<INPUT TYPE="text" NAME="urllength" 
VALUE="<%="" +urlLength%>" size=33>
                </td>

        </tr>
        <tr>
        <td>&nbsp;&nbsp;
                Length for next parm<INPUT TYPE="text" NAME="parmlength" 
VALUE="<%="" +parmLength%>" size=33>
                </td>

        </tr>
       <INPUT TYPE="Hidden" NAME="myForm" VALUE="<%=parm%>">
</table>
<INPUT TYPE="SUBMIT" NAME="Next" VALUE="Next">

 </FORM>
<h1>Headers</h1>
<%
e = request.getHeaderNames();

for (; e!=null && e.hasMoreElements();)
{
        String name = (String)e.nextElement();
        out.print("<br>"+name);
        Enumeration ev = request.getHeaders(name);

        for (; ev!=null && ev.hasMoreElements();)
        {
                String value = (String)ev.nextElement();
                out.print(" -- "+value);

        }

}

        out.println("<h1>Request Info</h1>" );
        out.println("<br>last request="+request.getQueryString() );
        out.println("<br>content-length="+request.getContentLength());
        out.println("<br>path="+request.getServletPath());
        out.println("<br>next action url="+action.toString());
        
%>

</BODY>
</HTML>


Reply via email to