-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathWebModuleUnit1.pas
135 lines (118 loc) · 4.69 KB
/
WebModuleUnit1.pas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
unit WebModuleUnit1;
interface
uses
System.SysUtils, System.Classes, Web.HTTPApp, Datasnap.DSHTTPCommon,
Datasnap.DSHTTPWebBroker, Datasnap.DSServer,
Web.WebFileDispatcher, Web.HTTPProd,
DataSnap.DSAuth,
Datasnap.DSProxyJavaScript, IPPeerServer, Datasnap.DSMetadata,
Datasnap.DSServerMetadata, Datasnap.DSClientMetadata, Datasnap.DSCommonServer,
Datasnap.DSHTTP;
type
TWebModule1 = class(TWebModule)
DSHTTPWebDispatcher1: TDSHTTPWebDispatcher;
ServerFunctionInvoker: TPageProducer;
ReverseString: TPageProducer;
WebFileDispatcher1: TWebFileDispatcher;
DSProxyGenerator1: TDSProxyGenerator;
DSServerMetaDataProvider1: TDSServerMetaDataProvider;
procedure ServerFunctionInvokerHTMLTag(Sender: TObject; Tag: TTag;
const TagString: string; TagParams: TStrings; var ReplaceText: string);
procedure WebModuleDefaultAction(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
procedure WebModuleBeforeDispatch(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
procedure WebFileDispatcher1BeforeDispatch(Sender: TObject;
const AFileName: string; Request: TWebRequest; Response: TWebResponse;
var Handled: Boolean);
procedure WebModuleCreate(Sender: TObject);
private
{ Private declarations }
FServerFunctionInvokerAction: TWebActionItem;
function AllowServerFunctionInvoker: Boolean;
public
{ Public declarations }
end;
var
WebModuleClass: TComponentClass = TWebModule1;
implementation
{$R *.dfm}
uses ServerMethodsUnit1, ServerContainerUnit1, Web.WebReq;
procedure TWebModule1.ServerFunctionInvokerHTMLTag(Sender: TObject; Tag: TTag;
const TagString: string; TagParams: TStrings; var ReplaceText: string);
begin
if SameText(TagString, 'urlpath') then
ReplaceText := string(Request.InternalScriptName)
else if SameText(TagString, 'port') then
ReplaceText := IntToStr(Request.ServerPort)
else if SameText(TagString, 'host') then
ReplaceText := string(Request.Host)
else if SameText(TagString, 'classname') then
ReplaceText := ServerMethodsUnit1.TServerMethods1.ClassName
else if SameText(TagString, 'loginrequired') then
if DSHTTPWebDispatcher1.AuthenticationManager <> nil then
ReplaceText := 'true'
else
ReplaceText := 'false'
else if SameText(TagString, 'serverfunctionsjs') then
ReplaceText := string(Request.InternalScriptName) + '/js/serverfunctions.js'
else if SameText(TagString, 'servertime') then
ReplaceText := DateTimeToStr(Now)
else if SameText(TagString, 'serverfunctioninvoker') then
if AllowServerFunctionInvoker then
ReplaceText :=
'<div><a href="' + string(Request.InternalScriptName) +
'/ServerFunctionInvoker" target="_blank">Server Functions</a></div>'
else
ReplaceText := '';
end;
procedure TWebModule1.WebModuleDefaultAction(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin
if (Request.InternalPathInfo = '') or (Request.InternalPathInfo = '/')then
Response.Content := ReverseString.Content
else
Response.SendRedirect(Request.InternalScriptName + '/');
end;
procedure TWebModule1.WebModuleBeforeDispatch(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin
if FServerFunctionInvokerAction <> nil then
FServerFunctionInvokerAction.Enabled := AllowServerFunctionInvoker;
end;
function TWebModule1.AllowServerFunctionInvoker: Boolean;
begin
Result := (Request.RemoteAddr = '127.0.0.1') or
(Request.RemoteAddr = '0:0:0:0:0:0:0:1') or (Request.RemoteAddr = '::1');
end;
procedure TWebModule1.WebFileDispatcher1BeforeDispatch(Sender: TObject;
const AFileName: string; Request: TWebRequest; Response: TWebResponse;
var Handled: Boolean);
var
D1, D2: TDateTime;
begin
Handled := False;
if SameFileName(ExtractFileName(AFileName), 'serverfunctions.js') then
if not FileExists(AFileName) or (FileAge(AFileName, D1) and FileAge(WebApplicationFileName, D2) and (D1 < D2)) then
begin
DSProxyGenerator1.TargetDirectory := ExtractFilePath(AFileName);
DSProxyGenerator1.TargetUnitName := ExtractFileName(AFileName);
DSProxyGenerator1.Write;
end;
end;
procedure TWebModule1.WebModuleCreate(Sender: TObject);
begin
FServerFunctionInvokerAction := ActionByName('ServerFunctionInvokerAction');
DSServerMetaDataProvider1.Server := DSServer;
DSHTTPWebDispatcher1.Server := DSServer;
if DSServer.Started then
begin
DSHTTPWebDispatcher1.DbxContext := DSServer.DbxContext;
DSHTTPWebDispatcher1.Start;
end;
DSHTTPWebDispatcher1.AuthenticationManager := DSAuthenticationManager;
end;
initialization
finalization
Web.WebReq.FreeWebModules;
end.