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>
Length for next action<INPUT TYPE="text" NAME="urllength"
VALUE="<%="" +urlLength%>" size=33>
</td>
</tr>
<tr>
<td>
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>