-
-
Notifications
You must be signed in to change notification settings - Fork 59
Expand file tree
/
Copy path__init__.py
More file actions
136 lines (104 loc) · 4.15 KB
/
__init__.py
File metadata and controls
136 lines (104 loc) · 4.15 KB
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
import logging
import sys
import json_logging
import json_logging.framework
from json_logging import JSONLogWebFormatter
from json_logging.framework_base import BaseAppRequestInstrumentationConfigurator, BaseRequestInfoExtractor, \
BaseResponseInfoExtractor
from json_logging.util import is_not_match_any_pattern
def is_connexion_present():
# noinspection PyPep8,PyBroadException
try:
import connexion
return True
except:
return False
if is_connexion_present():
from connexion import request as request_obj
import connexion as connexion
import flask as flask
from flask import g
_current_request = request_obj
_connexion = connexion
_flask = flask
_connexion.g = g
class ConnexionAppRequestInstrumentationConfigurator(BaseAppRequestInstrumentationConfigurator):
def config(self, app, request_response_dto_class, exclude_url_patterns=[]):
if not is_connexion_present():
raise RuntimeError("connexion is not available in system runtime")
from flask.app import Flask
if not isinstance(app.app, Flask):
raise RuntimeError("app is not a valid connexion.app.Connexion app instance")
# Disable standard logging
logging.getLogger('werkzeug').disabled = True
json_logging.util.update_formatter_for_loggers([logging.getLogger('werkzeug')], JSONLogWebFormatter)
# noinspection PyAttributeOutsideInit
self.request_logger = logging.getLogger('connexion-request-logger')
from flask import g
@app.app.before_request
def before_request():
# for connexion 3.0+, requests use starlette
if hasattr(_current_request, "_starlette_request"):
path = _current_request.url.path
else:
path = _current_request.path
if is_not_match_any_pattern(path, exclude_url_patterns):
g.request_response_data = request_response_dto_class(_current_request)
@app.app.after_request
def after_request(response):
if hasattr(g, 'request_response_data'):
request_response_data = g.request_response_data
request_response_data.on_request_complete(response)
self.request_logger.info("", extra={'request_response_data': request_response_data})
return response
class ConnexionRequestInfoExtractor(BaseRequestInfoExtractor):
@staticmethod
def get_request_class_type():
raise NotImplementedError
@staticmethod
def support_global_request_object():
return True
@staticmethod
def get_current_request():
return _current_request
def get_remote_user(self, request):
if request.authorization is not None:
return request.authorization.username
else:
return json_logging.EMPTY_VALUE
def get_http_header(self, request, header_name, default=None):
try:
if header_name in request.headers:
return request.headers.get(header_name)
except:
pass
return default
def set_correlation_id(self, request_, value):
try:
_connexion.g.correlation_id = value
except:
pass
def get_correlation_id_in_request_context(self, request):
try:
return _connexion.g.get('correlation_id', None)
except:
return None
def get_protocol(self, request):
return request.environ.get('SERVER_PROTOCOL')
def get_path(self, request):
return request.path
def get_content_length(self, request):
return request.content_length
def get_method(self, request):
return request.method
def get_remote_ip(self, request):
return request.remote_addr
def get_remote_port(self, request):
return request.environ.get('REMOTE_PORT')
class ConnexionResponseInfoExtractor(BaseResponseInfoExtractor):
def get_status_code(self, response):
return response.status_code
def get_response_size(self, response):
return response.calculate_content_length()
def get_content_type(self, response):
return response.content_type