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

1from typing import Optional 

2 

3import gws 

4 

5from . import site 

6 

7_FALLBACK_SITE = gws.Config( 

8 host='*', 

9 root=site.WebDirConfig(dir='/data/web')) 

10 

11 

12class Config(gws.Config): 

13 """Web server configuration""" 

14 

15 sites: Optional[list[site.Config]] 

16 """Configured sites.""" 

17 ssl: Optional[site.SSLConfig] 

18 """SSL configuration.""" 

19 

20 

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) 

29 

30 self.root.app.middlewareMgr.register(self, 'cors') 

31 

32 ## 

33 

34 def exit_middleware(self, req: gws.WebRequester, res: gws.WebResponder): 

35 cors = req.site.corsOptions 

36 

37 if not cors: 

38 return 

39 

40 p = cors.allowOrigin 

41 if p: 

42 res.add_header('Access-Control-Allow-Origin', p) 

43 

44 p = cors.allowCredentials 

45 if p: 

46 res.add_header('Access-Control-Allow-Credentials', 'true') 

47 

48 p = cors.allowHeaders 

49 if p: 

50 res.add_header('Access-Control-Allow-Headers', p) 

51 

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') 

57 

58 ## 

59 

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')