openshift-simple-app/app.py

163 lines
4.2 KiB
Python
Raw Normal View History

2020-04-27 13:28:21 +00:00
import json
import logging
2020-04-27 13:28:21 +00:00
import os
2020-02-28 16:34:59 +00:00
2020-03-13 09:44:17 +00:00
import requests
from flask import Flask, request, Response, render_template, jsonify
2020-03-16 15:46:02 +00:00
from werkzeug.routing import Rule
2020-02-28 16:34:59 +00:00
app = Flask(__name__)
2020-03-16 15:46:02 +00:00
app.url_map.add(Rule("/request", endpoint="request"))
2020-02-28 16:34:59 +00:00
logging.basicConfig(format="%(message)s", level="INFO")
black_logger = logging.getLogger("blank")
2020-02-28 16:34:59 +00:00
@app.route("/")
2020-03-11 09:20:54 +00:00
def root_view():
"""List all available routes"""
routes = {}
for rule in sorted(app.url_map.iter_rules(), key=lambda rule: rule.rule):
if rule.endpoint != "static":
2020-03-16 15:46:02 +00:00
# Get only the first line from the docstring as the summary
routes[rule.rule] = list(
filter(None, app.view_functions[rule.endpoint].__doc__.split("\n"))
)[0].strip()
2020-02-28 16:34:59 +00:00
2020-03-16 15:46:02 +00:00
# HTML response
if request.accept_mimetypes.accept_html:
return render_template("index.j2", routes=routes)
2020-03-16 15:55:06 +00:00
# JSON response
if request.accept_mimetypes.accept_json:
return jsonify(routes)
2020-03-16 15:46:02 +00:00
# Plain text response
return Response(
"\n".join(
[
"{path:32s}: {doc}".format(path=path, doc=doc)
for path, doc in routes.items()
]
),
content_type="text/plain",
2020-02-28 16:34:59 +00:00
)
@app.route("/environment")
2020-03-11 09:20:54 +00:00
def environment_view():
"""Return defined environment"""
2020-03-16 15:46:02 +00:00
# JSON response
if request.accept_mimetypes.accept_json:
return jsonify(os.environ.copy())
2020-03-16 15:46:02 +00:00
# Plain text response
return Response(
"\n".join(
[
"{key}={value}".format(key=key, value=value)
for key, value in os.environ.items()
]
),
content_type="text/plain",
)
@app.route("/headers")
2020-03-11 09:20:54 +00:00
def headers_view():
"""Return request headers"""
2020-03-16 15:46:02 +00:00
# JSON response
if request.accept_mimetypes.accept_json:
return jsonify(dict(request.headers))
2020-03-16 15:46:02 +00:00
# Plain text response
return Response(
"\n".join(
[
"{key}={value}".format(key=key, value=value)
for key, value in request.headers
]
),
content_type="text/plain",
2020-02-28 16:34:59 +00:00
)
2020-03-11 09:19:06 +00:00
@app.route("/log", methods=["POST"])
2020-03-11 09:20:54 +00:00
def log_view():
2020-03-11 09:19:06 +00:00
"""
Logs the provided payload into stdout.
Accepts JSON and plain text
Returns the provided data on response
"""
2020-03-16 15:55:06 +00:00
# JSON response
2020-03-11 09:19:06 +00:00
if request.is_json:
2020-04-27 13:28:21 +00:00
black_logger.warn(json.dumps(request.json))
2020-03-11 09:19:06 +00:00
return jsonify(request.json)
2020-03-16 15:55:06 +00:00
# Plain text response
2020-03-11 09:19:06 +00:00
data = request.get_data().decode("utf-8")
black_logger.warn(data)
2020-03-16 15:55:06 +00:00
return Response(data, content_type="plain/text")
2020-03-11 09:19:06 +00:00
2020-03-13 09:44:17 +00:00
@app.route("/http_request", methods=["POST"])
def http_request_view():
"""
Performs an http request.
The view is just a passthrough to the requests library:
- `method` parameter to set the request method
- Every other parameter will be sent directly to the requests request method
"""
params = request.json
method = params.pop("method", "GET")
response = requests.request(method, **params)
2020-03-16 15:46:02 +00:00
# JSON response
return jsonify(
{
"method": method,
"params": params,
"response": {
"content": response.text,
"json": response.json(),
"headers": {key: value for key, value in response.headers.items()},
},
2020-03-13 09:44:17 +00:00
}
2020-03-16 15:46:02 +00:00
)
@app.endpoint("request") # /request
2020-03-16 15:46:02 +00:00
def request_view():
"""
Return request information.
Useful to use along /request from other pods.
"""
request_data = {
"method": request.method,
"url": request.url,
"path": request.path,
"data": request.get_data(as_text=True),
"json": request.get_json(),
"cookies": {key: value for key, value in request.cookies.items()},
"params": {key: value for key, value in request.args.items()},
"headers": {key: value for key, value in request.headers.items()},
}
# JSON response
if request.accept_mimetypes.accept_json:
return jsonify(request_data)
# Plain text response
return Response(
render_template("request.j2", request_data=request_data),
content_type="text/plain",
)
2020-03-13 09:44:17 +00:00
2020-02-28 16:34:59 +00:00
if __name__ == "__main__":
2020-02-28 16:46:43 +00:00
app.run(debug=True, port=8080, host="0.0.0.0")