Coverage for gws-app/gws/base/web/manager.py: 28%
50 statements
« prev ^ index » next coverage.py v7.8.0, created at 2025-04-17 01:37 +0200
« prev ^ index » next coverage.py v7.8.0, created at 2025-04-17 01:37 +0200
1from typing import Optional
3import gws
5from . import site
7_FALLBACK_SITE = gws.Config(
8 host='*',
9 root=site.WebDocumentRootConfig(dir='/data/web'))
12class Config(gws.Config):
13 """Web server configuration"""
15 sites: Optional[list[site.Config]]
16 """configured sites"""
17 ssl: Optional[site.SSLConfig]
18 """ssl configuration"""
21class Object(gws.WebManager):
22 def configure(self):
23 cfgs = self.cfg('sites', default=[])
24 if all(c.host != '*' for c in cfgs):
25 cfgs.append(_FALLBACK_SITE)
26 if self.cfg('ssl'):
27 cfgs = [gws.u.merge(c, ssl=True) for c in cfgs]
28 self.sites = self.create_children(site.Object, cfgs)
30 self.register_middleware('cors')
32 ##
34 def enter_middleware(self, req: gws.WebRequester):
35 cors = req.site.corsOptions
36 if not cors:
37 return
38 if req.method == 'OPTIONS':
39 return gws.ContentResponse(mime='text/plain', content='')
41 def exit_middleware(self, req: gws.WebRequester, res: gws.WebResponder):
42 cors = req.site.corsOptions
44 if not cors:
45 return
47 p = cors.allowOrigin
48 if p:
49 res.add_header('Access-Control-Allow-Origin', p)
51 p = cors.allowCredentials
52 if p:
53 res.add_header('Access-Control-Allow-Credentials', 'true')
55 p = cors.allowHeaders
56 if p:
57 res.add_header('Access-Control-Allow-Headers', p)
59 p = cors.allowMethods
60 if p:
61 res.add_header('Access-Control-Allow-Methods', p)
62 else:
63 res.add_header('Access-Control-Allow-Methods', 'POST, OPTIONS')
65 ##
67 def site_from_environ(self, environ):
68 host = environ.get('HTTP_HOST', '').lower().split(':')[0].strip()
70 for s in self.sites:
71 if s.host.lower() == host:
72 return s
73 for s in self.sites:
74 if s.host == '*':
75 return s
77 # there must be a '*' site
78 raise gws.Error('unknown host', host)