diff options
Diffstat (limited to 'talermerchantdemos/httpcommon')
-rw-r--r-- | talermerchantdemos/httpcommon/__init__.py | 52 |
1 files changed, 39 insertions, 13 deletions
diff --git a/talermerchantdemos/httpcommon/__init__.py b/talermerchantdemos/httpcommon/__init__.py index 0584cba..d2238ff 100644 --- a/talermerchantdemos/httpcommon/__init__.py +++ b/talermerchantdemos/httpcommon/__init__.py @@ -1,10 +1,11 @@ import flask import requests -from urllib.parse import urljoin -from flask import request +from urllib.parse import urljoin, urlencode, urlparse, urlunparse +from flask import request, url_for from datetime import datetime import time from flask_babel import gettext +import babel # used for lang sanity check import os import re import logging @@ -68,6 +69,16 @@ def backend_post(backend_url, endpoint, json, auth_token=None): # @return the JSON response from the backend, or a error response # if something unexpected happens. def backend_get(backend_url, endpoint, params, auth_token=None): + status, json = backend_get_with_status(backend_url, endpoint, params, auth_token) + if status != 200: + raise BackendException( + message=gettext("Backend returned error status"), + backend_status=status, + backend_json=json, + ) + return json + +def backend_get_with_status(backend_url, endpoint, params, auth_token=None): headers = dict() if auth_token is not None: headers["Authorization"] = "Bearer " + auth_token @@ -83,15 +94,8 @@ def backend_get(backend_url, endpoint, params, auth_token=None): response_json = resp.json() except Exception: raise BackendException(message=gettext("Could not parse response from backend")) - if resp.status_code != 200: - raise BackendException( - message=gettext("Backend returned error status"), - backend_status=resp.status_code, - backend_json=response_json, - ) print("Backend responds to {}: {}".format(final_url, str(response_json))) - return response_json - + return resp.status_code, response_json def get_locale(): parts = request.path.split("/", 2) @@ -99,12 +103,35 @@ def get_locale(): # Totally unexpected path format, do not localize return "en" lang = parts[1] + + # Sanity check on the language code. + try: + babel.core.Locale.parse(lang) + except Exception as err: + # Not a locale, default to english. + LOGGER.error(f"language {lang} did not parse, default to english") + return "en" if lang == "static": # Static resource, not a language indicator. # Do not localize then. return "en" return lang +## +# Construct the payment URL where customer can pay the order +# +# @param backend_url where the backend is located +# @param order_id id of the order already created +# @param session_id session in which the order is going to be paid +# @param token if the order requires a token +# @return the JSON response from the backend, or a error response +# if something unexpected happens. +def backend_payment_url(backend_url, endpoint, session_id, token): + final_url = urljoin(backend_url, endpoint) + query = urlencode({"token":token, "session_id":session_id}) + redirect_url = urlparse(final_url)._replace(query=query) + return urlunparse(redirect_url) + ## # Helper function used inside Jinja2 logic to create a links @@ -165,7 +192,7 @@ all_languages = { # Make the environment available into templates. # # @return the environment-reading function -def make_utility_processor(pagename): +def make_utility_processor(pagename,base_url): def utility_processor(): def getactive(): return pagename @@ -194,8 +221,7 @@ def make_utility_processor(pagename): getactive=getactive, getlang=getlang, all_languages=all_languages, - static=static, - script_name=request.environ.get("SCRIPT_NAME", ""), + static=static ) return utility_processor |