Mercurial > p > roundup > code
comparison roundup/cgi/client.py @ 3628:ed76f7ee34c4
handle connection loss when responding to web requests
| author | Richard Jones <richard@users.sourceforge.net> |
|---|---|
| date | Tue, 06 Jun 2006 01:44:44 +0000 |
| parents | 04dc3eef67b7 |
| children | ff9f4ca42454 |
comparison
equal
deleted
inserted
replaced
| 3627:023b44bc95d5 | 3628:ed76f7ee34c4 |
|---|---|
| 1 # $Id: client.py,v 1.225 2006-04-27 04:03:11 richard Exp $ | 1 # $Id: client.py,v 1.226 2006-06-06 01:44:44 richard Exp $ |
| 2 | 2 |
| 3 """WWW request handler (also used in the stand-alone server). | 3 """WWW request handler (also used in the stand-alone server). |
| 4 """ | 4 """ |
| 5 __docformat__ = 'restructuredtext' | 5 __docformat__ = 'restructuredtext' |
| 6 | 6 |
| 7 import base64, binascii, cgi, codecs, mimetypes, os | 7 import base64, binascii, cgi, codecs, mimetypes, os |
| 8 import random, re, rfc822, stat, time, urllib, urlparse | 8 import random, re, rfc822, stat, time, urllib, urlparse |
| 9 import Cookie | 9 import Cookie, socket, errno |
| 10 | 10 |
| 11 from roundup import roundupdb, date, hyperdb, password | 11 from roundup import roundupdb, date, hyperdb, password |
| 12 from roundup.cgi import templating, cgitb, TranslationService | 12 from roundup.cgi import templating, cgitb, TranslationService |
| 13 from roundup.cgi.actions import * | 13 from roundup.cgi.actions import * |
| 14 from roundup.exceptions import * | 14 from roundup.exceptions import * |
| 819 | 819 |
| 820 def write(self, content): | 820 def write(self, content): |
| 821 if not self.headers_done: | 821 if not self.headers_done: |
| 822 self.header() | 822 self.header() |
| 823 if self.env['REQUEST_METHOD'] != 'HEAD': | 823 if self.env['REQUEST_METHOD'] != 'HEAD': |
| 824 self.request.wfile.write(content) | 824 try: |
| 825 self.request.wfile.write(content) | |
| 826 except socket.error, error: | |
| 827 # the end-user has gone away | |
| 828 if error.errno != errno.EPIPE: | |
| 829 raise | |
| 825 | 830 |
| 826 def write_html(self, content): | 831 def write_html(self, content): |
| 827 if not self.headers_done: | 832 if not self.headers_done: |
| 828 # at this point, we are sure about Content-Type | 833 # at this point, we are sure about Content-Type |
| 829 self.additional_headers['Content-Type'] = \ | 834 self.additional_headers['Content-Type'] = \ |
| 838 # recode output | 843 # recode output |
| 839 content = content.decode(self.STORAGE_CHARSET, 'replace') | 844 content = content.decode(self.STORAGE_CHARSET, 'replace') |
| 840 content = content.encode(self.charset, 'xmlcharrefreplace') | 845 content = content.encode(self.charset, 'xmlcharrefreplace') |
| 841 | 846 |
| 842 # and write | 847 # and write |
| 843 self.request.wfile.write(content) | 848 try: |
| 849 self.request.wfile.write(content) | |
| 850 except socket.error, error: | |
| 851 # the end-user has gone away | |
| 852 if error.errno != errno.EPIPE: | |
| 853 raise | |
| 844 | 854 |
| 845 def setHeader(self, header, value): | 855 def setHeader(self, header, value): |
| 846 '''Override a header to be returned to the user's browser. | 856 '''Override a header to be returned to the user's browser. |
| 847 ''' | 857 ''' |
| 848 self.additional_headers[header] = value | 858 self.additional_headers[header] = value |
