Coverage for gws-app / gws / base / web / manager.py: 62%
40 statements
« prev ^ index » next coverage.py v7.13.4, created at 2026-03-03 10:12 +0100
« prev ^ index » next coverage.py v7.13.4, created at 2026-03-03 10:12 +0100
1from typing import Optional
3import gws
5from . import site
7_FALLBACK_SITE = gws.Config(
8 host='*',
9 root=site.WebDirConfig(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.root.app.middlewareMgr.register(self, 'cors')
32 ##
34 def exit_middleware(self, req: gws.WebRequester, res: gws.WebResponder):
35 cors = req.site.corsOptions
37 if not cors:
38 return
40 p = cors.allowOrigin
41 if p:
42 res.add_header('Access-Control-Allow-Origin', p)
44 p = cors.allowCredentials
45 if p:
46 res.add_header('Access-Control-Allow-Credentials', 'true')
48 p = cors.allowHeaders
49 if p:
50 res.add_header('Access-Control-Allow-Headers', p)
52 p = cors.allowMethods
53 if p:
54 res.add_header('Access-Control-Allow-Methods', p)
55 else:
56 res.add_header('Access-Control-Allow-Methods', 'POST, OPTIONS')
58 ##
60 def site_from_environ(self, environ):
61 for s in self.sites:
62 if s.match_host(environ):
63 return s
64 # there must be a '*' site
65 raise gws.Error('unknown host')