ACK, RST for IE7 only on form submit

46 views
Skip to first unread message

John Harrison

unread,
May 6, 2011, 2:28:33 PM5/6/11
to Paste Users
I have a problem in a web application that I've manages to reduce to a
simple test case. I have a pylons application (a single page) running
on paste. When I submit a form via POST with a significant amount of
data IE7 and the server don't play nicely with each other. Oddly IE8
and all other browsers work well. Unfortunately my client is on IE7
for the foreseeable future.

I have verified this behavior on Ubuntu 10 under python 2.6 and Ubuntu
11 with python 2.7. In both cases I have a fresh install of the OS
and used a virtual environment to install pylons (easy_install -UZ
pylons) and its dependencies.

I follow the instructions on:
http://docs.pylonsproject.org/projects/pylons_framework/dev/gettingstarted.html

to create a hello world application. I then create a hello.mako
template in the appropriate directory that looks like this:


<!DOCTYPE HTML>
<html>
<head>
<title>Minimal test page</title>
</head>
<body>
<h1>FOO</h1>

<form name="input" action="/hello/index" method="post">
<input type="hidden" id="foo0" name="fooname0"
value="somevaluevalue0" />
<input type="hidden" id="foo1" name="fooname1"
value="somevaluevalue1" />
<input type="hidden" id="foo2" name="fooname2"
value="somevaluevalue2" />
<input type="hidden" id="foo3" name="fooname3"
value="somevaluevalue3" />
<input type="hidden" id="foo4" name="fooname4"
value="somevaluevalue4" />
<input type="hidden" id="foo5" name="fooname5"
value="somevaluevalue5" />
<input type="hidden" id="foo6" name="fooname6"
value="somevaluevalue6" />
<input type="hidden" id="foo7" name="fooname7"
value="somevaluevalue7" />
<input type="hidden" id="foo8" name="fooname8"
value="somevaluevalue8" />
<input type="hidden" id="foo9" name="fooname9"
value="somevaluevalue9" />
<input type="hidden" id="foo10" name="fooname10"
value="somevaluevalue10"/>
<input type="hidden" id="foo11" name="fooname11"
value="somevaluevalue11"/>
<input type="hidden" id="foo12" name="fooname12"
value="somevaluevalue12"/>
<input type="hidden" id="foo13" name="fooname13"
value="somevaluevalue13"/>
<input type="hidden" id="foo14" name="fooname14"
value="somevaluevalue14"/>
<input type="hidden" id="foo15" name="fooname15"
value="somevaluevalue15"/>
<input type="hidden" id="foo16" name="fooname16"
value="somevaluevalue16"/>
<input type="hidden" id="foo17" name="fooname17"
value="somevaluevalue17"/>
<input type="hidden" id="foo18" name="fooname18"
value="somevaluevalue18"/>
<input type="hidden" id="foo19" name="fooname19"
value="somevaluevalue19"/>
<input type="hidden" id="foo20" name="fooname20"
value="somevaluevalue20"/>
<input type="hidden" id="foo21" name="fooname21"
value="somevaluevalue21"/>
<input type="hidden" id="foo22" name="fooname22"
value="somevaluevalue22"/>
<input type="hidden" id="foo23" name="fooname23"
value="somevaluevalue23"/>
<input type="hidden" id="foo24" name="fooname24"
value="somevaluevalue24"/>
<input type="hidden" id="foo25" name="fooname25"
value="somevaluevalue25"/>
<input type="hidden" id="foo26" name="fooname26"
value="somevaluevalue26"/>
<input type="hidden" id="foo27" name="fooname27"
value="somevaluevalue27"/>
<input type="hidden" id="foo28" name="fooname28"
value="somevaluevalue28"/>
<input type="hidden" id="foo29" name="fooname29"
value="somevaluevalue29"/>
<input type="hidden" id="foo30" name="fooname30"
value="somevaluevalue30"/>
<input type="hidden" id="foo31" name="fooname31"
value="somevaluevalue31"/>
<input type="hidden" id="foo32" name="fooname32"
value="somevaluevalue32"/>
<input type="hidden" id="foo33" name="fooname33"
value="somevaluevalue33"/>
<input type="hidden" id="foo34" name="fooname34"
value="somevaluevalue34"/>
<input type="hidden" id="foo35" name="fooname35"
value="somevaluevalue35"/>
<input type="hidden" id="foo36" name="fooname36"
value="somevaluevalue36"/>
<input type="hidden" id="foo37" name="fooname37"
value="somevaluevalue37"/>
<input type="hidden" id="foo38" name="fooname38"
value="somevaluevalue38"/>
<input type="hidden" id="foo39" name="fooname39"
value="somevaluevalue39"/>
<input type="hidden" id="foo40" name="fooname40"
value="somevaluevalue40"/>
<input type="hidden" id="foo41" name="fooname41"
value="somevaluevalue41"/>
<input type="hidden" id="foo42" name="fooname42"
value="somevaluevalue42"/>
<input type="hidden" id="foo43" name="fooname43"
value="somevaluevalue43"/>
<input type="hidden" id="foo44" name="fooname44"
value="somevaluevalue44"/>
<input type="hidden" id="foo45" name="fooname45"
value="somevaluevalue45"/>
<input type="hidden" id="foo46" name="fooname46"
value="somevaluevalue46"/>
<input type="hidden" id="foo47" name="fooname47"
value="somevaluevalue47"/>
<input type="hidden" id="foo48" name="fooname48"
value="somevaluevalue48"/>
<input type="hidden" id="foo49" name="fooname49"
value="somevaluevalue49"/>
<input type="hidden" id="foo50" name="fooname50"
value="somevaluevalue50"/>
<input type="hidden" id="foo51" name="fooname51"
value="somevaluevalue51"/>
<input type="hidden" id="foo52" name="fooname52"
value="somevaluevalue52"/>
<input type="hidden" id="foo53" name="fooname53"
value="somevaluevalue53"/>
<input type="hidden" id="foo54" name="fooname54"
value="somevaluevalue54"/>
<input type="hidden" id="foo55" name="fooname55"
value="somevaluevalue55"/>
<input type="hidden" id="foo56" name="fooname56"
value="somevaluevalue56"/>
<input type="hidden" id="foo57" name="fooname57"
value="somevaluevalue57"/>
<input type="hidden" id="foo58" name="fooname58"
value="somevaluevalue58"/>
<input type="hidden" id="foo59" name="fooname59"
value="somevaluevalue59"/>
<input type="hidden" id="foo60" name="fooname60"
value="somevaluevalue60"/>
<input type="hidden" id="foo61" name="fooname61"
value="somevaluevalue61"/>
<input type="hidden" id="foo62" name="fooname62"
value="somevaluevalue62"/>
<input type="hidden" id="foo63" name="fooname63"
value="somevaluevalue63"/>
<input type="hidden" id="foo64" name="fooname64"
value="somevaluevalue64"/>
<input type="hidden" id="foo65" name="fooname65"
value="somevaluevalue65"/>
<input type="hidden" id="foo66" name="fooname66"
value="somevaluevalue66"/>
<input type="hidden" id="foo67" name="fooname67"
value="somevaluevalue67"/>
<input type="hidden" id="foo68" name="fooname68"
value="somevaluevalue68"/>
<input type="hidden" id="foo69" name="fooname69"
value="somevaluevalue69"/>
<input type="hidden" id="foo70" name="fooname70"
value="somevaluevalue70"/>
<input type="hidden" id="foo71" name="fooname71"
value="somevaluevalue71"/>
<input type="hidden" id="foo72" name="fooname72"
value="somevaluevalue72"/>
<input type="hidden" id="foo73" name="fooname73"
value="somevaluevalue73"/>
<input type="hidden" id="foo74" name="fooname74"
value="somevaluevalue74"/>
<input type="hidden" id="foo75" name="fooname75"
value="somevaluevalue75"/>
<input type="hidden" id="foo76" name="fooname76"
value="somevaluevalue76"/>
<input type="hidden" id="foo77" name="fooname77"
value="somevaluevalue77"/>
<input type="hidden" id="foo78" name="fooname78"
value="somevaluevalue78"/>
<input type="hidden" id="foo79" name="fooname79"
value="somevaluevalue79"/>
<input type="hidden" id="foo80" name="fooname80"
value="somevaluevalue80"/>
<input type="hidden" id="foo81" name="fooname81"
value="somevaluevalue81"/>
<input type="hidden" id="foo82" name="fooname82"
value="somevaluevalue82"/>
<input type="hidden" id="foo83" name="fooname83"
value="somevaluevalue83"/>
<input type="hidden" id="foo84" name="fooname84"
value="somevaluevalue84"/>
<input type="hidden" id="foo85" name="fooname85"
value="somevaluevalue85"/>
<input type="hidden" id="foo86" name="fooname86"
value="somevaluevalue86"/>
<input type="hidden" id="foo87" name="fooname87"
value="somevaluevalue87"/>
<input type="hidden" id="foo88" name="fooname88"
value="somevaluevalue88"/>
<input type="hidden" id="foo89" name="fooname89"
value="somevaluevalue89"/>
<input type="hidden" id="foo90" name="fooname90"
value="somevaluevalue90"/>
<input type="hidden" id="foo91" name="fooname91"
value="somevaluevalue91"/>
<input type="hidden" id="foo92" name="fooname92"
value="somevaluevalue92"/>
<input type="hidden" id="foo93" name="fooname93"
value="somevaluevalue93"/>
<input type="hidden" id="foo94" name="fooname94"
value="somevaluevalue94"/>
<input type="hidden" id="foo95" name="fooname95"
value="somevaluevalue95"/>
<input type="hidden" id="foo96" name="fooname96"
value="somevaluevalue96"/>
<input type="hidden" id="foo97" name="fooname97"
value="somevaluevalue97"/>
<input type="hidden" id="foo98" name="fooname98"
value="somevaluevalue98"/>
<input type="hidden" id="foo99" name="fooname99"
value="somevaluevalue99"/>
<input type="submit" value="Submit" />
</form>
</body>
</html>

and I modify the hello.py controller by uncommenting the render line
and deleting the return ('hello world') line:


import logging

from pylons import request, response, session, tmpl_context as c, url
from pylons.controllers.util import abort, redirect

from helloworld.lib.base import BaseController, render

log = logging.getLogger(__name__)

class HelloController(BaseController):

def index(self):
# Return a rendered template
return render('/hello.mako')


All browsers render the /hello/index page properly. When I hit submit
most browsers properly return me to the page. IE7 however does not.
Instead it displays a "Internet Explorer cannot display the webpage"
error.

There is no exception or error that I can see in the web application.
The HelloController is called and returns data. I have watched all
this in WireShark and what happens is that after sending data the
server sends a ACK RST packet and that is what ends things for IE7.

I'm happy to post additional configuration details or even WireShark
traces. This is driving me nuts.

I've posted to the Pylons list, but as best I can tell there is not a
problem in Pylons, but lower down the software stack. Is this a paste
bug?

Any help or suggestions would be appreciated.

Best regards,
John

John Harrison

unread,
May 9, 2011, 4:03:04 PM5/9/11
to Paste Users
Here's some additional information. I've ported my small test case to
CherryPy and it doesn't break there. Anybody have any idea what is
going on in Paste?

Jon Nelson

unread,
May 9, 2011, 4:08:27 PM5/9/11
to John Harrison, Paste Users

Paste is probably reading 2 bytes too few.
For a long, long time some browsers, when POSTing, send an *extra*
CRLF above and beyond the content-length they _say_ they will.
IF these bytes do not get read out of the kernel buffers, and the
socket is closed, TCP/IP mandates a TCP RESET.

Without knowing more details, this is my guess.


--
Jon

John Harrison

unread,
May 9, 2011, 4:49:19 PM5/9/11
to Paste Users


On May 9, 2:08 pm, Jon Nelson <jnelson+pa...@jamponi.net> wrote:
> On Mon, May 9, 2011 at 3:03 PM, John Harrison <johnharri...@gmail.com> wrote:
> > Here's some additional information.  I've ported my small test case to
> > CherryPy and it doesn't break there.  Anybody have any idea what is
> > going on in Paste?
>
> Paste is probably reading 2 bytes too few.
> For a long, long time some browsers, when POSTing, send an *extra*
> CRLF above and beyond the content-length they _say_ they will.
> IF these bytes do not get read out of the kernel buffers, and the
> socket is closed, TCP/IP mandates a TCP RESET.
>
> Without knowing more details, this is my guess.

Excellent! This got me to the solution of the problem.

I have verified in WireShark sessions that IE7 is sending a CRLF at
the end of the POST request. Oddly on my old server this doesn't
cause problems, but this is what is causing problems on the new one.

Here is a MS article on the problem with a registry fix:
http://support.microsoft.com/kb/823099

I don't know that I'll be able to get all the users to apply this, but
I'm happy to at least be able to point the finger directly at IE7.

Thanks!
John
Reply all
Reply to author
Forward
0 new messages