The trafficCop object has a method called add() which (seems to) acts on instance variables inside of the trafficCop object. This makes the trafficCop object not thread safe.
-Tim
Chris Bick wrote:
Why does that effect the HttpServletRequest object? If you look at the
code it evaluates the header and query string values before I access the
trafficcop object. I will give it a try.
-cb
-----Original Message-----
From: Tim Funk [mailto:[EMAIL PROTECTED]] Sent: Monday, December 16, 2002 12:40 PM
To: Tomcat Users List
Subject: Re: Simultaneous request from same IP
Is TrafficCop.java thread safe?
If not - that is your problem. Both requests are using the same trafficCop instance.
-Tim
Chris Bick wrote:
No offense taken. I still can't believe that this problem may exist. If you can find a problem with my code, that would be much easy then getting a fix into tomcat.Thanks, -cb import javax.servlet.*; import javax.servlet.http.*; import java.io.*; import java.util.*; import java.net.*; /** * <p>Title: </p> * <p>Description: </p> * <p>Copyright: Copyright (c) 2002</p> * <p>Company: </p> * @author not attributable * @version 1.0 */ public class TrafficCopServlet extends HttpServlet { private static final String CONTENT_TYPE_XML = "text/xml"; private static final String CONTENT_TYPE_HTML = "text/html"; /**@todo set DTD*/ private static final String DOC_TYPE = null; //Initialize global variables private TrafficCop trafficCop; public void init() throws ServletException { trafficCop = new TrafficCop(false); } //Process the HTTP Get request public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); try { if (request.getRequestURI().endsWith("/insert")) { response.setContentType(CONTENT_TYPE_XML); out.println("<?xml version=\"1.0\"?>"); String pcpVersion = request.getHeader("PCP-Client-Version"); String clientId = request.getHeader("PCP-Client-ID"); String listenIP = request.getHeader("Listen-IP"); String behindFirewall = request.getHeader("Behind-Firewall"); String urn = request.getQueryString(); synchronized(System.out) { System.out.println("URN:" + request.getQueryString()); System.out.println(request.getHeader("Listen-IP")); } //System.out.println("Listen-IP:" + listenIP); if (pcpVersion == null || clientId == null || listenIP == null || behindFirewall == null || urn == null) { String error = "<error>Bad Headers</error>"; out.println(error); return; } String xml = trafficCop.add(urn,new URL(null,"pcp://"+listenIP,new Handler()), new Boolean(behindFirewall).booleanValue(), 0); System.out.println(xml); out.println(xml); } else if (request.getRequestURI().endsWith("/delete")) { response.setContentType(CONTENT_TYPE_XML); out.println("<?xml version=\"1.0\"?>"); String clientId = request.getHeader("PCP-Client-ID"); String sessionId = request.getHeader("My-Session-ID"); String deleteSessionId =request.getHeader("Delete-Session-ID");String listenIP = request.getHeader("Listen-IP"); String behindFirewall = request.getHeader("Behind-Firewall"); String completed = request.getHeader("Completed"); String elapsedTime = request.getHeader("Elapsed-Time"); String avgDownstream =request.getHeader("Average-Downstream");String urn = request.getQueryString();your
if (clientId == null || sessionId == null ||
deleteSessionId == null || listenIP == null ||
behindFirewall == null)
{
String error = "<error>Bad Headers</error>";
out.println(error);
return;
}
String xml = trafficCop.remove(urn, deleteSessionId,
sessionId,new URL(null,"pcp://"+listenIP, new Handler()),
new
Boolean(behindFirewall).booleanValue(),0,0);
System.out.println(xml);
out.println(xml);
}
else if (request.getRequestURI().endsWith("/update"))
{
response.setContentType(CONTENT_TYPE_XML);
out.println("<?xml version=\"1.0\"?>");
String clientId = request.getHeader("PCP-Client-ID");
String sessionId = request.getHeader("My-Session-ID");
String listenIP = request.getHeader("Listen-IP");
String behindFirewall = request.getHeader("Behind-Firewall");
String urn = request.getQueryString();
if (clientId == null || sessionId == null ||
listenIP == null || behindFirewall == null)
{
String error = "<error>Bad Headers</error>";
out.println(error);
return;
}
String xml = trafficCop.connectionUpdate(urn, sessionId,new
URL(null,"pcp://"+listenIP,new Handler()),
new
Boolean(behindFirewall).booleanValue(),0,0);
System.out.println(xml);
out.println(xml);
}
}
catch (Exception e)
{
out.println("<error>"+e.getMessage()+"</error>");
e.printStackTrace();
}
}
}
-----Original Message-----
From: Tim Funk [mailto:[EMAIL PROTECTED]] Sent: Monday, December 16, 2002 12:21 PM
To: Tomcat Users List
Subject: Re: Simultaneous request from same IP
Can you post an example servlet (or the real code) that can reproduce this? (No offense but ...) I really think there ios something with
code. -Tim Chris Bick wrote:I've reproduced this problem with tomcat 3.2 and every version of 4.1upto 4.1.12 I haven't gone any further than all headers being identical and the query string. I thought maybe tomcat was just passing in the same reference, but the toString() value of the HttpServletRequest objectaredifferent. Let me know if anyone can reproduce this?(If you have the time...)-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]> -- To unsubscribe, e-mail:<mailto:[EMAIL PROTECTED]>For additional commands, e-mail:<mailto:[EMAIL PROTECTED]>-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]> -- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>
