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

1from typing import Optional 

2 

3import gws 

4 

5from . import site 

6 

7_FALLBACK_SITE = gws.Config( 

8 host='*', 

9 root=site.WebDocumentRootConfig(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.register_middleware('cors') 

31 

32 ## 

33 

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

40 

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

42 cors = req.site.corsOptions 

43 

44 if not cors: 

45 return 

46 

47 p = cors.allowOrigin 

48 if p: 

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

50 

51 p = cors.allowCredentials 

52 if p: 

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

54 

55 p = cors.allowHeaders 

56 if p: 

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

58 

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

64 

65 ## 

66 

67 def site_from_environ(self, environ): 

68 host = environ.get('HTTP_HOST', '').lower().split(':')[0].strip() 

69 

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 

76 

77 # there must be a '*' site 

78 raise gws.Error('unknown host', host)