##// END OF EJS Templates
Switch CGI stdout to binary on windows...
Alexis S. L. Carvalho -
r4076:5a89c61c default
parent child Browse files
Show More
@@ -1,70 +1,72 b''
1 # hgweb/wsgicgi.py - CGI->WSGI translator
1 # hgweb/wsgicgi.py - CGI->WSGI translator
2 #
2 #
3 # Copyright 2006 Eric Hopper <hopper@omnifarious.org>
3 # Copyright 2006 Eric Hopper <hopper@omnifarious.org>
4 #
4 #
5 # This software may be used and distributed according to the terms
5 # This software may be used and distributed according to the terms
6 # of the GNU General Public License, incorporated herein by reference.
6 # of the GNU General Public License, incorporated herein by reference.
7 #
7 #
8 # This was originally copied from the public domain code at
8 # This was originally copied from the public domain code at
9 # http://www.python.org/dev/peps/pep-0333/#the-server-gateway-side
9 # http://www.python.org/dev/peps/pep-0333/#the-server-gateway-side
10
10
11 import os, sys
11 import os, sys
12 from mercurial import util
12
13
13 def launch(application):
14 def launch(application):
15 util.set_binary(sys.stdout)
14
16
15 environ = dict(os.environ.items())
17 environ = dict(os.environ.items())
16 environ['wsgi.input'] = sys.stdin
18 environ['wsgi.input'] = sys.stdin
17 environ['wsgi.errors'] = sys.stderr
19 environ['wsgi.errors'] = sys.stderr
18 environ['wsgi.version'] = (1, 0)
20 environ['wsgi.version'] = (1, 0)
19 environ['wsgi.multithread'] = False
21 environ['wsgi.multithread'] = False
20 environ['wsgi.multiprocess'] = True
22 environ['wsgi.multiprocess'] = True
21 environ['wsgi.run_once'] = True
23 environ['wsgi.run_once'] = True
22
24
23 if environ.get('HTTPS','off') in ('on','1'):
25 if environ.get('HTTPS','off') in ('on','1'):
24 environ['wsgi.url_scheme'] = 'https'
26 environ['wsgi.url_scheme'] = 'https'
25 else:
27 else:
26 environ['wsgi.url_scheme'] = 'http'
28 environ['wsgi.url_scheme'] = 'http'
27
29
28 headers_set = []
30 headers_set = []
29 headers_sent = []
31 headers_sent = []
30 out = sys.stdout
32 out = sys.stdout
31
33
32 def write(data):
34 def write(data):
33 if not headers_set:
35 if not headers_set:
34 raise AssertionError("write() before start_response()")
36 raise AssertionError("write() before start_response()")
35
37
36 elif not headers_sent:
38 elif not headers_sent:
37 # Before the first output, send the stored headers
39 # Before the first output, send the stored headers
38 status, response_headers = headers_sent[:] = headers_set
40 status, response_headers = headers_sent[:] = headers_set
39 out.write('Status: %s\r\n' % status)
41 out.write('Status: %s\r\n' % status)
40 for header in response_headers:
42 for header in response_headers:
41 out.write('%s: %s\r\n' % header)
43 out.write('%s: %s\r\n' % header)
42 out.write('\r\n')
44 out.write('\r\n')
43
45
44 out.write(data)
46 out.write(data)
45 out.flush()
47 out.flush()
46
48
47 def start_response(status, response_headers, exc_info=None):
49 def start_response(status, response_headers, exc_info=None):
48 if exc_info:
50 if exc_info:
49 try:
51 try:
50 if headers_sent:
52 if headers_sent:
51 # Re-raise original exception if headers sent
53 # Re-raise original exception if headers sent
52 raise exc_info[0], exc_info[1], exc_info[2]
54 raise exc_info[0], exc_info[1], exc_info[2]
53 finally:
55 finally:
54 exc_info = None # avoid dangling circular ref
56 exc_info = None # avoid dangling circular ref
55 elif headers_set:
57 elif headers_set:
56 raise AssertionError("Headers already set!")
58 raise AssertionError("Headers already set!")
57
59
58 headers_set[:] = [status, response_headers]
60 headers_set[:] = [status, response_headers]
59 return write
61 return write
60
62
61 result = application(environ, start_response)
63 result = application(environ, start_response)
62 try:
64 try:
63 for data in result:
65 for data in result:
64 if data: # don't send headers until body appears
66 if data: # don't send headers until body appears
65 write(data)
67 write(data)
66 if not headers_sent:
68 if not headers_sent:
67 write('') # send headers now if body was empty
69 write('') # send headers now if body was empty
68 finally:
70 finally:
69 if hasattr(result,'close'):
71 if hasattr(result,'close'):
70 result.close()
72 result.close()
General Comments 0
You need to be logged in to leave comments. Login now