You have a global servlet variable 'trafficCop'. If two requests come in at
the same time, they will be sharing this variable. The code is not thread
safe.

Move your trafficCop instance variable - make it a local variable of the
doGet method, and invoke the constructor inside the doGet method. This
should solve your problem.

Andy

-----Original Message-----
From: Chris Bick [mailto:[EMAIL PROTECTED]]
Sent: 16 December 2002 17:36
To: Tomcat Users List
Subject: RE: Simultaneous request from same IP


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();

        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 your 
code.

-Tim

Chris Bick wrote:
> I've reproduced this problem with tomcat 3.2 and every version of 4.1
up
> to 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 object
are
> different.
> 
> 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]>

Reply via email to