summaryrefslogtreecommitdiff
path: root/talermerchantdemos/httpcommon/__init__.py
blob: 650228d3493cf35247a2f57646ba582875289376 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
import flask
import requests
from urllib.parse import urljoin
from flask import request
from datetime import datetime
import time
from flask_babel import gettext

##
# Return a error response to the client.
#
# @param abort_status_code status code to return along the response.
# @param params _kw_ arguments to passed verbatim to the templating engine.
def err_abort(abort_status_code, **params):
    t = flask.render_template("templates/error.html", **params)
    flask.abort(flask.make_response(t, abort_status_code))

##
# POST a request to the backend, and return a error
# response if any error occurs.
#
# @param endpoint the backend endpoint where to POST
#        this request.
# @param json the POST's body.
# @return the backend response (JSON format).
def backend_post(backend_url, endpoint, json):
    headers = {"Authorization": "ApiKey sandbox"}
    final_url = urljoin(backend_url, endpoint)
    print("POSTing to: " + final_url)
    try:
        resp = requests.post(
            final_url, json=json, headers=headers
        )
    except requests.ConnectionError:
        err_abort(500, message=gettext("Could not establish connection to backend"))
    try:
        response_json = resp.json()
    except ValueError:
        err_abort(
            500,
            message=gettext("Could not parse response from backend"),
            status_code=resp.status_code
        )
    if resp.status_code != 200:
        err_abort(
            500,
            message=gettext("Backend returned error status"),
            json=response_json,
            status_code=resp.status_code
        )
    print("Backend responds to {}: {}".format(final_url, str(response_json)))
    return response_json


##
# Issue a GET request to the backend.
#
# @param endpoint the backend endpoint where to issue the request.
# @param params (dict type of) URL parameters to append to the request.
# @return the JSON response from the backend, or a error response
#         if something unexpected happens.
def backend_get(backend_url, endpoint, params):
    headers = {"Authorization": "ApiKey sandbox"}
    final_url = urljoin(backend_url, endpoint)
    print("GETting: " + final_url + " with params: " + str(params))
    try:
        resp = requests.get(
            final_url, params=params, headers=headers
        )
    except requests.ConnectionError:
        err_abort(500, message=gettext("Could not establish connection to backend"))
    try:
        response_json = resp.json()
    except ValueError:
        err_abort(500, message=gettext("Could not parse response from backend"))
    if resp.status_code != 200:
        err_abort(
            500,
            message=gettext("Backend returned error status"),
            json=response_json,
            status_code=resp.status_code
        )
    print("Backend responds to {}: {}".format(final_url, str(response_json)))
    return response_json

def get_locale():
    parts = request.path.split('/', 2)
    if (2 >= len(parts)):
        # Totally unexpected path format, do not localize
        return "en"
    lang = parts[1]
    return lang

##
# Helper function used inside Jinja2 logic to create a links
# to the current page but in a different language. Used to
# implement the "Language" menu.
#
def self_localized(lang):
    """
    Return URL for the current page in another locale.
    """
    path = request.path
    # path must have the form "/$LANG/$STUFF"
    parts = path.split('/', 2)
    if (2 >= len(parts)):
        # Totally unexpected path format, do not localize
        return path
    return "/" + lang + "/" + parts[2]


##
# Return a error response to the client.
#
# @param abort_status_code status code to return along the response.
# @param params _kw_ arguments to passed verbatim to the templating engine.
def err_abort(abort_status_code, **params):
    t = flask.render_template(
        "templates/error.html.j2",
        lang=get_locale(),
        **params
    )
    flask.abort(flask.make_response(t, abort_status_code))



def fallback_404(error):
    return "Page not found"



class Deadline:
    def __init__(self, value):
        self.value = value
    def isExpired(self):
        if self.value == "never":
            return False
        now = int(round(time.time()) * 1000)
        now_dt = datetime.fromtimestamp(now / 1000)
        deadline_dt = datetime.fromtimestamp(self.value / 1000)
        print("debug: checking refund expiration, now: {}, deadline: {}".format(
            now_dt.strftime("%c"), deadline_dt.strftime("%c")
        ))
        return now > self.value