diff options
Diffstat (limited to 'talermerchantdemos/httpcommon/__init__.py')
-rw-r--r-- | talermerchantdemos/httpcommon/__init__.py | 87 |
1 files changed, 57 insertions, 30 deletions
diff --git a/talermerchantdemos/httpcommon/__init__.py b/talermerchantdemos/httpcommon/__init__.py index 8d3357c..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 @@ -14,7 +15,7 @@ LOGGER = logging.getLogger(__name__) class BackendException(Exception): """Exception for failed communication with the Taler merchant backend""" - def __init__(self, message, backend_status=None, backend_json=None): + def __init__(self, message, backend_status=None, backend_json={}): super().__init__(backend_json.get("hint", message)) self.backend_status = backend_status self.backend_json = backend_json @@ -41,9 +42,9 @@ def backend_post(backend_url, endpoint, json, auth_token=None): ) try: response_json = resp.json() - except ValueError: + except Exception: raise BackendException( - message=gettext("Could not parse response from backend"), + message=gettext("Could not parse the response from backend"), backend_status=resp.status_code, ) if resp.status_code != 200: @@ -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 @@ -81,17 +92,10 @@ def backend_get(backend_url, endpoint, params, auth_token=None): ) try: response_json = resp.json() - except ValueError: + 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 @@ -144,20 +171,20 @@ class Deadline: all_languages = { "en": "English [en]", - "ar": "Arabic [ar]", - "zh_Hant": "Chinese [zh]", - "fr": "French [fr]", - "de": "German [de]", - "hi": "Hindi [hi]", - "it": "Italian [it]", - "ja": "Japanese [ja]", - "ko": "Korean [ko]", - "pt": "Portuguese [pt]", - "pt_BR": "Portuguese (Brazil) [pt_BR]", - "ru": "Russian [ru]", - "es": "Spanish [es]", - "sv": "Swedish [sv]", - "tr": "Turkish [tr]", + "ar": "عربى [ar]", + "zh_Hant": "繁體中文 [zh]", + "fr": "Français [fr]", + "de": "Deutsch [de]", + "hi": "हिंदी [hi]", + "it": "Italiano [it]", + "ja": "日本語 [ja]", + "ko": "한국어 [ko]", + "pt": "Português [pt]", + "pt_BR": "Português (Brazil) [pt_BR]", + "ru": "Ру́сский язы́к [ru]", + "es": "Español [es]", + "sv": "Svenska [sv]", + "tr": "Türkçe [tr]", } @@ -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,7 +221,7 @@ def make_utility_processor(pagename): getactive=getactive, getlang=getlang, all_languages=all_languages, - static=static, + static=static ) return utility_processor |