77
88from .._constants import APP_PRODUCTS_KEY , RQ_PRODUCT_KEY
99from .._meta import API_VTAG
10+ from ._api import get_default_product_name
1011from ._model import Product
1112
1213_logger = logging .getLogger (__name__ )
@@ -41,6 +42,21 @@ def _discover_product_by_request_header(request: web.Request) -> str | None:
4142_INCLUDE_PATHS : set [str ] = {"/static-frontend-data.json" , "/socket.io/" }
4243
4344
45+ def _get_diagnose_msg (request : web .Request ):
46+ return (
47+ "\n " .join (
48+ [
49+ f"{ request .url = } " ,
50+ f"{ request .host = } " ,
51+ f"{ request .remote = } " ,
52+ * [f"{ k } :{ request .headers [k ][:20 ]} " for k in request .headers ],
53+ f"{ request .headers .get ('X-Forwarded-Host' )= } " ,
54+ f"{ request .get (RQ_PRODUCT_KEY )= } " ,
55+ ]
56+ ),
57+ )
58+
59+
4460@web .middleware
4561async def discover_product_middleware (request : web .Request , handler : Handler ):
4662 """
@@ -49,34 +65,44 @@ async def discover_product_middleware(request: web.Request, handler: Handler):
4965 - request[RQ_PRODUCT_KEY] is set to discovered product in 3 types of entrypoints
5066 - if no product discovered, then it is set to default
5167 """
52- request [RQ_PRODUCT_KEY ] = None
53- # - API entrypoints
54- # - /static info for front-end
55- if request .path .startswith (f"/{ API_VTAG } " ) or request .path in _INCLUDE_PATHS :
68+ request [RQ_PRODUCT_KEY ] = get_default_product_name (request .app )
69+
70+ if (
71+ # - API entrypoints
72+ # - /static info for front-end
73+ request .path .startswith (f"/{ API_VTAG } " )
74+ or request .path in _INCLUDE_PATHS
75+ ):
5676 request [RQ_PRODUCT_KEY ] = _discover_product_by_request_header (
5777 request
5878 ) or _discover_product_by_hostname (request )
5979
60- # - Publications entrypoint: redirections from other websites. SEE studies_access.py::access_study
61- # - Root entrypoint: to serve front-end apps
80+ if not request [RQ_PRODUCT_KEY ]:
81+ bad_request_error = web .HTTPBadRequest (
82+ reason = "web api request must define a product"
83+ )
84+ _logger .warning ("%s:\n %s" , bad_request_error , _get_diagnose_msg (request ))
85+ raise bad_request_error
86+
6287 elif (
88+ # - Publications entrypoint: redirections from other websites. SEE studies_access.py::access_study
89+ # - Root entrypoint: to serve front-end apps
6390 request .path .startswith ("/study/" )
6491 or request .path .startswith ("/view" )
6592 or request .path == "/"
6693 ):
67- request [RQ_PRODUCT_KEY ] = _discover_product_by_hostname (request )
68-
69- msg = " \n " . join (
70- [
71- f" { request . url = } " ,
72- f" { request . host = } " ,
73- f" { request . remote = } " ,
74- * [ f" { k } : { request . headers [ k ][: 20 ] } " for k in request . headers ] ,
75- f" { request . headers . get ( 'X-Forwarded-Host' ) = } " ,
76- f" { request . get ( RQ_PRODUCT_KEY ) = } " ,
77- ]
94+ request [RQ_PRODUCT_KEY ] = _discover_product_by_hostname (
95+ request
96+ ) and get_default_product_name ( request . app )
97+
98+ assert request [ RQ_PRODUCT_KEY ] # nosec
99+
100+ _logger . warning (
101+ " \n %s \n %s \n %s \n " ,
102+ "------------------TESTING------------------- " ,
103+ _get_diagnose_msg ( request ) ,
104+ "-------------------------------------------" ,
78105 )
79- _logger .warning ("\n --TESTING->\n %s" , msg )
80106
81107 assert request .get (RQ_PRODUCT_KEY ) is not None or request .path .startswith ( # nosec
82108 "/dev/doc"
0 commit comments