File: testserver.py

package info (click to toggle)
emacs-request 0.3.3-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 236 kB
  • sloc: lisp: 1,985; python: 105; makefile: 4
file content (148 lines) | stat: -rw-r--r-- 4,090 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
import os

from flask import (
    Flask, Response, request, session, redirect, abort, jsonify)
from werkzeug.http import HTTP_STATUS_CODES

app = Flask(__name__)
app.secret_key = 'SECRET-KEY-FOR-EMACS-REQUEST-DEVELOPMENT'

all_methods = ['GET', 'POST', 'PUT', 'DELETE']


# View functions


@app.route('/report/<path:path>', methods=all_methods)
def page_report(path):
    """
    Report back path, input data, parameter, etc. as JSON.
    """
    # see: http://flask.pocoo.org/docs/api/#incoming-request-data
    return jsonify(dict(
        path=path,
        data=request.data,
        form=request.form,
        files=[dict(name=k, filename=f.filename, data=f.read())
               for (k, f) in request.files.items()],
        args=request.args,
        cookies=request.cookies,
        method=request.method,
        json=request.json,
        username=session.get('username'),
    ))

@app.route('/longtextline', methods=['GET'])
def get_longline():
    return Response('.'*10000, mimetype='text/plain')

@app.route('/redirect/<path:path>', methods=all_methods)
def page_redirect(path):
    return redirect('/' + path)


@app.route('/broken_redirect/<path:path>', methods=all_methods)
def page_broken_redirect(path):
    """
    A pathological redirection.  Location does not contain the scheme part.
    """
    response = redirect(path)
    response.headers['Location'] = '/' + path  # URL w/o scheme part
    response.autocorrect_location_header = False
    return response


@app.route('/code/<int:code>')
def page_code(code):
    try:
        return abort(code)
    except LookupError:
        return HTTP_STATUS_CODES[code], code


@app.route('/sleep/<float:sleep>')
def page_sleep(sleep):
    import time
    time.sleep(sleep)
    return redirect('/report/from-sleep')


@app.route('/login', methods=['GET', 'POST'])
def page_login():
    error = 'Not logged-in'
    if request.method == 'POST':
        username = request.form['username']
        if 'invalid' in username:
            error = 'Invalid username'
        elif 'invalid' in request.form['password']:
            error = 'Invalid password'
        else:
            session['username'] = username
            return redirect('/report/from-login')
    return error


@app.route('/logout')
def page_logout():
    session.pop('username', None)
    return redirect('/report/from-logout')


@app.route('/cookies/set')
def page_set_cookies():
    # see: http://flask.pocoo.org/docs/quickstart/#cookies
    resp = redirect('/report/from-cookies')
    for (name, value) in request.args.items():
        resp.set_cookie(name, value)
    return resp

# Runner


def get_open_port():
    import socket
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind(("", 0))
    s.listen(1)
    port = s.getsockname()[1]
    s.close()
    return port


def run(port, server, **kwds):
    import sys
    port = port or get_open_port()
    # Pass port number to child process via envvar.  This is required
    # when using Flask's reloader.
    os.environ['EL_REQUEST_TEST_PORT'] = str(port)
    print(port)
    sys.stdout.flush()

    if server == 'flask':
        app.run(port=port, **kwds)
    else:
        app.debug = True
        from tornado.wsgi import WSGIContainer
        from tornado.httpserver import HTTPServer
        from tornado.ioloop import IOLoop
        http_server = HTTPServer(WSGIContainer(app))
        http_server.listen(port)
        print(" * Running on", port)
        IOLoop.instance().start()


def main(args=None):
    import argparse
    default_port = int(os.environ.get('EL_REQUEST_TEST_PORT', '0'))
    default_server = os.environ.get('EL_REQUEST_TEST_SERVER') or 'flask'
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument('--port', default=default_port, type=int)
    parser.add_argument('--use-reloader', default=False, action='store_true')
    parser.add_argument('--server', default=default_server,
                        choices=['flask', 'tornado'])
    ns = parser.parse_args(args)
    run(**vars(ns))


if __name__ == '__main__':
    main()