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