> From: André Warnier [a...@ice-sa.com]
> Sent: Thursday, December 26, 2013 2:11 PM
> To: Tomcat Users List
> Subject: Re: Request Timeout and empty post data issue
>
>Peter Rifel wrote:
>> Hello,
>>
>> I'm currently running Tomcat 7.0.42 on Ubuntu 12.04 with OpenJDK 1.7.0_25.  
>> I'm using Apache Tomcat Native library 1.1.27 with APR version 1.4.6.
>>
>> I'm noticing in my access logs that some of our POST requests don't have any 
>> POST data and all have response times of a few ms over 20000ms.  I'm trying 
>> to figure out whether this issue is client side or server side.  The 
>> response code and response size for these requests are normal.  Can anyone 
>> tell me under what circumstances this would happen?  I noticed that our 
>> connector's connectionTimeout is set to 20000ms, but it wouldn't make sense 
>> for that value to be a part of this issue because a connection timeout only 
>> occurs when the URI hasn't been received by tomcat in that amount of time, 
>> which is clearly not happening here (I was able to confirm this with telnet; 
>> a connection timeout will not write anything to the access logs).
>>
>> The "request" is making it to my servlet (logging confirms this) but for 
>> some reason tomcat doesn't see any request parameters and all of the 
>> response times in our access logs are just above 20 seconds.  Does this mean 
>> that my servlet is taking 20 seconds to process the request?  Is there some 
>> other timeout value somewhere that defaults to 20 seconds?  Is there a way 
>> for me to see exactly what is taking so long?  Its incredibly hard to debug 
>> this because we cant reproduce this bug on our own without any post data and 
>> <1% of our production traffic is having this issue.  To try and gather more 
>> info on this, I added a servlet filter that logs all of our POST request 
>> parameters to the access log and I can confirm that there are no parameters 
>> on these specific requests.
>>
>> The lack of post data makes me think its a client issue, but that doesn't 
>> explain why all of these requests take ~20 seconds to be processed.
>>
>> I'd appreciate any ideas on what could cause this.
>>
>
>Can't think of an answer yet, but what would help is if you posted the 
>corresponding
><Connector> configuration here.
>
>I am a bit puzzled by your description of the servlet filter above.
>How does it determine that the request has no POST parameters ?
>And how/what does it log to the Access log ?
>
>Also, can you get to the HTTP headers of the request, in this filter ?
>It may be useful to know what the request's "Content-length" header is saying.
>
>And one more thing : presumably, you know what kind of POST requests this is, 
>or what it
>should be.  What would a normal POST request of that kind look like ?
>For example if it was a valid/legitimate POST request of that kind from a 
>valid/legitimate
>client (browser ?), how large could it be, as a maximum ?
>
>
>---------------------------------------------------------------------
>To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
>For additional commands, e-mail: users-h...@tomcat.apache.org
>
>

Here is the <Connector> configuration:

<Connector executor="HttpThreadPool" port="8080" protocol="HTTP/1.1"
     pollerSize="25000" pollerThreadCount="2" 
     connectionTimeout="20000" redirectPort="8443" server="MixpoServer"
     maxPostSize="10485760"
     compression="on" 
compressableMimeType="text/html,text/plain,text/xml,application/xml,text/javascript"
 noCompressionUserAgents=".*MSIE[56].*"
/>


The filter is a snippet I found online while trying to debug this that just 
loops through the parameter names and values, creating a string:

public void doFilter(ServletRequest request, ServletResponse 
response,FilterChain chain) throws IOException, ServletException { 

        Enumeration<String> names = request.getParameterNames(); 
        StringBuffer output=new StringBuffer(); 
        while (names.hasMoreElements()) { 
                String name = names.nextElement(); 
                output.append(name+"="); 
                String values[] = request.getParameterValues(name); 
                for (int i = 0; i < values.length; i++) { 
                        if (i > 0) output.append("' "); 
                        output.append(values[i]); 
                } 
                if(names.hasMoreElements()) output.append("&"); 
        } 
        request.setAttribute("postdata", output); 
        chain.doFilter(request, response); 
}

Then I just added "%{postdata}r" to my access log valve format.  If you know of 
a better way of dumping POST data to a log of some sort without interfering 
with the servlet I'm open for alternatives.  I'll try and log the 
Content-length header as well.  The requests are made by a custom flash plugin 
that runs on all browsers, the post data is only plaintext: just a handful of 
name/value pairs.

Peter
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
For additional commands, e-mail: users-h...@tomcat.apache.org

Reply via email to