test-hgweb-non-interactive.t
96 lines
| 2.6 KiB
| text/troff
|
Tads3Lexer
/ tests / test-hgweb-non-interactive.t
Matt Mackall
|
r12440 | Tests if hgweb can run without touching sys.stdin, as is required | ||
by the WSGI standard and strictly implemented by mod_wsgi. | ||||
Martin Geisler
|
r13956 | $ hg init repo | ||
Matt Mackall
|
r12440 | $ cd repo | ||
$ echo foo > bar | ||||
$ hg add bar | ||||
$ hg commit -m "test" | ||||
$ cat > request.py <<EOF | ||||
timeless
|
r28859 | > from __future__ import absolute_import | ||
> import os | ||||
> import sys | ||||
> from mercurial import ( | ||||
> dispatch, | ||||
Matt Harbison
|
r39949 | > encoding, | ||
timeless
|
r28859 | > hg, | ||
Matt Harbison
|
r39949 | > pycompat, | ||
timeless
|
r28859 | > ui as uimod, | ||
timeless
|
r28861 | > util, | ||
timeless
|
r28859 | > ) | ||
> ui = uimod.ui | ||||
> from mercurial.hgweb.hgweb_mod import ( | ||||
> hgweb, | ||||
> ) | ||||
timeless
|
r28861 | > stringio = util.stringio | ||
Matt Mackall
|
r12440 | > | ||
> class FileLike(object): | ||||
> def __init__(self, real): | ||||
> self.real = real | ||||
> def fileno(self): | ||||
> print >> sys.__stdout__, 'FILENO' | ||||
> return self.real.fileno() | ||||
> def read(self): | ||||
> print >> sys.__stdout__, 'READ' | ||||
> return self.real.read() | ||||
> def readline(self): | ||||
> print >> sys.__stdout__, 'READLINE' | ||||
> return self.real.readline() | ||||
> | ||||
> sys.stdin = FileLike(sys.stdin) | ||||
timeless
|
r28861 | > errors = stringio() | ||
> input = stringio() | ||||
> output = stringio() | ||||
Matt Mackall
|
r12440 | > | ||
> def startrsp(status, headers): | ||||
Augie Fackler
|
r33686 | > print('---- STATUS') | ||
> print(status) | ||||
> print('---- HEADERS') | ||||
> print([i for i in headers if i[0] != 'ETag']) | ||||
> print('---- DATA') | ||||
Adrian Buehlmann
|
r12743 | > return output.write | ||
Matt Mackall
|
r12440 | > | ||
> env = { | ||||
Adrian Buehlmann
|
r12743 | > 'wsgi.version': (1, 0), | ||
> 'wsgi.url_scheme': 'http', | ||||
> 'wsgi.errors': errors, | ||||
> 'wsgi.input': input, | ||||
> 'wsgi.multithread': False, | ||||
> 'wsgi.multiprocess': False, | ||||
> 'wsgi.run_once': False, | ||||
> 'REQUEST_METHOD': 'GET', | ||||
> 'SCRIPT_NAME': '', | ||||
> 'PATH_INFO': '', | ||||
> 'QUERY_STRING': '', | ||||
Jun Wu
|
r31008 | > 'SERVER_NAME': '$LOCALIP', | ||
Adrian Buehlmann
|
r12743 | > 'SERVER_PORT': os.environ['HGPORT'], | ||
> 'SERVER_PROTOCOL': 'HTTP/1.0' | ||||
Matt Mackall
|
r12440 | > } | ||
> | ||||
Pulkit Goyal
|
r39694 | > i = hgweb(b'.') | ||
Gregory Szorc
|
r26247 | > for c in i(env, startrsp): | ||
> pass | ||||
Matt Harbison
|
r39949 | > sys.stdout.flush() | ||
> pycompat.stdout.write(b'---- ERRORS\n') | ||||
> pycompat.stdout.write(b'%s\n' % errors.getvalue()) | ||||
Augie Fackler
|
r33686 | > print('---- OS.ENVIRON wsgi variables') | ||
> print(sorted([x for x in os.environ if x.startswith('wsgi')])) | ||||
> print('---- request.ENVIRON wsgi variables') | ||||
Gregory Szorc
|
r26220 | > with i._obtainrepo() as repo: | ||
Matt Harbison
|
r39949 | > print(sorted([encoding.strfromlocal(x) for x in repo.ui.environ | ||
> if x.startswith(b'wsgi')])) | ||||
Matt Mackall
|
r12440 | > EOF | ||
Matt Harbison
|
r39743 | $ "$PYTHON" request.py | ||
Matt Mackall
|
r12440 | ---- STATUS | ||
200 Script output follows | ||||
---- HEADERS | ||||
[('Content-Type', 'text/html; charset=ascii')] | ||||
---- DATA | ||||
---- ERRORS | ||||
---- OS.ENVIRON wsgi variables | ||||
[] | ||||
---- request.ENVIRON wsgi variables | ||||
['wsgi.errors', 'wsgi.input', 'wsgi.multiprocess', 'wsgi.multithread', 'wsgi.run_once', 'wsgi.url_scheme', 'wsgi.version'] | ||||
Mads Kiilerich
|
r16913 | |||
$ cd .. | ||||