Stephan Diehl schrieb:
> I'm a longtime user of WebWare. I just stumbled over some pretty
> strange problem. The Application running on Webware is a kind of
> Document Management system that can contain quite huge files (ISO
> images). When somebody is downloading such a file and cancels the
> download, the application eats up more and more memory. It looks like
> the application tries to deliver the content, but, instead of
> delivering it to the client (who's not longer there), caches
> everything in memory. This is the newest version of WebWare.
>
> I've done the following change:
> In WebKit/ThreadedAppServer.py
>
> 741 def flush(self):
> 742 """Flush stream.
> ...
> 753 while sent < reslen:
> 754 try:
> 755 sent += self._socket.send(
> 756 self._buffer[sent:sent+8192])
> 757 except socket.error, e:
> 758 if e[0] == errno.EPIPE: # broken pipe
> 759 pass
> 760 elif hasattr(errno, 'ECONNRESET') \
> 761 and e[0] == errno.ECONNRESET:
> 762 pass
> 763 else:
> 764 print "StreamOut Error: ", e
> 765 break
> 766 self.pop(sent)
>
> I've changed line 759 from 'pass' to 'raise', which now gives ugly
> tracebacks in the logs, but other than that, does what should happen
> anyway: cancel the download.
Hi Stephan,
thanks for the bug report. I think you're right, this is a problem.
By the way, on Windows you get an ECONNABORTED error in the same
situation, not an EPIPE error. So I think ECONNABORTED should be treated
the same way as the other two errors in the flush method.
For a fix of the problem, I suggest the following:
In ASSStreamOut.py:
Above the definition of the ASStreamOut class, insert:
class ConnectionAbortedError(Exception):
pass
Below, replace the 2 lines beginning:
assert not self._closed, ...
with:
if self._closed: raise ConnectionAbortedError
In ThreadedAppServer.py:
Above the definition of the ThreadedAppServer class, insert:
from ASStreamOut import ConnectionAbortedError
In the TASASStreamOut.flush() method, insert this line
before the break statement:
self._closed = True
To avoid the ugly tracebacks, insert the following lines between
the call of handler.handleRequest() and the following except:,
indented with the correct amount (both "excepts" on the same level):
except ConnectionAbortedError:
if self._verbose:
sys.stdout.write('%5i %s connection aborted\n'
% (handler._requestID, timestamp()['pretty']))
If you confirm that this fixes your problems and nobody disagrees, I
will fix it this way in the trunk.
> P.S.: I know this is quite a political issue, but is there a chance to
> change from tabs to spaces in Webware code?
I think this question should go directly to Chuck, our BDFL who had been
strongly against this in the past. I vote for a change as well.
-- Christoph
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys-and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Webware-discuss mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/webware-discuss