summaryrefslogtreecommitdiff
path: root/talermerchantdemos/httpcommon/__init__.py
diff options
context:
space:
mode:
Diffstat (limited to 'talermerchantdemos/httpcommon/__init__.py')
-rw-r--r--talermerchantdemos/httpcommon/__init__.py87
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