1 /**
2 * Copyright © DiamondMVC 2018
3 * License: MIT (https://github.com/DiamondMVC/Diamond/blob/master/LICENSE)
4 * Author: Jacob Jensen (bausshf)
5 */
6 module diamond.init.server;
7
8 import diamond.core.apptype;
9
10 static if (isWebServer)
11 {
12 import diamond.http;
13
14 /**
15 * The handler for a generic webserver request.
16 * Params:
17 * client = The client.
18 */
19 void handleWebServer(HttpClient client)
20 {
21 import diamond.core.webconfig;
22
23 if (webConfig.maintenance)
24 {
25 import std.algorithm: canFind;
26
27 if
28 (
29 webConfig.maintenanceWhiteList &&
30 !webConfig.maintenanceWhiteList.canFind(client.ipAddress)
31 )
32 {
33 foreach (headerKey,headerValue; webConfig.defaultHeaders.general)
34 {
35 client.rawResponse.headers[headerKey] = headerValue;
36 }
37
38 import std.file : exists, readText;
39
40 if (!exists(webConfig.maintenance))
41 {
42 client.write("\n");
43 }
44 else
45 {
46 client.write(readText(webConfig.maintenance));
47 }
48 return;
49 }
50 }
51
52 import diamond.init.web : getView;
53
54 import diamond.views.view : View;
55
56 View page;
57
58 if (webConfig.viewOnly)
59 {
60 page = getView(client, new Route("__view"), false, true);
61 }
62 else
63 {
64 page = getView(client, client.route, true);
65 }
66
67 if (!page)
68 {
69 client.notFound();
70 }
71
72 string pageResult;
73
74 if (webConfig.shouldCacheViews && page.cached)
75 {
76 pageResult = client.session.getCachedView(page.name);
77 }
78
79 import diamond.core.webconfig;
80
81 foreach (headerKey,headerValue; webConfig.defaultHeaders.general)
82 {
83 client.rawResponse.headers[headerKey] = headerValue;
84 }
85
86 if (!pageResult)
87 {
88 pageResult = page.generate();
89
90 if (client.redirected || !client.isLastRoute)
91 {
92 return;
93 }
94
95 if (webConfig.shouldCacheViews && pageResult && pageResult.length && page.cached)
96 {
97 client.session.cacheView(page.name, pageResult);
98 }
99 }
100
101 if (pageResult && pageResult.length)
102 {
103 client.write(pageResult);
104 }
105 else
106 {
107 client.write("\n");
108 }
109 }
110 }