├── .gitattributes ├── .gitignore ├── HTTP.HTMLBuild.pas ├── HTTP.Server.pas ├── LICENSE ├── MiniWebServer.dpr ├── MiniWebServer.dproj ├── MiniWebServer.res ├── MiniWebServerGroup.groupproj ├── MiniWebServer_Attrib.dpr ├── MiniWebServer_Attrib.dproj ├── MiniWebServer_Attrib.res ├── README.md ├── Sample ├── StressTest │ ├── StressTest.dpr │ ├── StressTest.dproj │ └── StressTest.res └── WMS.OWM.pas ├── Tester ├── GetTester.dpr ├── GetTester.dproj └── GetTester.res └── Win32 └── Debug └── www └── favicon.ico /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Uncomment these types if you want even more clean repository. But be careful. 2 | # It can make harm to an existing project source. Read explanations below. 3 | # 4 | # Resource files are binaries containing manifest, project icon and version info. 5 | # They can not be viewed as text or compared by diff-tools. Consider replacing them with .rc files. 6 | #*.res 7 | # 8 | # Type library file (binary). In old Delphi versions it should be stored. 9 | # Since Delphi 2009 it is produced from .ridl file and can safely be ignored. 10 | #*.tlb 11 | # 12 | # Diagram Portfolio file. Used by the diagram editor up to Delphi 7. 13 | # Uncomment this if you are not using diagrams or use newer Delphi version. 14 | #*.ddp 15 | # 16 | # Visual LiveBindings file. Added in Delphi XE2. 17 | # Uncomment this if you are not using LiveBindings Designer. 18 | #*.vlb 19 | # 20 | # Deployment Manager configuration file for your project. Added in Delphi XE2. 21 | # Uncomment this if it is not mobile development and you do not use remote debug feature. 22 | #*.deployproj 23 | # 24 | # C++ object files produced when C/C++ Output file generation is configured. 25 | # Uncomment this if you are not using external objects (zlib library for example). 26 | #*.obj 27 | # 28 | 29 | # Delphi compiler-generated binaries (safe to delete) 30 | *.exe 31 | *.dll 32 | *.bpl 33 | *.bpi 34 | *.dcp 35 | *.so 36 | *.apk 37 | *.drc 38 | *.map 39 | *.dres 40 | *.rsm 41 | *.tds 42 | *.dcu 43 | *.lib 44 | *.a 45 | *.o 46 | *.ocx 47 | 48 | # Delphi autogenerated files (duplicated info) 49 | *.cfg 50 | *.hpp 51 | *Resource.rc 52 | 53 | # Delphi local files (user-specific info) 54 | *.local 55 | *.identcache 56 | *.projdata 57 | *.tvsconfig 58 | *.dsk 59 | 60 | # Delphi history and backups 61 | __history/ 62 | __recovery/ 63 | Win32/ 64 | *.~* 65 | 66 | # Castalia statistics file (since XE7 Castalia is distributed with Delphi) 67 | *.stat 68 | 69 | # Boss dependency manager vendor folder https://github.com/HashLoad/boss 70 | modules/ 71 | -------------------------------------------------------------------------------- /HTTP.HTMLBuild.pas: -------------------------------------------------------------------------------- 1 | unit HTTP.HTMLBuild; 2 | 3 | interface 4 | 5 | uses 6 | System.Classes, System.SysUtils; 7 | 8 | type 9 | TDocSection = class(TStringList) 10 | procedure AddTagSection(const Tag: string; Lines: TArray); 11 | end; 12 | 13 | IHTMLBuilder = interface 14 | function Title(const Value: string): IHTMLBuilder; 15 | function HTML: string; 16 | function Head(const Tag: string; Lines: TArray): IHTMLBuilder; overload; 17 | function Body(const Tag: string; Lines: TArray): IHTMLBuilder; overload; 18 | function Doc(const Tag: string; Lines: TArray): IHTMLBuilder; overload; 19 | function Head(Lines: TArray): IHTMLBuilder; overload; 20 | function Body(Lines: TArray): IHTMLBuilder; overload; 21 | function Doc(Lines: TArray): IHTMLBuilder; overload; 22 | function Head(const Value: string): IHTMLBuilder; overload; 23 | function Body(const Value: string): IHTMLBuilder; overload; 24 | function Doc(const Value: string): IHTMLBuilder; overload; 25 | end; 26 | 27 | HTMLBuilder = class(TInterfacedObject, IHTMLBuilder) 28 | private 29 | FHead: TDocSection; 30 | FBody: TDocSection; 31 | FLines: TDocSection; 32 | public 33 | class function Build: IHTMLBuilder; 34 | function HTML: string; 35 | function Body(const Tag: string; Lines: TArray): IHTMLBuilder; overload; 36 | function Body(const Value: string): IHTMLBuilder; overload; 37 | function Body(Lines: TArray): IHTMLBuilder; overload; 38 | function Doc(const Tag: string; Lines: TArray): IHTMLBuilder; overload; 39 | function Doc(Lines: TArray): IHTMLBuilder; overload; 40 | function Doc(const Value: string): IHTMLBuilder; overload; 41 | function Head(const Tag: string; Lines: TArray): IHTMLBuilder; overload; 42 | function Head(Lines: TArray): IHTMLBuilder; overload; 43 | function Head(const Value: string): IHTMLBuilder; overload; 44 | function Title(const Value: string): IHTMLBuilder; 45 | constructor Create; 46 | destructor Destroy; override; 47 | end; 48 | 49 | function OpenTag(const Tag: string): string; 50 | 51 | function CloseTag(const Tag: string): string; 52 | 53 | implementation 54 | 55 | function OpenTag(const Tag: string): string; 56 | begin 57 | Result := Format('<%s>', [Tag]); 58 | end; 59 | 60 | function CloseTag(const Tag: string): string; 61 | begin 62 | Result := Format('', [Tag]); 63 | end; 64 | 65 | { HTMLBuilder } 66 | 67 | class function HTMLBuilder.Build: IHTMLBuilder; 68 | begin 69 | Result := HTMLBuilder.Create; 70 | end; 71 | 72 | constructor HTMLBuilder.Create; 73 | begin 74 | inherited; 75 | FHead := TDocSection.Create; 76 | FBody := TDocSection.Create; 77 | FLines := TDocSection.Create; 78 | end; 79 | 80 | destructor HTMLBuilder.Destroy; 81 | begin 82 | FHead.Free; 83 | FBody.Free; 84 | FLines.Free; 85 | inherited; 86 | end; 87 | 88 | function HTMLBuilder.Body(const Value: string): IHTMLBuilder; 89 | begin 90 | FBody.Add(Value); 91 | Result := Self; 92 | end; 93 | 94 | function HTMLBuilder.Doc(const Value: string): IHTMLBuilder; 95 | begin 96 | FLines.Add(Value); 97 | Result := Self; 98 | end; 99 | 100 | function HTMLBuilder.Head(const Value: string): IHTMLBuilder; 101 | begin 102 | FHead.Add(Value); 103 | Result := Self; 104 | end; 105 | 106 | function HTMLBuilder.Body(Lines: TArray): IHTMLBuilder; 107 | begin 108 | FBody.AddStrings(Lines); 109 | Result := Self; 110 | end; 111 | 112 | function HTMLBuilder.Doc(Lines: TArray): IHTMLBuilder; 113 | begin 114 | FLines.AddStrings(Lines); 115 | Result := Self; 116 | end; 117 | 118 | function HTMLBuilder.Head(Lines: TArray): IHTMLBuilder; 119 | begin 120 | FHead.AddStrings(Lines); 121 | Result := Self; 122 | end; 123 | 124 | function HTMLBuilder.Doc(const Tag: string; Lines: TArray): IHTMLBuilder; 125 | begin 126 | FLines.AddTagSection(Tag, Lines); 127 | Result := Self; 128 | end; 129 | 130 | function HTMLBuilder.Head(const Tag: string; Lines: TArray): IHTMLBuilder; 131 | begin 132 | FHead.AddTagSection(Tag, Lines); 133 | Result := Self; 134 | end; 135 | 136 | function HTMLBuilder.Body(const Tag: string; Lines: TArray): IHTMLBuilder; 137 | begin 138 | FBody.AddTagSection(Tag, Lines); 139 | Result := Self; 140 | end; 141 | 142 | function HTMLBuilder.HTML: string; 143 | begin 144 | FLines.Insert(0, ''); 145 | if FHead.Count > 0 then 146 | FLines.AddTagSection('head', FHead.ToStringArray); 147 | if FBody.Count > 0 then 148 | FLines.AddTagSection('body', FBody.ToStringArray); 149 | FLines.Add(''); 150 | Result := FLines.Text; 151 | end; 152 | 153 | function HTMLBuilder.Title(const Value: string): IHTMLBuilder; 154 | begin 155 | Result := Head('title', [Value]); 156 | end; 157 | 158 | { TDocSection } 159 | 160 | procedure TDocSection.AddTagSection(const Tag: string; Lines: TArray); 161 | begin 162 | Add(OpenTag(Tag)); 163 | AddStrings(Lines); 164 | Add(CloseTag(Tag)); 165 | end; 166 | 167 | end. 168 | 169 | -------------------------------------------------------------------------------- /HTTP.Server.pas: -------------------------------------------------------------------------------- 1 | unit HTTP.Server; 2 | 3 | interface 4 | 5 | uses 6 | System.Classes, System.SysUtils, System.Threading, IdContext, System.Rtti, 7 | IdCustomHTTPServer, IdHTTPServer, System.IOUtils, System.Generics.Collections, 8 | System.JSON; 9 | 10 | type 11 | TRequest = TIdHTTPRequestInfo; 12 | 13 | TRequestHelper = class helper for TRequest 14 | public 15 | function IsHead: Boolean; 16 | function IsGet: Boolean; 17 | function IsPost: Boolean; 18 | function IsDelete: Boolean; 19 | function IsPut: Boolean; 20 | function IsTrace: Boolean; 21 | function IsOption: Boolean; 22 | end; 23 | 24 | TResponse = TIdHTTPResponseInfo; 25 | 26 | TResponseHelper = class helper for TResponse 27 | public 28 | procedure Json(const Text: string; Code: Integer = 200); overload; 29 | procedure Json(const JSONValue: TJSONValue; Code: Integer = 200); overload; 30 | procedure Json(const Obj: TObject; Code: Integer = 200); overload; 31 | procedure AsFile(const FileName: string; Code: Integer = 200); 32 | end; 33 | 34 | TOnRequest = reference to procedure(Request: TRequest; Response: TResponse); 35 | 36 | TOnResponsePlainText = reference to procedure(var Response: string; var Code: Word); 37 | 38 | TOnRequestProc = procedure(Request: TRequest; Response: TResponse) of object; 39 | 40 | THTTPCommand = (HEAD, GET, POST, DELETE, PUT, TRACE, OPTION); 41 | 42 | THTTPCommands = set of THTTPCommand; 43 | 44 | THTTPCommandTypes = set of THTTPCommandType; 45 | 46 | THTTPCommandsHelper = record helper for THTTPCommands 47 | function ToHTTPCommandTypes: THTTPCommandTypes; 48 | end; 49 | 50 | TRoute = class 51 | URI: string; 52 | Method: THTTPCommandTypes; 53 | function CheckURI(Request: TRequest): Boolean; 54 | constructor Create; overload; 55 | constructor Create(const URI: string); overload; 56 | constructor Create(Method: THTTPCommandTypes; const URI: string); overload; 57 | procedure Execute(Request: TRequest; Response: TResponse); virtual; abstract; 58 | public 59 | end; 60 | 61 | TRouteFull = class(TRoute) 62 | protected 63 | Proc: TOnRequest; 64 | public 65 | constructor Create(const URI: string; Proc: TOnRequest); overload; 66 | constructor Create(Method: THTTPCommandTypes; const URI: string; Proc: TOnRequest); overload; 67 | procedure Execute(Request: TRequest; Response: TResponse); override; 68 | end; 69 | 70 | TRoutePlaiText = class(TRoute) 71 | protected 72 | Proc: TOnResponsePlainText; 73 | public 74 | constructor Create(const URI: string; Proc: TOnResponsePlainText); overload; 75 | constructor Create(Method: THTTPCommandTypes; const URI: string; Proc: TOnResponsePlainText); overload; 76 | procedure Execute(Request: TRequest; Response: TResponse); override; 77 | end; 78 | 79 | RouteMethod = class(TCustomAttribute) 80 | private 81 | URI: string; 82 | Method: THTTPCommands; 83 | public 84 | constructor Create(const URI: string; Method: THTTPCommands = []); 85 | end; 86 | 87 | TRoutes = class(TObjectList) 88 | end; 89 | 90 | TOnServerWork = reference to procedure(var Stop: Boolean); 91 | 92 | TOnServerErrorBind = reference to procedure; 93 | 94 | THTTPServer = class(TComponent) 95 | private 96 | FRoutes: TRoutes; 97 | FContentPath: string; 98 | Instance: TidHTTPServer; 99 | FAutoFileServer: Boolean; 100 | function ProcRequest(Request: TRequest; Response: TResponse): Boolean; 101 | procedure FillRoutes; 102 | procedure SetAutoFileServer(const Value: Boolean); 103 | protected 104 | procedure DoCommand(AContext: TIdContext; Request: TRequest; Response: TResponse); 105 | function GetFilePath(const FileName: string): string; 106 | public 107 | constructor Create; reintroduce; overload; 108 | constructor Create(AOwner: TComponent); overload; override; 109 | destructor Destroy; override; 110 | procedure AddMimeType(const Ext, MIMEType: string); 111 | procedure Run(const Ports: TArray = []); overload; 112 | procedure RunSync(const Port: Word); 113 | procedure Route(const URI: string; Proc: TOnRequest); overload; 114 | procedure Route(Method: THTTPCommands; const URI: string; Proc: TOnRequest); overload; 115 | procedure Route(Method: THTTPCommands; const URI: string; Proc: TOnResponsePlainText); overload; 116 | procedure Route(const URI: string; Proc: TOnResponsePlainText); overload; 117 | procedure Route(Method: THTTPCommands; const URI: string; Proc: TRttiMethod); overload; 118 | property ContentPath: string read FContentPath write FContentPath; 119 | property AutoFileServer: Boolean read FAutoFileServer write SetAutoFileServer; 120 | end; 121 | 122 | implementation 123 | 124 | uses 125 | REST.Json; 126 | 127 | procedure THTTPServer.AddMimeType(const Ext, MIMEType: string); 128 | begin 129 | Instance.MIMETable.AddMimeType(Ext, MIMEType); 130 | end; 131 | 132 | constructor THTTPServer.Create; 133 | begin 134 | Create(nil); 135 | end; 136 | 137 | constructor THTTPServer.Create(AOwner: TComponent); 138 | begin 139 | inherited Create(AOwner); 140 | FAutoFileServer := False; 141 | FContentPath := 'www'; 142 | FRoutes := TRoutes.Create; 143 | Instance := TidHTTPServer.Create(nil); 144 | Instance.OnCommandGet := DoCommand; 145 | Instance.OnCommandOther := DoCommand; 146 | Instance.MIMETable.BuildCache; 147 | Instance.MIMETable.AddMimeType('wasm', 'application/wasm'); 148 | FillRoutes; 149 | end; 150 | 151 | destructor THTTPServer.Destroy; 152 | begin 153 | FRoutes.Free; 154 | Instance.Free; 155 | inherited; 156 | end; 157 | 158 | procedure THTTPServer.FillRoutes; 159 | var 160 | Context: TRttiContext; 161 | begin 162 | for var Method in Context.GetType(ClassInfo).GetMethods do 163 | for var Attr in Method.GetAttributes do 164 | if Attr is RouteMethod then 165 | Route(RouteMethod(Attr).Method, RouteMethod(Attr).URI, Method); 166 | end; 167 | 168 | procedure THTTPServer.DoCommand(AContext: TIdContext; Request: TRequest; Response: TResponse); 169 | begin 170 | //Writeln(Request.RemoteIP, ' ', Request.Command, ' ', Request.URI, ' ', Request.QueryParams, ' ', Request.Range); 171 | if FAutoFileServer and (Request.CommandType in [hcGET, hcHEAD]) then 172 | begin 173 | var Path := Request.URI; 174 | if TFile.Exists(GetFilePath(Path)) then 175 | begin 176 | Response.AsFile(GetFilePath(Path)); 177 | Exit; 178 | end; 179 | end; 180 | if not ProcRequest(Request, Response) then 181 | Response.ResponseNo := 404; 182 | end; 183 | 184 | function THTTPServer.GetFilePath(const FileName: string): string; 185 | begin 186 | Result := TPath.Combine(FContentPath, FileName.TrimLeft(['/'])); 187 | end; 188 | 189 | function THTTPServer.ProcRequest(Request: TRequest; Response: TResponse): Boolean; 190 | begin 191 | for var Route in FRoutes do 192 | if Route.CheckURI(Request) then 193 | begin 194 | Route.Execute(Request, Response); 195 | Exit(True); 196 | end; 197 | Result := False; 198 | end; 199 | 200 | procedure THTTPServer.Route(Method: THTTPCommands; const URI: string; Proc: TRttiMethod); 201 | begin 202 | var LMethod: TMethod; 203 | LMethod.Code := Proc.CodeAddress; 204 | LMethod.Data := Self; 205 | FRoutes.Add(TRouteFull.Create(Method.ToHTTPCommandTypes, URI, TOnRequestProc(LMethod))); 206 | end; 207 | 208 | procedure THTTPServer.Route(const URI: string; Proc: TOnResponsePlainText); 209 | begin 210 | FRoutes.Add(TRoutePlaiText.Create([], URI, Proc)); 211 | end; 212 | 213 | procedure THTTPServer.Route(Method: THTTPCommands; const URI: string; Proc: TOnResponsePlainText); 214 | begin 215 | FRoutes.Add(TRoutePlaiText.Create(Method.ToHTTPCommandTypes, URI, Proc)); 216 | end; 217 | 218 | procedure THTTPServer.Route(Method: THTTPCommands; const URI: string; Proc: TOnRequest); 219 | begin 220 | FRoutes.Add(TRouteFull.Create(Method.ToHTTPCommandTypes, URI, Proc)); 221 | end; 222 | 223 | procedure THTTPServer.Route(const URI: string; Proc: TOnRequest); 224 | begin 225 | Route([], URI, Proc); 226 | end; 227 | 228 | procedure THTTPServer.RunSync(const Port: Word); 229 | begin 230 | Instance.Bindings.Add.Port := Port; 231 | Instance.Active := True; 232 | end; 233 | 234 | procedure THTTPServer.Run(const Ports: TArray); 235 | begin 236 | var command: string; 237 | Writeln('Starting...'); 238 | repeat 239 | try 240 | TTask.Run( 241 | procedure 242 | begin 243 | for var Port in Ports do 244 | if Port <> 0 then 245 | Instance.Bindings.Add.Port := Port; 246 | Instance.Active := True; 247 | end); 248 | Writeln('Started'); 249 | repeat 250 | Readln(command) 251 | until command = 'quit'; 252 | except 253 | on E: Exception do 254 | begin 255 | Writeln(E.ClassName + ': ' + E.Message); 256 | Sleep(1000); 257 | Writeln('Restaring...'); 258 | end; 259 | end; 260 | until command = 'quit'; 261 | end; 262 | 263 | procedure THTTPServer.SetAutoFileServer(const Value: Boolean); 264 | begin 265 | FAutoFileServer := Value; 266 | end; 267 | 268 | { RouteMethod } 269 | 270 | constructor RouteMethod.Create(const URI: string; Method: THTTPCommands); 271 | begin 272 | inherited Create; 273 | Self.URI := URI; 274 | Self.Method := Method; 275 | end; 276 | 277 | { TResponseHelper } 278 | 279 | procedure TResponseHelper.Json(const Text: string; Code: Integer); 280 | begin 281 | ContentText := Text; 282 | ContentType := 'application/json'; 283 | ResponseNo := Code; 284 | end; 285 | 286 | procedure TResponseHelper.Json(const JSONValue: TJSONValue; Code: Integer); 287 | begin 288 | try 289 | Json(JSONValue.ToJSON, Code); 290 | finally 291 | JSONValue.Free; 292 | end; 293 | end; 294 | 295 | procedure TResponseHelper.AsFile(const FileName: string; Code: Integer); 296 | begin 297 | ContentType := HTTPServer.MIMETable.GetFileMIMEType(FileName); 298 | //ContentLength := TFile.GetSize(FileName); 299 | ContentStream := TFileStream.Create(FileName, fmShareDenyWrite); 300 | ResponseNo := Code; 301 | end; 302 | 303 | procedure TResponseHelper.Json(const Obj: TObject; Code: Integer); 304 | begin 305 | Json(TJson.ObjectToJsonString(Obj), Code); 306 | end; 307 | 308 | { TRequestHelper } 309 | 310 | function TRequestHelper.IsDelete: Boolean; 311 | begin 312 | Result := CommandType = hcDELETE; 313 | end; 314 | 315 | function TRequestHelper.IsGet: Boolean; 316 | begin 317 | Result := CommandType = hcGET; 318 | end; 319 | 320 | function TRequestHelper.IsHead: Boolean; 321 | begin 322 | Result := CommandType = hcHEAD; 323 | end; 324 | 325 | function TRequestHelper.IsOption: Boolean; 326 | begin 327 | Result := CommandType = hcOPTION; 328 | end; 329 | 330 | function TRequestHelper.IsPost: Boolean; 331 | begin 332 | Result := CommandType = hcPOST; 333 | end; 334 | 335 | function TRequestHelper.IsPut: Boolean; 336 | begin 337 | Result := CommandType = hcPUT; 338 | end; 339 | 340 | function TRequestHelper.IsTrace: Boolean; 341 | begin 342 | Result := CommandType = hcTRACE; 343 | end; 344 | 345 | { THTTPCommandsHelper } 346 | 347 | function THTTPCommandsHelper.ToHTTPCommandTypes: THTTPCommandTypes; 348 | begin 349 | if GET in Self then 350 | Include(Result, hcGET); 351 | if HEAD in Self then 352 | Include(Result, hcHEAD); 353 | if POST in Self then 354 | Include(Result, hcPOST); 355 | if DELETE in Self then 356 | Include(Result, hcDELETE); 357 | if PUT in Self then 358 | Include(Result, hcPUT); 359 | if TRACE in Self then 360 | Include(Result, hcTRACE); 361 | if OPTION in Self then 362 | Include(Result, hcOPTION); 363 | end; 364 | 365 | { TRoute } 366 | 367 | function TRoute.CheckURI(Request: TRequest): Boolean; 368 | begin 369 | Result := ((Method = []) or (Request.CommandType in Method)) and (Request.URI = URI); 370 | end; 371 | 372 | constructor TRoute.Create(const URI: string); 373 | begin 374 | Create([], URI); 375 | end; 376 | 377 | constructor TRoute.Create(Method: THTTPCommandTypes; const URI: string); 378 | begin 379 | inherited Create; 380 | Self.Method := Method; 381 | Self.URI := URI; 382 | end; 383 | 384 | constructor TRoute.Create; 385 | begin 386 | inherited; 387 | Method := []; 388 | URI := ''; 389 | end; 390 | 391 | { TRouteFull } 392 | 393 | constructor TRouteFull.Create(const URI: string; Proc: TOnRequest); 394 | begin 395 | inherited Create(URI); 396 | Self.Proc := Proc; 397 | end; 398 | 399 | constructor TRouteFull.Create(Method: THTTPCommandTypes; const URI: string; Proc: TOnRequest); 400 | begin 401 | inherited Create(Method, URI); 402 | Self.Proc := Proc; 403 | end; 404 | 405 | procedure TRouteFull.Execute(Request: TRequest; Response: TResponse); 406 | begin 407 | Proc(Request, Response); 408 | end; 409 | 410 | { TRoutePlaiText } 411 | 412 | constructor TRoutePlaiText.Create(const URI: string; Proc: TOnResponsePlainText); 413 | begin 414 | inherited Create(URI); 415 | Self.Proc := Proc; 416 | end; 417 | 418 | constructor TRoutePlaiText.Create(Method: THTTPCommandTypes; const URI: string; Proc: TOnResponsePlainText); 419 | begin 420 | inherited Create(Method, URI); 421 | Self.Proc := Proc; 422 | end; 423 | 424 | procedure TRoutePlaiText.Execute(Request: TRequest; Response: TResponse); 425 | var 426 | ResponseText: string; 427 | ResponseCode: Word; 428 | begin 429 | ResponseCode := 200; 430 | Proc(ResponseText, ResponseCode); 431 | Response.ContentText := ResponseText; 432 | Response.ResponseNo := ResponseCode; 433 | end; 434 | 435 | end. 436 | 437 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 HemulGM 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /MiniWebServer.dpr: -------------------------------------------------------------------------------- 1 | program MiniWebServer; 2 | 3 | uses 4 | HTTP.Server in 'HTTP.Server.pas', 5 | WMS.OWM in 'Sample\WMS.OWM.pas'; 6 | 7 | begin 8 | var Server := THTTPServer.Create; 9 | try 10 | Server.Route('/weather', GetWeather); 11 | Server.Run([80, 8080, 9090]); 12 | finally 13 | Server.Free; 14 | end; 15 | end. 16 | 17 | -------------------------------------------------------------------------------- /MiniWebServer.dproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | {32D58A95-5F37-453A-A619-A0D93C2AD6D9} 4 | 19.2 5 | None 6 | True 7 | Debug 8 | Win32 9 | 1 10 | Console 11 | MiniWebServer.dpr 12 | 13 | 14 | true 15 | 16 | 17 | true 18 | Base 19 | true 20 | 21 | 22 | true 23 | Base 24 | true 25 | 26 | 27 | true 28 | Base 29 | true 30 | 31 | 32 | true 33 | Base 34 | true 35 | 36 | 37 | true 38 | Base 39 | true 40 | 41 | 42 | true 43 | Base 44 | true 45 | 46 | 47 | true 48 | Base 49 | true 50 | 51 | 52 | true 53 | Cfg_1 54 | true 55 | true 56 | 57 | 58 | true 59 | Base 60 | true 61 | 62 | 63 | .\$(Platform)\$(Config) 64 | .\$(Platform)\$(Config) 65 | false 66 | false 67 | false 68 | false 69 | false 70 | System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) 71 | MiniWebServer 72 | 73 | 74 | DBXSqliteDriver;IndyIPCommon;RESTComponents;bindcompdbx;DBXInterBaseDriver;IndyIPServer;IndySystem;tethering;DzHTMLText_FMX;fmxFireDAC;FireDAC;bindcompfmx;FireDACSqliteDriver;FMXTee;soaprtl;DbxCommonDriver;FmxTeeUI;fmx;FireDACIBDriver;xmlrtl;soapmidas;rtl;DbxClientDriver;CustomIPTransport;dbexpress;IndyCore;bindcomp;dsnap;FireDACCommon;IndyIPClient;RESTBackendComponents;soapserver;dbxcds;bindengine;CloudService;dsnapxml;dbrtl;IndyProtocols;FireDACCommonDriver;inet;$(DCC_UsePackage) 75 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png 76 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png 77 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png 78 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png 79 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png 80 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png 81 | $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png 82 | $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png 83 | $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png 84 | $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png 85 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_24x24.png 86 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_36x36.png 87 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_48x48.png 88 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_72x72.png 89 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_96x96.png 90 | android-support-v4.dex.jar;cloud-messaging.dex.jar;com-google-android-gms.play-services-ads-base.17.2.0.dex.jar;com-google-android-gms.play-services-ads-identifier.16.0.0.dex.jar;com-google-android-gms.play-services-ads-lite.17.2.0.dex.jar;com-google-android-gms.play-services-ads.17.2.0.dex.jar;com-google-android-gms.play-services-analytics-impl.16.0.8.dex.jar;com-google-android-gms.play-services-analytics.16.0.8.dex.jar;com-google-android-gms.play-services-base.16.0.1.dex.jar;com-google-android-gms.play-services-basement.16.2.0.dex.jar;com-google-android-gms.play-services-gass.17.2.0.dex.jar;com-google-android-gms.play-services-identity.16.0.0.dex.jar;com-google-android-gms.play-services-maps.16.1.0.dex.jar;com-google-android-gms.play-services-measurement-base.16.4.0.dex.jar;com-google-android-gms.play-services-measurement-sdk-api.16.4.0.dex.jar;com-google-android-gms.play-services-stats.16.0.1.dex.jar;com-google-android-gms.play-services-tagmanager-v4-impl.16.0.8.dex.jar;com-google-android-gms.play-services-tasks.16.0.1.dex.jar;com-google-android-gms.play-services-wallet.16.0.1.dex.jar;com-google-firebase.firebase-analytics.16.4.0.dex.jar;com-google-firebase.firebase-common.16.1.0.dex.jar;com-google-firebase.firebase-iid-interop.16.0.1.dex.jar;com-google-firebase.firebase-iid.17.1.1.dex.jar;com-google-firebase.firebase-measurement-connector.17.0.1.dex.jar;com-google-firebase.firebase-messaging.17.5.0.dex.jar;fmx.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar 91 | 92 | 93 | DBXSqliteDriver;IndyIPCommon;RESTComponents;bindcompdbx;DBXInterBaseDriver;IndyIPServer;IndySystem;tethering;DzHTMLText_FMX;fmxFireDAC;FireDAC;bindcompfmx;FireDACSqliteDriver;FMXTee;soaprtl;DbxCommonDriver;FmxTeeUI;fmx;FireDACIBDriver;xmlrtl;soapmidas;rtl;DbxClientDriver;CustomIPTransport;dbexpress;IndyCore;bindcomp;dsnap;FireDACCommon;IndyIPClient;RESTBackendComponents;soapserver;dbxcds;bindengine;CloudService;dsnapxml;dbrtl;IndyProtocols;FireDACCommonDriver;inet;$(DCC_UsePackage) 94 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png 95 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png 96 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png 97 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png 98 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png 99 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png 100 | $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png 101 | $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png 102 | $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png 103 | $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png 104 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_24x24.png 105 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_36x36.png 106 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_48x48.png 107 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_72x72.png 108 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_96x96.png 109 | android-support-v4.dex.jar;cloud-messaging.dex.jar;com-google-android-gms.play-services-ads-base.17.2.0.dex.jar;com-google-android-gms.play-services-ads-identifier.16.0.0.dex.jar;com-google-android-gms.play-services-ads-lite.17.2.0.dex.jar;com-google-android-gms.play-services-ads.17.2.0.dex.jar;com-google-android-gms.play-services-analytics-impl.16.0.8.dex.jar;com-google-android-gms.play-services-analytics.16.0.8.dex.jar;com-google-android-gms.play-services-base.16.0.1.dex.jar;com-google-android-gms.play-services-basement.16.2.0.dex.jar;com-google-android-gms.play-services-gass.17.2.0.dex.jar;com-google-android-gms.play-services-identity.16.0.0.dex.jar;com-google-android-gms.play-services-maps.16.1.0.dex.jar;com-google-android-gms.play-services-measurement-base.16.4.0.dex.jar;com-google-android-gms.play-services-measurement-sdk-api.16.4.0.dex.jar;com-google-android-gms.play-services-stats.16.0.1.dex.jar;com-google-android-gms.play-services-tagmanager-v4-impl.16.0.8.dex.jar;com-google-android-gms.play-services-tasks.16.0.1.dex.jar;com-google-android-gms.play-services-wallet.16.0.1.dex.jar;com-google-firebase.firebase-analytics.16.4.0.dex.jar;com-google-firebase.firebase-common.16.1.0.dex.jar;com-google-firebase.firebase-iid-interop.16.0.1.dex.jar;com-google-firebase.firebase-iid.17.1.1.dex.jar;com-google-firebase.firebase-measurement-connector.17.0.1.dex.jar;com-google-firebase.firebase-messaging.17.5.0.dex.jar;fmx.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar 110 | 111 | 112 | CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing bluetooth;NSBluetoothPeripheralUsageDescription=The reason for accessing bluetooth peripherals;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSMotionUsageDescription=The reason for accessing the accelerometer;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers 113 | iPhoneAndiPad 114 | true 115 | Debug 116 | $(MSBuildProjectName) 117 | 118 | 119 | CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing bluetooth;NSBluetoothPeripheralUsageDescription=The reason for accessing bluetooth peripherals;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSMotionUsageDescription=The reason for accessing the accelerometer;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers 120 | iPhoneAndiPad 121 | true 122 | 123 | 124 | DBXSqliteDriver;IndyIPCommon;RESTComponents;bindcompdbx;DBXInterBaseDriver;vcl;IndyIPServer;vclactnband;IcsVclD104Run;vclFireDAC;IndySystem;IconFontsImageListFMX;bindcompvclsmp;tethering;svnui;bindcompvclwinx;dsnapcon;FireDACADSDriver;DzHTMLText_FMX;FireDACMSAccDriver;fmxFireDAC;IcsFmxD104Run;vclimg;TeeDB;FireDAC;PngComponentsD;vcltouch;IconFontsImageList;Jcl;vcldb;bindcompfmx;svn;FireDACSqliteDriver;FireDACPgDriver;inetdb;ChromeTabs_R;VirtualTreesDR;FMXTee;soaprtl;DbxCommonDriver;FmxTeeUI;fmx;FireDACIBDriver;fmxdae;xmlrtl;soapmidas;vcledge;fmxobj;vclwinx;Tee;rtl;DbxClientDriver;CustomIPTransport;vcldsnap;dbexpress;IndyCore;vclx;SynEditDR;bindcomp;appanalytics;dsnap;SVGIconImageListFMX;FireDACCommon;IndyIPClient;bindcompvcl;RESTBackendComponents;SVGIconImageList;TeeUI;VCLRESTComponents;soapserver;dbxcds;VclSmp;FMXPAN100;adortl;JclDeveloperTools;JclVcl;vclie;IcsCommonD104Run;bindengine;DBXMySQLDriver;CloudService;dsnapxml;FireDACMySQLDriver;dbrtl;IndyProtocols;inetdbxpress;SVGIconPackage;FireDACCommonODBC;FireDACCommonDriver;JclContainers;inet;fmxase;$(DCC_UsePackage) 125 | Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) 126 | Debug 127 | CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= 128 | 1033 129 | true 130 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png 131 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png 132 | 133 | 134 | DBXSqliteDriver;IndyIPCommon;RESTComponents;bindcompdbx;DBXInterBaseDriver;vcl;IndyIPServer;vclactnband;IcsVclD104Run;vclFireDAC;IndySystem;bindcompvclsmp;tethering;bindcompvclwinx;dsnapcon;FireDACADSDriver;DzHTMLText_FMX;FireDACMSAccDriver;fmxFireDAC;IcsFmxD104Run;vclimg;TeeDB;FireDAC;PngComponentsD;vcltouch;vcldb;bindcompfmx;FireDACSqliteDriver;FireDACPgDriver;inetdb;ChromeTabs_R;VirtualTreesDR;FMXTee;soaprtl;DbxCommonDriver;FmxTeeUI;fmx;FireDACIBDriver;fmxdae;xmlrtl;soapmidas;vcledge;fmxobj;vclwinx;Tee;rtl;DbxClientDriver;CustomIPTransport;vcldsnap;dbexpress;IndyCore;vclx;SynEditDR;bindcomp;appanalytics;dsnap;SVGIconImageListFMX;FireDACCommon;IndyIPClient;bindcompvcl;RESTBackendComponents;SVGIconImageList;TeeUI;VCLRESTComponents;soapserver;dbxcds;VclSmp;FMXPAN100;adortl;vclie;IcsCommonD104Run;bindengine;DBXMySQLDriver;CloudService;dsnapxml;FireDACMySQLDriver;dbrtl;IndyProtocols;inetdbxpress;SVGIconPackage;FireDACCommonODBC;FireDACCommonDriver;inet;fmxase;$(DCC_UsePackage) 135 | true 136 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png 137 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png 138 | 139 | 140 | DEBUG;$(DCC_Define) 141 | true 142 | false 143 | true 144 | true 145 | true 146 | 147 | 148 | false 149 | 150 | 151 | false 152 | RELEASE;$(DCC_Define) 153 | 0 154 | 0 155 | 156 | 157 | 158 | MainSource 159 | 160 | 161 | 162 | 163 | Cfg_2 164 | Base 165 | 166 | 167 | Base 168 | 169 | 170 | Cfg_1 171 | Base 172 | 173 | 174 | 175 | Delphi.Personality.12 176 | Application 177 | 178 | 179 | 180 | MiniWebServer.dpr 181 | 182 | 183 | 184 | 185 | 186 | true 187 | 188 | 189 | 190 | 191 | true 192 | 193 | 194 | 195 | 196 | true 197 | 198 | 199 | 200 | 201 | 202 | MiniWebServer.exe 203 | true 204 | 205 | 206 | 207 | 208 | 1 209 | 210 | 211 | Contents\MacOS 212 | 1 213 | 214 | 215 | 0 216 | 217 | 218 | 219 | 220 | classes 221 | 64 222 | 223 | 224 | classes 225 | 64 226 | 227 | 228 | 229 | 230 | classes 231 | 1 232 | 233 | 234 | classes 235 | 1 236 | 237 | 238 | 239 | 240 | res\xml 241 | 1 242 | 243 | 244 | res\xml 245 | 1 246 | 247 | 248 | 249 | 250 | library\lib\armeabi-v7a 251 | 1 252 | 253 | 254 | 255 | 256 | library\lib\armeabi 257 | 1 258 | 259 | 260 | library\lib\armeabi 261 | 1 262 | 263 | 264 | 265 | 266 | library\lib\armeabi-v7a 267 | 1 268 | 269 | 270 | 271 | 272 | library\lib\mips 273 | 1 274 | 275 | 276 | library\lib\mips 277 | 1 278 | 279 | 280 | 281 | 282 | library\lib\armeabi-v7a 283 | 1 284 | 285 | 286 | library\lib\arm64-v8a 287 | 1 288 | 289 | 290 | 291 | 292 | library\lib\armeabi-v7a 293 | 1 294 | 295 | 296 | 297 | 298 | res\drawable 299 | 1 300 | 301 | 302 | res\drawable 303 | 1 304 | 305 | 306 | 307 | 308 | res\values 309 | 1 310 | 311 | 312 | res\values 313 | 1 314 | 315 | 316 | 317 | 318 | res\values-v21 319 | 1 320 | 321 | 322 | res\values-v21 323 | 1 324 | 325 | 326 | 327 | 328 | res\values 329 | 1 330 | 331 | 332 | res\values 333 | 1 334 | 335 | 336 | 337 | 338 | res\drawable 339 | 1 340 | 341 | 342 | res\drawable 343 | 1 344 | 345 | 346 | 347 | 348 | res\drawable-xxhdpi 349 | 1 350 | 351 | 352 | res\drawable-xxhdpi 353 | 1 354 | 355 | 356 | 357 | 358 | res\drawable-xxxhdpi 359 | 1 360 | 361 | 362 | res\drawable-xxxhdpi 363 | 1 364 | 365 | 366 | 367 | 368 | res\drawable-ldpi 369 | 1 370 | 371 | 372 | res\drawable-ldpi 373 | 1 374 | 375 | 376 | 377 | 378 | res\drawable-mdpi 379 | 1 380 | 381 | 382 | res\drawable-mdpi 383 | 1 384 | 385 | 386 | 387 | 388 | res\drawable-hdpi 389 | 1 390 | 391 | 392 | res\drawable-hdpi 393 | 1 394 | 395 | 396 | 397 | 398 | res\drawable-xhdpi 399 | 1 400 | 401 | 402 | res\drawable-xhdpi 403 | 1 404 | 405 | 406 | 407 | 408 | res\drawable-mdpi 409 | 1 410 | 411 | 412 | res\drawable-mdpi 413 | 1 414 | 415 | 416 | 417 | 418 | res\drawable-hdpi 419 | 1 420 | 421 | 422 | res\drawable-hdpi 423 | 1 424 | 425 | 426 | 427 | 428 | res\drawable-xhdpi 429 | 1 430 | 431 | 432 | res\drawable-xhdpi 433 | 1 434 | 435 | 436 | 437 | 438 | res\drawable-xxhdpi 439 | 1 440 | 441 | 442 | res\drawable-xxhdpi 443 | 1 444 | 445 | 446 | 447 | 448 | res\drawable-xxxhdpi 449 | 1 450 | 451 | 452 | res\drawable-xxxhdpi 453 | 1 454 | 455 | 456 | 457 | 458 | res\drawable-small 459 | 1 460 | 461 | 462 | res\drawable-small 463 | 1 464 | 465 | 466 | 467 | 468 | res\drawable-normal 469 | 1 470 | 471 | 472 | res\drawable-normal 473 | 1 474 | 475 | 476 | 477 | 478 | res\drawable-large 479 | 1 480 | 481 | 482 | res\drawable-large 483 | 1 484 | 485 | 486 | 487 | 488 | res\drawable-xlarge 489 | 1 490 | 491 | 492 | res\drawable-xlarge 493 | 1 494 | 495 | 496 | 497 | 498 | res\values 499 | 1 500 | 501 | 502 | res\values 503 | 1 504 | 505 | 506 | 507 | 508 | 1 509 | 510 | 511 | Contents\MacOS 512 | 1 513 | 514 | 515 | 0 516 | 517 | 518 | 519 | 520 | Contents\MacOS 521 | 1 522 | .framework 523 | 524 | 525 | Contents\MacOS 526 | 1 527 | .framework 528 | 529 | 530 | 0 531 | 532 | 533 | 534 | 535 | 1 536 | .dylib 537 | 538 | 539 | 1 540 | .dylib 541 | 542 | 543 | 1 544 | .dylib 545 | 546 | 547 | Contents\MacOS 548 | 1 549 | .dylib 550 | 551 | 552 | Contents\MacOS 553 | 1 554 | .dylib 555 | 556 | 557 | 0 558 | .dll;.bpl 559 | 560 | 561 | 562 | 563 | 1 564 | .dylib 565 | 566 | 567 | 1 568 | .dylib 569 | 570 | 571 | 1 572 | .dylib 573 | 574 | 575 | Contents\MacOS 576 | 1 577 | .dylib 578 | 579 | 580 | Contents\MacOS 581 | 1 582 | .dylib 583 | 584 | 585 | 0 586 | .bpl 587 | 588 | 589 | 590 | 591 | 0 592 | 593 | 594 | 0 595 | 596 | 597 | 0 598 | 599 | 600 | 0 601 | 602 | 603 | 0 604 | 605 | 606 | Contents\Resources\StartUp\ 607 | 0 608 | 609 | 610 | Contents\Resources\StartUp\ 611 | 0 612 | 613 | 614 | 0 615 | 616 | 617 | 618 | 619 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 620 | 1 621 | 622 | 623 | 624 | 625 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 626 | 1 627 | 628 | 629 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 630 | 1 631 | 632 | 633 | 634 | 635 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 636 | 1 637 | 638 | 639 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 640 | 1 641 | 642 | 643 | 644 | 645 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 646 | 1 647 | 648 | 649 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 650 | 1 651 | 652 | 653 | 654 | 655 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 656 | 1 657 | 658 | 659 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 660 | 1 661 | 662 | 663 | 664 | 665 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 666 | 1 667 | 668 | 669 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 670 | 1 671 | 672 | 673 | 674 | 675 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 676 | 1 677 | 678 | 679 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 680 | 1 681 | 682 | 683 | 684 | 685 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 686 | 1 687 | 688 | 689 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 690 | 1 691 | 692 | 693 | 694 | 695 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 696 | 1 697 | 698 | 699 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 700 | 1 701 | 702 | 703 | 704 | 705 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 706 | 1 707 | 708 | 709 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 710 | 1 711 | 712 | 713 | 714 | 715 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 716 | 1 717 | 718 | 719 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 720 | 1 721 | 722 | 723 | 724 | 725 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 726 | 1 727 | 728 | 729 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 730 | 1 731 | 732 | 733 | 734 | 735 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 736 | 1 737 | 738 | 739 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 740 | 1 741 | 742 | 743 | 744 | 745 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 746 | 1 747 | 748 | 749 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 750 | 1 751 | 752 | 753 | 754 | 755 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 756 | 1 757 | 758 | 759 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 760 | 1 761 | 762 | 763 | 764 | 765 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 766 | 1 767 | 768 | 769 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 770 | 1 771 | 772 | 773 | 774 | 775 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 776 | 1 777 | 778 | 779 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 780 | 1 781 | 782 | 783 | 784 | 785 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 786 | 1 787 | 788 | 789 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 790 | 1 791 | 792 | 793 | 794 | 795 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 796 | 1 797 | 798 | 799 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 800 | 1 801 | 802 | 803 | 804 | 805 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 806 | 1 807 | 808 | 809 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 810 | 1 811 | 812 | 813 | 814 | 815 | 1 816 | 817 | 818 | 1 819 | 820 | 821 | 822 | 823 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 824 | 1 825 | 826 | 827 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 828 | 1 829 | 830 | 831 | 832 | 833 | ..\ 834 | 1 835 | 836 | 837 | ..\ 838 | 1 839 | 840 | 841 | 842 | 843 | 1 844 | 845 | 846 | 1 847 | 848 | 849 | 1 850 | 851 | 852 | 853 | 854 | ..\$(PROJECTNAME).launchscreen 855 | 64 856 | 857 | 858 | ..\$(PROJECTNAME).launchscreen 859 | 64 860 | 861 | 862 | 863 | 864 | 1 865 | 866 | 867 | 1 868 | 869 | 870 | 1 871 | 872 | 873 | 874 | 875 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 876 | 1 877 | 878 | 879 | 880 | 881 | ..\ 882 | 1 883 | 884 | 885 | ..\ 886 | 1 887 | 888 | 889 | 890 | 891 | Contents 892 | 1 893 | 894 | 895 | Contents 896 | 1 897 | 898 | 899 | 900 | 901 | Contents\Resources 902 | 1 903 | 904 | 905 | Contents\Resources 906 | 1 907 | 908 | 909 | 910 | 911 | library\lib\armeabi-v7a 912 | 1 913 | 914 | 915 | library\lib\arm64-v8a 916 | 1 917 | 918 | 919 | 1 920 | 921 | 922 | 1 923 | 924 | 925 | 1 926 | 927 | 928 | 1 929 | 930 | 931 | Contents\MacOS 932 | 1 933 | 934 | 935 | Contents\MacOS 936 | 1 937 | 938 | 939 | 0 940 | 941 | 942 | 943 | 944 | library\lib\armeabi-v7a 945 | 1 946 | 947 | 948 | 949 | 950 | 1 951 | 952 | 953 | 1 954 | 955 | 956 | 957 | 958 | Assets 959 | 1 960 | 961 | 962 | Assets 963 | 1 964 | 965 | 966 | 967 | 968 | Assets 969 | 1 970 | 971 | 972 | Assets 973 | 1 974 | 975 | 976 | 977 | 978 | 979 | 980 | 981 | 982 | 983 | 984 | 985 | 986 | 987 | 988 | 989 | 990 | False 991 | False 992 | False 993 | False 994 | True 995 | False 996 | 997 | 998 | 12 999 | 1000 | 1001 | 1002 | 1003 | 1004 | -------------------------------------------------------------------------------- /MiniWebServer.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HemulGM/MiniWebServer/37769fea8d1e6527773d4279351e2a02ae69111f/MiniWebServer.res -------------------------------------------------------------------------------- /MiniWebServerGroup.groupproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | {D76B0ABE-CC8E-4FFE-995D-DB1F59FF7E31} 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | Default.Personality.12 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 | -------------------------------------------------------------------------------- /MiniWebServer_Attrib.dpr: -------------------------------------------------------------------------------- 1 | program MiniWebServer_Attrib; 2 | 3 | uses 4 | System.SysUtils, 5 | System.Json, 6 | HTTP.Server in 'HTTP.Server.pas', 7 | WMS.OWM in 'Sample\WMS.OWM.pas'; 8 | 9 | type 10 | TServer = class(THTTPServer) 11 | procedure Test(Request: TRequest; Response: TResponse); 12 | procedure Check(Request: TRequest; Response: TResponse); 13 | end; 14 | 15 | { TServer } 16 | 17 | [RouteMethod('/check', [GET])] 18 | procedure TServer.Check; 19 | begin 20 | //send json 21 | Response.Json('{ "value": "test_text" }', 401); 22 | //send file 23 | Response.AsFile('C:\file.ext'); 24 | end; 25 | 26 | [RouteMethod('/test', [GET, HEAD])] 27 | procedure TServer.Test; 28 | begin 29 | var Json := TJSONObject.Create; 30 | 31 | Json.AddPair('id', TJSONNumber.Create(Request.Params.Values['id'].ToInteger)); 32 | Json.AddPair('text', 'Text'); 33 | Json.AddPair('array', TJSONArray.Create('text1', 'text2')); 34 | Response.Json(Json); 35 | end; 36 | 37 | begin 38 | var Server := TServer.Create; 39 | try 40 | Server.AutoFileServer := True; 41 | Server.Route('/run', 42 | procedure(Request: TRequest; Response: TResponse) 43 | begin 44 | Response.Json('{ "text": "done" }', 200); 45 | end); 46 | Server.Route('/weather', GetWeather); 47 | Server.Run([777]); 48 | finally 49 | Server.Free; 50 | end; 51 | end. 52 | 53 | -------------------------------------------------------------------------------- /MiniWebServer_Attrib.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HemulGM/MiniWebServer/37769fea8d1e6527773d4279351e2a02ae69111f/MiniWebServer_Attrib.res -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # MiniWebServer 2 | 3 | ```pascal 4 | program MiniWebServer; 5 | 6 | uses 7 | HTTP.Server in 'HTTP.Server.pas', 8 | WMS.OWM in 'Sample\WMS.OWM.pas'; 9 | 10 | begin 11 | var Server := THTTPServer.Create; 12 | try 13 | Server.Route('/weather', GetWeather); 14 | Server.Run([80, 8080, 9090]); 15 | finally 16 | Server.Free; 17 | end; 18 | end. 19 | ``` 20 | 21 | ```pascal 22 | program MiniWebServer_Attrib; 23 | 24 | uses 25 | HTTP.Server in 'HTTP.Server.pas', 26 | WMS.OWM in 'Sample\WMS.OWM.pas'; 27 | 28 | type 29 | TServer = class(THTTPServer) 30 | //auto class routes 31 | [RouteMethod('/test', [GET, HEAD])] 32 | procedure Test(Request: TRequest; Response: TResponse); 33 | [RouteMethod('/check', [GET])] 34 | procedure Check(Request: TRequest; Response: TResponse); 35 | end; 36 | 37 | { TServer } 38 | 39 | procedure TServer.Check; 40 | begin 41 | //send json text 42 | Response.Json('{ "value": "test_text" }', 401); 43 | //send file 44 | Response.AsFile('C:\file.ext'); 45 | //send json object 46 | var JObject := TJsonObject.Create; 47 | Response.Json(JObject, 200); // auto clear 48 | end; 49 | 50 | procedure TServer.Test; 51 | begin 52 | //send object 53 | var Obj := TObject.Create; 54 | Response.Json(Obj); 55 | Obj.Free; 56 | end; 57 | 58 | begin 59 | var Server := TServer.Create; 60 | try 61 | //GET files 62 | Server.AutoFileServer := True; 63 | //inline route 64 | Server.Route('/run', 65 | procedure(Request: TRequest; Response: TResponse) 66 | begin 67 | Response.Json('{ "text": "done" }', 200); 68 | end); 69 | //add route 70 | Server.Route('/weather', GetWeather); 71 | Server.Run([80, 8080, 9090]); 72 | finally 73 | Server.Free; 74 | end; 75 | end. 76 | ``` 77 | -------------------------------------------------------------------------------- /Sample/StressTest/StressTest.dpr: -------------------------------------------------------------------------------- 1 | program StressTest; 2 | 3 | uses 4 | System.SysUtils, 5 | HTTP.Server in '..\..\HTTP.Server.pas'; 6 | 7 | begin 8 | var Server := THTTPServer.Create; 9 | try 10 | Server.Route('/', 11 | procedure(var Response: string; var Code: Word) 12 | begin 13 | Response := 'Hello World Delphi!'; 14 | end); 15 | 16 | Server.Route('/readfile', 17 | procedure(Request: TRequest; Response: TResponse) 18 | begin 19 | Response.AsFile('data.txt'); 20 | end); 21 | 22 | Server.Route('/fibonacci', 23 | procedure(var Response: string; var Code: Word) 24 | begin 25 | Sleep(10000); 26 | var a, b, c: Cardinal; 27 | a := 0; 28 | b := 1; 29 | c := 0; 30 | for var i := 2 to 2000000 do 31 | begin 32 | c := a + b; 33 | a := b; 34 | b := c; 35 | end; 36 | Response := c.ToString; 37 | end); 38 | Server.Run([555]); 39 | finally 40 | Server.Free; 41 | end; 42 | end. 43 | 44 | -------------------------------------------------------------------------------- /Sample/StressTest/StressTest.dproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | {5261ED2C-5EAC-441F-8B9A-00DFEA026399} 4 | 19.2 5 | None 6 | True 7 | Release 8 | Win32 9 | 1 10 | Console 11 | StressTest.dpr 12 | 13 | 14 | true 15 | 16 | 17 | true 18 | Base 19 | true 20 | 21 | 22 | true 23 | Base 24 | true 25 | 26 | 27 | true 28 | Base 29 | true 30 | 31 | 32 | true 33 | Base 34 | true 35 | 36 | 37 | true 38 | Base 39 | true 40 | 41 | 42 | true 43 | Base 44 | true 45 | 46 | 47 | true 48 | Base 49 | true 50 | 51 | 52 | true 53 | Cfg_1 54 | true 55 | true 56 | 57 | 58 | true 59 | Base 60 | true 61 | 62 | 63 | .\$(Platform)\$(Config) 64 | .\$(Platform)\$(Config) 65 | false 66 | false 67 | false 68 | false 69 | false 70 | System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) 71 | StressTest 72 | 73 | 74 | DBXSqliteDriver;RESTComponents;DBXInterBaseDriver;tethering;DzHTMLText_FMX;bindcompfmx;FmxTeeUI;fmx;FireDACIBDriver;dbexpress;IndyCore;dsnap;FireDACCommon;RESTBackendComponents;soapserver;Skia.Package.FMX;FMXAudioHGM;bindengine;CloudService;FireDACCommonDriver;inet;IndyIPCommon;bindcompdbx;IndyIPServer;sgcWebSocketsD10_4;IndySystem;fmxFireDAC;FireDAC;VLCPlayer;FireDACSqliteDriver;FMXTee;soaprtl;DbxCommonDriver;xmlrtl;soapmidas;rtl;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;Skia.Package.RTL;FrameStandPackage_10_4;dbxcds;dsnapxml;dbrtl;IndyProtocols;$(DCC_UsePackage) 75 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png 76 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png 77 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png 78 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png 79 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png 80 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png 81 | $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png 82 | $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png 83 | $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png 84 | $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png 85 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_24x24.png 86 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_36x36.png 87 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_48x48.png 88 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_72x72.png 89 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_96x96.png 90 | android-support-v4.dex.jar;cloud-messaging.dex.jar;com-google-android-gms.play-services-ads-base.17.2.0.dex.jar;com-google-android-gms.play-services-ads-identifier.16.0.0.dex.jar;com-google-android-gms.play-services-ads-lite.17.2.0.dex.jar;com-google-android-gms.play-services-ads.17.2.0.dex.jar;com-google-android-gms.play-services-analytics-impl.16.0.8.dex.jar;com-google-android-gms.play-services-analytics.16.0.8.dex.jar;com-google-android-gms.play-services-base.16.0.1.dex.jar;com-google-android-gms.play-services-basement.16.2.0.dex.jar;com-google-android-gms.play-services-gass.17.2.0.dex.jar;com-google-android-gms.play-services-identity.16.0.0.dex.jar;com-google-android-gms.play-services-maps.16.1.0.dex.jar;com-google-android-gms.play-services-measurement-base.16.4.0.dex.jar;com-google-android-gms.play-services-measurement-sdk-api.16.4.0.dex.jar;com-google-android-gms.play-services-stats.16.0.1.dex.jar;com-google-android-gms.play-services-tagmanager-v4-impl.16.0.8.dex.jar;com-google-android-gms.play-services-tasks.16.0.1.dex.jar;com-google-android-gms.play-services-wallet.16.0.1.dex.jar;com-google-firebase.firebase-analytics.16.4.0.dex.jar;com-google-firebase.firebase-common.16.1.0.dex.jar;com-google-firebase.firebase-iid-interop.16.0.1.dex.jar;com-google-firebase.firebase-iid.17.1.1.dex.jar;com-google-firebase.firebase-measurement-connector.17.0.1.dex.jar;com-google-firebase.firebase-messaging.17.5.0.dex.jar;fmx.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar 91 | 92 | 93 | DBXSqliteDriver;RESTComponents;DBXInterBaseDriver;tethering;DzHTMLText_FMX;bindcompfmx;FmxTeeUI;fmx;FireDACIBDriver;RadiantShapesFmx;dbexpress;IndyCore;dsnap;FireDACCommon;RESTBackendComponents;soapserver;Skia.Package.FMX;FMXAudioHGM;bindengine;CloudService;FireDACCommonDriver;inet;IndyIPCommon;bindcompdbx;CPortLibD2010;IndyIPServer;sgcWebSocketsD10_4;IndySystem;fmxFireDAC;FireDAC;VLCPlayer;FireDACSqliteDriver;FMXTee;soaprtl;DbxCommonDriver;xmlrtl;soapmidas;rtl;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;Skia.Package.RTL;FrameStandPackage_10_4;dbxcds;RadiantShapesFmx_Design;dsnapxml;dbrtl;IndyProtocols;$(DCC_UsePackage) 94 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png 95 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png 96 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png 97 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png 98 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png 99 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png 100 | $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png 101 | $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png 102 | $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png 103 | $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png 104 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_24x24.png 105 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_36x36.png 106 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_48x48.png 107 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_72x72.png 108 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_96x96.png 109 | android-support-v4.dex.jar;cloud-messaging.dex.jar;com-google-android-gms.play-services-ads-base.17.2.0.dex.jar;com-google-android-gms.play-services-ads-identifier.16.0.0.dex.jar;com-google-android-gms.play-services-ads-lite.17.2.0.dex.jar;com-google-android-gms.play-services-ads.17.2.0.dex.jar;com-google-android-gms.play-services-analytics-impl.16.0.8.dex.jar;com-google-android-gms.play-services-analytics.16.0.8.dex.jar;com-google-android-gms.play-services-base.16.0.1.dex.jar;com-google-android-gms.play-services-basement.16.2.0.dex.jar;com-google-android-gms.play-services-gass.17.2.0.dex.jar;com-google-android-gms.play-services-identity.16.0.0.dex.jar;com-google-android-gms.play-services-maps.16.1.0.dex.jar;com-google-android-gms.play-services-measurement-base.16.4.0.dex.jar;com-google-android-gms.play-services-measurement-sdk-api.16.4.0.dex.jar;com-google-android-gms.play-services-stats.16.0.1.dex.jar;com-google-android-gms.play-services-tagmanager-v4-impl.16.0.8.dex.jar;com-google-android-gms.play-services-tasks.16.0.1.dex.jar;com-google-android-gms.play-services-wallet.16.0.1.dex.jar;com-google-firebase.firebase-analytics.16.4.0.dex.jar;com-google-firebase.firebase-common.16.1.0.dex.jar;com-google-firebase.firebase-iid-interop.16.0.1.dex.jar;com-google-firebase.firebase-iid.17.1.1.dex.jar;com-google-firebase.firebase-measurement-connector.17.0.1.dex.jar;com-google-firebase.firebase-messaging.17.5.0.dex.jar;fmx.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar 110 | 111 | 112 | DBXSqliteDriver;RESTComponents;DBXInterBaseDriver;tethering;DzHTMLText_FMX;bindcompfmx;FmxTeeUI;fmx;FireDACIBDriver;RadiantShapesFmx;dbexpress;IndyCore;dsnap;FireDACCommon;RESTBackendComponents;soapserver;bindengine;CloudService;FireDACCommonDriver;inet;IndyIPCommon;bindcompdbx;CPortLibD2010;IndyIPServer;sgcWebSocketsD10_4;IndySystem;fmxFireDAC;FireDAC;VLCPlayer;FireDACSqliteDriver;FMXTee;soaprtl;DbxCommonDriver;xmlrtl;soapmidas;rtl;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;dbxcds;RadiantShapesFmx_Design;dsnapxml;dbrtl;IndyProtocols;fmxase;$(DCC_UsePackage) 113 | 114 | 115 | DBXSqliteDriver;RESTComponents;DBXInterBaseDriver;tethering;DzHTMLText_FMX;bindcompfmx;FmxTeeUI;fmx;FireDACIBDriver;dbexpress;IndyCore;dsnap;FireDACCommon;RESTBackendComponents;soapserver;bindengine;CloudService;FireDACCommonDriver;inet;IndyIPCommon;bindcompdbx;IndyIPServer;sgcWebSocketsD10_4;IndySystem;fmxFireDAC;FireDAC;VLCPlayer;FireDACSqliteDriver;FMXTee;soaprtl;DbxCommonDriver;xmlrtl;soapmidas;rtl;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;FrameStandPackage_10_4;dbxcds;dsnapxml;dbrtl;IndyProtocols;fmxase;$(DCC_UsePackage) 116 | 117 | 118 | DBXSqliteDriver;RESTComponents;DBXInterBaseDriver;vclactnband;vclFireDAC;bindcompvclsmp;tethering;svnui;FireDACADSDriver;DzHTMLText_FMX;PngComponentsD;vcltouch;IconFontsImageList;vcldb;bindcompfmx;svn;inetdb;VirtualTreesDR;FmxTeeUI;fmx;FireDACIBDriver;fmxdae;RadiantShapesFmx;vcledge;VKComponents;dbexpress;IndyCore;vclx;dsnap;SVGIconImageListFMX;FireDACCommon;RESTBackendComponents;VCLRESTComponents;Skia.Package.VCL;soapserver;FMXPAN100;Skia.Package.FMX;JclDeveloperTools;FMXAudioHGM;vclie;IcsCommonD104Run;bindengine;DBXMySQLDriver;CloudService;SVGIconPackage;FireDACMySQLDriver;FireDACCommonODBC;FireDACCommonDriver;TMSWEBCorePkgLibDXE13;inet;IndyIPCommon;bindcompdbx;IcsVclD104Run;CPortLibD2010;vcl;IndyIPServer;sgcWebSocketsD10_4;IconFontsImageListFMX;IndySystem;bindcompvclwinx;dsnapcon;FireDACMSAccDriver;fmxFireDAC;IcsFmxD104Run;vclimg;TeeDB;FireDAC;Jcl;VLCPlayer;FireDACSqliteDriver;FireDACPgDriver;ChromeTabs_R;TMSWEBCorePkgDXE13;FMXTee;soaprtl;DbxCommonDriver;Tee;xmlrtl;soapmidas;fmxobj;vclwinx;rtl;DbxClientDriver;CustomIPTransport;vcldsnap;bindcomp;appanalytics;IndyIPClient;Skia.Package.RTL;bindcompvcl;SynEdit_R;FrameStandPackage_10_4;SVGIconImageList;TeeUI;dbxcds;VclSmp;adortl;RadiantShapesFmx_Design;JclVcl;dsnapxml;dbrtl;IndyProtocols;inetdbxpress;FMXAppWizard;HGMComponents;JclContainers;fmxase;$(DCC_UsePackage) 119 | Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) 120 | Debug 121 | CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= 122 | 1033 123 | true 124 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png 125 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png 126 | 127 | 128 | DBXSqliteDriver;RESTComponents;DBXInterBaseDriver;vclactnband;vclFireDAC;bindcompvclsmp;tethering;FireDACADSDriver;DzHTMLText_FMX;PngComponentsD;vcltouch;vcldb;bindcompfmx;inetdb;VirtualTreesDR;FmxTeeUI;fmx;FireDACIBDriver;fmxdae;vcledge;dbexpress;IndyCore;vclx;dsnap;SVGIconImageListFMX;FireDACCommon;RESTBackendComponents;VCLRESTComponents;Skia.Package.VCL;soapserver;FMXPAN100;Skia.Package.FMX;FMXAudioHGM;vclie;IcsCommonD104Run;bindengine;DBXMySQLDriver;CloudService;SVGIconPackage;FireDACMySQLDriver;FireDACCommonODBC;FireDACCommonDriver;inet;IndyIPCommon;bindcompdbx;IcsVclD104Run;vcl;IndyIPServer;sgcWebSocketsD10_4;IndySystem;bindcompvclwinx;dsnapcon;FireDACMSAccDriver;fmxFireDAC;IcsFmxD104Run;vclimg;TeeDB;FireDAC;VLCPlayer;FireDACSqliteDriver;FireDACPgDriver;ChromeTabs_R;FMXTee;soaprtl;DbxCommonDriver;Tee;xmlrtl;soapmidas;fmxobj;vclwinx;rtl;DbxClientDriver;CustomIPTransport;vcldsnap;bindcomp;appanalytics;IndyIPClient;Skia.Package.RTL;bindcompvcl;SynEdit_R;FrameStandPackage_10_4;SVGIconImageList;TeeUI;dbxcds;VclSmp;adortl;dsnapxml;dbrtl;IndyProtocols;inetdbxpress;fmxase;$(DCC_UsePackage) 129 | true 130 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png 131 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png 132 | 133 | 134 | DEBUG;$(DCC_Define) 135 | true 136 | false 137 | true 138 | true 139 | true 140 | 141 | 142 | false 143 | 144 | 145 | false 146 | RELEASE;$(DCC_Define) 147 | 0 148 | 0 149 | 150 | 151 | 152 | MainSource 153 | 154 | 155 | 156 | Cfg_2 157 | Base 158 | 159 | 160 | Base 161 | 162 | 163 | Cfg_1 164 | Base 165 | 166 | 167 | 168 | Delphi.Personality.12 169 | Application 170 | 171 | 172 | 173 | StressTest.dpr 174 | 175 | 176 | 177 | 178 | 179 | true 180 | 181 | 182 | 183 | 184 | true 185 | 186 | 187 | 188 | 189 | true 190 | 191 | 192 | 193 | 194 | StressTest.exe 195 | true 196 | 197 | 198 | 199 | 200 | 1 201 | 202 | 203 | Contents\MacOS 204 | 1 205 | 206 | 207 | 0 208 | 209 | 210 | 211 | 212 | classes 213 | 1 214 | 215 | 216 | classes 217 | 1 218 | 219 | 220 | 221 | 222 | res\xml 223 | 1 224 | 225 | 226 | res\xml 227 | 1 228 | 229 | 230 | 231 | 232 | library\lib\armeabi-v7a 233 | 1 234 | 235 | 236 | 237 | 238 | library\lib\armeabi 239 | 1 240 | 241 | 242 | library\lib\armeabi 243 | 1 244 | 245 | 246 | 247 | 248 | library\lib\armeabi-v7a 249 | 1 250 | 251 | 252 | 253 | 254 | library\lib\mips 255 | 1 256 | 257 | 258 | library\lib\mips 259 | 1 260 | 261 | 262 | 263 | 264 | library\lib\armeabi-v7a 265 | 1 266 | 267 | 268 | library\lib\arm64-v8a 269 | 1 270 | 271 | 272 | 273 | 274 | library\lib\armeabi-v7a 275 | 1 276 | 277 | 278 | 279 | 280 | res\drawable 281 | 1 282 | 283 | 284 | res\drawable 285 | 1 286 | 287 | 288 | 289 | 290 | res\values 291 | 1 292 | 293 | 294 | res\values 295 | 1 296 | 297 | 298 | 299 | 300 | res\values-v21 301 | 1 302 | 303 | 304 | res\values-v21 305 | 1 306 | 307 | 308 | 309 | 310 | res\values 311 | 1 312 | 313 | 314 | res\values 315 | 1 316 | 317 | 318 | 319 | 320 | res\drawable 321 | 1 322 | 323 | 324 | res\drawable 325 | 1 326 | 327 | 328 | 329 | 330 | res\drawable-xxhdpi 331 | 1 332 | 333 | 334 | res\drawable-xxhdpi 335 | 1 336 | 337 | 338 | 339 | 340 | res\drawable-xxxhdpi 341 | 1 342 | 343 | 344 | res\drawable-xxxhdpi 345 | 1 346 | 347 | 348 | 349 | 350 | res\drawable-ldpi 351 | 1 352 | 353 | 354 | res\drawable-ldpi 355 | 1 356 | 357 | 358 | 359 | 360 | res\drawable-mdpi 361 | 1 362 | 363 | 364 | res\drawable-mdpi 365 | 1 366 | 367 | 368 | 369 | 370 | res\drawable-hdpi 371 | 1 372 | 373 | 374 | res\drawable-hdpi 375 | 1 376 | 377 | 378 | 379 | 380 | res\drawable-xhdpi 381 | 1 382 | 383 | 384 | res\drawable-xhdpi 385 | 1 386 | 387 | 388 | 389 | 390 | res\drawable-mdpi 391 | 1 392 | 393 | 394 | res\drawable-mdpi 395 | 1 396 | 397 | 398 | 399 | 400 | res\drawable-hdpi 401 | 1 402 | 403 | 404 | res\drawable-hdpi 405 | 1 406 | 407 | 408 | 409 | 410 | res\drawable-xhdpi 411 | 1 412 | 413 | 414 | res\drawable-xhdpi 415 | 1 416 | 417 | 418 | 419 | 420 | res\drawable-xxhdpi 421 | 1 422 | 423 | 424 | res\drawable-xxhdpi 425 | 1 426 | 427 | 428 | 429 | 430 | res\drawable-xxxhdpi 431 | 1 432 | 433 | 434 | res\drawable-xxxhdpi 435 | 1 436 | 437 | 438 | 439 | 440 | res\drawable-small 441 | 1 442 | 443 | 444 | res\drawable-small 445 | 1 446 | 447 | 448 | 449 | 450 | res\drawable-normal 451 | 1 452 | 453 | 454 | res\drawable-normal 455 | 1 456 | 457 | 458 | 459 | 460 | res\drawable-large 461 | 1 462 | 463 | 464 | res\drawable-large 465 | 1 466 | 467 | 468 | 469 | 470 | res\drawable-xlarge 471 | 1 472 | 473 | 474 | res\drawable-xlarge 475 | 1 476 | 477 | 478 | 479 | 480 | res\values 481 | 1 482 | 483 | 484 | res\values 485 | 1 486 | 487 | 488 | 489 | 490 | 1 491 | 492 | 493 | Contents\MacOS 494 | 1 495 | 496 | 497 | 0 498 | 499 | 500 | 501 | 502 | Contents\MacOS 503 | 1 504 | .framework 505 | 506 | 507 | Contents\MacOS 508 | 1 509 | .framework 510 | 511 | 512 | 0 513 | 514 | 515 | 516 | 517 | 1 518 | .dylib 519 | 520 | 521 | 1 522 | .dylib 523 | 524 | 525 | 1 526 | .dylib 527 | 528 | 529 | Contents\MacOS 530 | 1 531 | .dylib 532 | 533 | 534 | Contents\MacOS 535 | 1 536 | .dylib 537 | 538 | 539 | 0 540 | .dll;.bpl 541 | 542 | 543 | 544 | 545 | 1 546 | .dylib 547 | 548 | 549 | 1 550 | .dylib 551 | 552 | 553 | 1 554 | .dylib 555 | 556 | 557 | Contents\MacOS 558 | 1 559 | .dylib 560 | 561 | 562 | Contents\MacOS 563 | 1 564 | .dylib 565 | 566 | 567 | 0 568 | .bpl 569 | 570 | 571 | 572 | 573 | 0 574 | 575 | 576 | 0 577 | 578 | 579 | 0 580 | 581 | 582 | 0 583 | 584 | 585 | 0 586 | 587 | 588 | Contents\Resources\StartUp\ 589 | 0 590 | 591 | 592 | Contents\Resources\StartUp\ 593 | 0 594 | 595 | 596 | 0 597 | 598 | 599 | 600 | 601 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 602 | 1 603 | 604 | 605 | 606 | 607 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 608 | 1 609 | 610 | 611 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 612 | 1 613 | 614 | 615 | 616 | 617 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 618 | 1 619 | 620 | 621 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 622 | 1 623 | 624 | 625 | 626 | 627 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 628 | 1 629 | 630 | 631 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 632 | 1 633 | 634 | 635 | 636 | 637 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 638 | 1 639 | 640 | 641 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 642 | 1 643 | 644 | 645 | 646 | 647 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 648 | 1 649 | 650 | 651 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 652 | 1 653 | 654 | 655 | 656 | 657 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 658 | 1 659 | 660 | 661 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 662 | 1 663 | 664 | 665 | 666 | 667 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 668 | 1 669 | 670 | 671 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 672 | 1 673 | 674 | 675 | 676 | 677 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 678 | 1 679 | 680 | 681 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 682 | 1 683 | 684 | 685 | 686 | 687 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 688 | 1 689 | 690 | 691 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 692 | 1 693 | 694 | 695 | 696 | 697 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 698 | 1 699 | 700 | 701 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 702 | 1 703 | 704 | 705 | 706 | 707 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 708 | 1 709 | 710 | 711 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 712 | 1 713 | 714 | 715 | 716 | 717 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 718 | 1 719 | 720 | 721 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 722 | 1 723 | 724 | 725 | 726 | 727 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 728 | 1 729 | 730 | 731 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 732 | 1 733 | 734 | 735 | 736 | 737 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 738 | 1 739 | 740 | 741 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 742 | 1 743 | 744 | 745 | 746 | 747 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 748 | 1 749 | 750 | 751 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 752 | 1 753 | 754 | 755 | 756 | 757 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 758 | 1 759 | 760 | 761 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 762 | 1 763 | 764 | 765 | 766 | 767 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 768 | 1 769 | 770 | 771 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 772 | 1 773 | 774 | 775 | 776 | 777 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 778 | 1 779 | 780 | 781 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 782 | 1 783 | 784 | 785 | 786 | 787 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 788 | 1 789 | 790 | 791 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 792 | 1 793 | 794 | 795 | 796 | 797 | 1 798 | 799 | 800 | 1 801 | 802 | 803 | 804 | 805 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 806 | 1 807 | 808 | 809 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 810 | 1 811 | 812 | 813 | 814 | 815 | ..\ 816 | 1 817 | 818 | 819 | ..\ 820 | 1 821 | 822 | 823 | 824 | 825 | 1 826 | 827 | 828 | 1 829 | 830 | 831 | 1 832 | 833 | 834 | 835 | 836 | ..\$(PROJECTNAME).launchscreen 837 | 64 838 | 839 | 840 | ..\$(PROJECTNAME).launchscreen 841 | 64 842 | 843 | 844 | 845 | 846 | 1 847 | 848 | 849 | 1 850 | 851 | 852 | 1 853 | 854 | 855 | 856 | 857 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 858 | 1 859 | 860 | 861 | 862 | 863 | ..\ 864 | 1 865 | 866 | 867 | ..\ 868 | 1 869 | 870 | 871 | 872 | 873 | Contents 874 | 1 875 | 876 | 877 | Contents 878 | 1 879 | 880 | 881 | 882 | 883 | Contents\Resources 884 | 1 885 | 886 | 887 | Contents\Resources 888 | 1 889 | 890 | 891 | 892 | 893 | library\lib\armeabi-v7a 894 | 1 895 | 896 | 897 | library\lib\arm64-v8a 898 | 1 899 | 900 | 901 | 1 902 | 903 | 904 | 1 905 | 906 | 907 | 1 908 | 909 | 910 | 1 911 | 912 | 913 | Contents\MacOS 914 | 1 915 | 916 | 917 | Contents\MacOS 918 | 1 919 | 920 | 921 | 0 922 | 923 | 924 | 925 | 926 | library\lib\armeabi-v7a 927 | 1 928 | 929 | 930 | 931 | 932 | 1 933 | 934 | 935 | 1 936 | 937 | 938 | 939 | 940 | Assets 941 | 1 942 | 943 | 944 | Assets 945 | 1 946 | 947 | 948 | 949 | 950 | Assets 951 | 1 952 | 953 | 954 | Assets 955 | 1 956 | 957 | 958 | 959 | 960 | 961 | 962 | 963 | 964 | 965 | 966 | 967 | 968 | 969 | 970 | False 971 | False 972 | False 973 | False 974 | True 975 | False 976 | 977 | 978 | 12 979 | 980 | 981 | 982 | 983 | 984 | -------------------------------------------------------------------------------- /Sample/StressTest/StressTest.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HemulGM/MiniWebServer/37769fea8d1e6527773d4279351e2a02ae69111f/Sample/StressTest/StressTest.res -------------------------------------------------------------------------------- /Sample/WMS.OWM.pas: -------------------------------------------------------------------------------- 1 | unit WMS.OWM; 2 | 3 | interface 4 | 5 | uses 6 | HTTP.Server; 7 | 8 | procedure GetWeather(Request: TRequest; Response: TResponse); 9 | 10 | implementation 11 | 12 | procedure GetWeather(Request: TRequest; Response: TResponse); 13 | begin 14 | Response.Json('{ "value": "+22" }'); 15 | end; 16 | 17 | end. 18 | 19 | -------------------------------------------------------------------------------- /Tester/GetTester.dpr: -------------------------------------------------------------------------------- 1 | program GetTester; 2 | 3 | {$APPTYPE CONSOLE} 4 | 5 | {$R *.res} 6 | 7 | uses 8 | System.SysUtils, 9 | System.Classes, 10 | System.Threading, 11 | System.Net.HttpClient; 12 | 13 | var i: integer; 14 | 15 | begin 16 | try 17 | i := 0; 18 | var Count := 0; 19 | var CountMax := 100000; 20 | var Tasks: TArray; 21 | SetLength(Tasks, CountMax); 22 | repeat 23 | Tasks[Count] := TTask.Run( 24 | procedure 25 | begin 26 | try 27 | 28 | Inc(i); 29 | with THTTPClient.Create do 30 | try 31 | Writeln(i, ' ', Get('http://root.hemulgm.ru').StatusCode); 32 | finally 33 | Free; 34 | end; 35 | except 36 | on E: Exception do 37 | Writeln(E.ClassName, ': ', E.Message); 38 | end; 39 | end); 40 | Inc(Count); 41 | until Count > CountMax; 42 | TTask.WaitForAll(Tasks); 43 | except 44 | on E: Exception do 45 | Writeln(E.ClassName, ': ', E.Message); 46 | end; 47 | Writeln('done'); 48 | Readln; 49 | end. 50 | 51 | -------------------------------------------------------------------------------- /Tester/GetTester.dproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | {86F5C31E-AF84-446C-B609-C7EBA86A9189} 4 | 19.2 5 | None 6 | True 7 | Debug 8 | Win32 9 | 1 10 | Console 11 | GetTester.dpr 12 | 13 | 14 | true 15 | 16 | 17 | true 18 | Base 19 | true 20 | 21 | 22 | true 23 | Base 24 | true 25 | 26 | 27 | true 28 | Base 29 | true 30 | 31 | 32 | true 33 | Base 34 | true 35 | 36 | 37 | true 38 | Base 39 | true 40 | 41 | 42 | true 43 | Base 44 | true 45 | 46 | 47 | true 48 | Base 49 | true 50 | 51 | 52 | true 53 | Cfg_1 54 | true 55 | true 56 | 57 | 58 | true 59 | Base 60 | true 61 | 62 | 63 | .\$(Platform)\$(Config) 64 | .\$(Platform)\$(Config) 65 | false 66 | false 67 | false 68 | false 69 | false 70 | System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) 71 | GetTester 72 | 73 | 74 | DBXSqliteDriver;IndyIPCommon;RESTComponents;bindcompdbx;DBXInterBaseDriver;IndyIPServer;IndySystem;tethering;DzHTMLText_FMX;fmxFireDAC;FireDAC;bindcompfmx;FireDACSqliteDriver;FMXTee;soaprtl;DbxCommonDriver;FmxTeeUI;fmx;FireDACIBDriver;xmlrtl;soapmidas;rtl;DbxClientDriver;CustomIPTransport;dbexpress;IndyCore;bindcomp;dsnap;FireDACCommon;IndyIPClient;RESTBackendComponents;soapserver;dbxcds;bindengine;CloudService;dsnapxml;dbrtl;IndyProtocols;FireDACCommonDriver;inet;$(DCC_UsePackage) 75 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png 76 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png 77 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png 78 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png 79 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png 80 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png 81 | $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png 82 | $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png 83 | $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png 84 | $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png 85 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_24x24.png 86 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_36x36.png 87 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_48x48.png 88 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_72x72.png 89 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_96x96.png 90 | android-support-v4.dex.jar;cloud-messaging.dex.jar;com-google-android-gms.play-services-ads-base.17.2.0.dex.jar;com-google-android-gms.play-services-ads-identifier.16.0.0.dex.jar;com-google-android-gms.play-services-ads-lite.17.2.0.dex.jar;com-google-android-gms.play-services-ads.17.2.0.dex.jar;com-google-android-gms.play-services-analytics-impl.16.0.8.dex.jar;com-google-android-gms.play-services-analytics.16.0.8.dex.jar;com-google-android-gms.play-services-base.16.0.1.dex.jar;com-google-android-gms.play-services-basement.16.2.0.dex.jar;com-google-android-gms.play-services-gass.17.2.0.dex.jar;com-google-android-gms.play-services-identity.16.0.0.dex.jar;com-google-android-gms.play-services-maps.16.1.0.dex.jar;com-google-android-gms.play-services-measurement-base.16.4.0.dex.jar;com-google-android-gms.play-services-measurement-sdk-api.16.4.0.dex.jar;com-google-android-gms.play-services-stats.16.0.1.dex.jar;com-google-android-gms.play-services-tagmanager-v4-impl.16.0.8.dex.jar;com-google-android-gms.play-services-tasks.16.0.1.dex.jar;com-google-android-gms.play-services-wallet.16.0.1.dex.jar;com-google-firebase.firebase-analytics.16.4.0.dex.jar;com-google-firebase.firebase-common.16.1.0.dex.jar;com-google-firebase.firebase-iid-interop.16.0.1.dex.jar;com-google-firebase.firebase-iid.17.1.1.dex.jar;com-google-firebase.firebase-measurement-connector.17.0.1.dex.jar;com-google-firebase.firebase-messaging.17.5.0.dex.jar;fmx.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar 91 | 92 | 93 | DBXSqliteDriver;IndyIPCommon;RESTComponents;bindcompdbx;DBXInterBaseDriver;IndyIPServer;IndySystem;tethering;DzHTMLText_FMX;fmxFireDAC;FireDAC;bindcompfmx;FireDACSqliteDriver;FMXTee;soaprtl;DbxCommonDriver;FmxTeeUI;fmx;FireDACIBDriver;xmlrtl;soapmidas;rtl;DbxClientDriver;CustomIPTransport;dbexpress;IndyCore;bindcomp;dsnap;FireDACCommon;IndyIPClient;RESTBackendComponents;soapserver;dbxcds;bindengine;CloudService;dsnapxml;dbrtl;IndyProtocols;FireDACCommonDriver;inet;$(DCC_UsePackage) 94 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png 95 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png 96 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png 97 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png 98 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png 99 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png 100 | $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png 101 | $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png 102 | $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png 103 | $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png 104 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_24x24.png 105 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_36x36.png 106 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_48x48.png 107 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_72x72.png 108 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_96x96.png 109 | android-support-v4.dex.jar;cloud-messaging.dex.jar;com-google-android-gms.play-services-ads-base.17.2.0.dex.jar;com-google-android-gms.play-services-ads-identifier.16.0.0.dex.jar;com-google-android-gms.play-services-ads-lite.17.2.0.dex.jar;com-google-android-gms.play-services-ads.17.2.0.dex.jar;com-google-android-gms.play-services-analytics-impl.16.0.8.dex.jar;com-google-android-gms.play-services-analytics.16.0.8.dex.jar;com-google-android-gms.play-services-base.16.0.1.dex.jar;com-google-android-gms.play-services-basement.16.2.0.dex.jar;com-google-android-gms.play-services-gass.17.2.0.dex.jar;com-google-android-gms.play-services-identity.16.0.0.dex.jar;com-google-android-gms.play-services-maps.16.1.0.dex.jar;com-google-android-gms.play-services-measurement-base.16.4.0.dex.jar;com-google-android-gms.play-services-measurement-sdk-api.16.4.0.dex.jar;com-google-android-gms.play-services-stats.16.0.1.dex.jar;com-google-android-gms.play-services-tagmanager-v4-impl.16.0.8.dex.jar;com-google-android-gms.play-services-tasks.16.0.1.dex.jar;com-google-android-gms.play-services-wallet.16.0.1.dex.jar;com-google-firebase.firebase-analytics.16.4.0.dex.jar;com-google-firebase.firebase-common.16.1.0.dex.jar;com-google-firebase.firebase-iid-interop.16.0.1.dex.jar;com-google-firebase.firebase-iid.17.1.1.dex.jar;com-google-firebase.firebase-measurement-connector.17.0.1.dex.jar;com-google-firebase.firebase-messaging.17.5.0.dex.jar;fmx.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar 110 | 111 | 112 | CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing bluetooth;NSBluetoothPeripheralUsageDescription=The reason for accessing bluetooth peripherals;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSMotionUsageDescription=The reason for accessing the accelerometer;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers 113 | iPhoneAndiPad 114 | true 115 | Debug 116 | $(MSBuildProjectName) 117 | 118 | 119 | CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing bluetooth;NSBluetoothPeripheralUsageDescription=The reason for accessing bluetooth peripherals;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSMotionUsageDescription=The reason for accessing the accelerometer;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers 120 | iPhoneAndiPad 121 | true 122 | 123 | 124 | DBXSqliteDriver;IndyIPCommon;RESTComponents;bindcompdbx;DBXInterBaseDriver;vcl;IndyIPServer;vclactnband;IcsVclD104Run;vclFireDAC;IndySystem;IconFontsImageListFMX;bindcompvclsmp;tethering;svnui;bindcompvclwinx;dsnapcon;FireDACADSDriver;DzHTMLText_FMX;FireDACMSAccDriver;fmxFireDAC;IcsFmxD104Run;vclimg;TeeDB;FireDAC;PngComponentsD;vcltouch;IconFontsImageList;Jcl;vcldb;bindcompfmx;svn;FireDACSqliteDriver;FireDACPgDriver;inetdb;ChromeTabs_R;VirtualTreesDR;FMXTee;soaprtl;DbxCommonDriver;FmxTeeUI;fmx;FireDACIBDriver;fmxdae;xmlrtl;soapmidas;vcledge;fmxobj;vclwinx;Tee;rtl;DbxClientDriver;CustomIPTransport;vcldsnap;dbexpress;IndyCore;vclx;SynEditDR;bindcomp;appanalytics;dsnap;SVGIconImageListFMX;FireDACCommon;IndyIPClient;bindcompvcl;RESTBackendComponents;SVGIconImageList;TeeUI;VCLRESTComponents;soapserver;dbxcds;VclSmp;FMXPAN100;adortl;JclDeveloperTools;JclVcl;vclie;IcsCommonD104Run;bindengine;DBXMySQLDriver;CloudService;dsnapxml;FireDACMySQLDriver;dbrtl;IndyProtocols;inetdbxpress;SVGIconPackage;FireDACCommonODBC;FireDACCommonDriver;JclContainers;inet;fmxase;$(DCC_UsePackage) 125 | Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) 126 | Debug 127 | CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= 128 | 1033 129 | true 130 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png 131 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png 132 | 133 | 134 | DBXSqliteDriver;IndyIPCommon;RESTComponents;bindcompdbx;DBXInterBaseDriver;vcl;IndyIPServer;vclactnband;IcsVclD104Run;vclFireDAC;IndySystem;bindcompvclsmp;tethering;bindcompvclwinx;dsnapcon;FireDACADSDriver;DzHTMLText_FMX;FireDACMSAccDriver;fmxFireDAC;IcsFmxD104Run;vclimg;TeeDB;FireDAC;PngComponentsD;vcltouch;vcldb;bindcompfmx;FireDACSqliteDriver;FireDACPgDriver;inetdb;ChromeTabs_R;VirtualTreesDR;FMXTee;soaprtl;DbxCommonDriver;FmxTeeUI;fmx;FireDACIBDriver;fmxdae;xmlrtl;soapmidas;vcledge;fmxobj;vclwinx;Tee;rtl;DbxClientDriver;CustomIPTransport;vcldsnap;dbexpress;IndyCore;vclx;SynEditDR;bindcomp;appanalytics;dsnap;SVGIconImageListFMX;FireDACCommon;IndyIPClient;bindcompvcl;RESTBackendComponents;SVGIconImageList;TeeUI;VCLRESTComponents;soapserver;dbxcds;VclSmp;FMXPAN100;adortl;vclie;IcsCommonD104Run;bindengine;DBXMySQLDriver;CloudService;dsnapxml;FireDACMySQLDriver;dbrtl;IndyProtocols;inetdbxpress;SVGIconPackage;FireDACCommonODBC;FireDACCommonDriver;inet;fmxase;$(DCC_UsePackage) 135 | true 136 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png 137 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png 138 | 139 | 140 | DEBUG;$(DCC_Define) 141 | true 142 | false 143 | true 144 | true 145 | true 146 | 147 | 148 | false 149 | 150 | 151 | false 152 | RELEASE;$(DCC_Define) 153 | 0 154 | 0 155 | 156 | 157 | 158 | MainSource 159 | 160 | 161 | Cfg_2 162 | Base 163 | 164 | 165 | Base 166 | 167 | 168 | Cfg_1 169 | Base 170 | 171 | 172 | 173 | Delphi.Personality.12 174 | Application 175 | 176 | 177 | 178 | GetTester.dpr 179 | 180 | 181 | 182 | 183 | 184 | true 185 | 186 | 187 | 188 | 189 | true 190 | 191 | 192 | 193 | 194 | true 195 | 196 | 197 | 198 | 199 | 200 | 1 201 | 202 | 203 | Contents\MacOS 204 | 1 205 | 206 | 207 | 0 208 | 209 | 210 | 211 | 212 | classes 213 | 64 214 | 215 | 216 | classes 217 | 64 218 | 219 | 220 | 221 | 222 | classes 223 | 1 224 | 225 | 226 | classes 227 | 1 228 | 229 | 230 | 231 | 232 | res\xml 233 | 1 234 | 235 | 236 | res\xml 237 | 1 238 | 239 | 240 | 241 | 242 | library\lib\armeabi-v7a 243 | 1 244 | 245 | 246 | 247 | 248 | library\lib\armeabi 249 | 1 250 | 251 | 252 | library\lib\armeabi 253 | 1 254 | 255 | 256 | 257 | 258 | library\lib\armeabi-v7a 259 | 1 260 | 261 | 262 | 263 | 264 | library\lib\mips 265 | 1 266 | 267 | 268 | library\lib\mips 269 | 1 270 | 271 | 272 | 273 | 274 | library\lib\armeabi-v7a 275 | 1 276 | 277 | 278 | library\lib\arm64-v8a 279 | 1 280 | 281 | 282 | 283 | 284 | library\lib\armeabi-v7a 285 | 1 286 | 287 | 288 | 289 | 290 | res\drawable 291 | 1 292 | 293 | 294 | res\drawable 295 | 1 296 | 297 | 298 | 299 | 300 | res\values 301 | 1 302 | 303 | 304 | res\values 305 | 1 306 | 307 | 308 | 309 | 310 | res\values-v21 311 | 1 312 | 313 | 314 | res\values-v21 315 | 1 316 | 317 | 318 | 319 | 320 | res\values 321 | 1 322 | 323 | 324 | res\values 325 | 1 326 | 327 | 328 | 329 | 330 | res\drawable 331 | 1 332 | 333 | 334 | res\drawable 335 | 1 336 | 337 | 338 | 339 | 340 | res\drawable-xxhdpi 341 | 1 342 | 343 | 344 | res\drawable-xxhdpi 345 | 1 346 | 347 | 348 | 349 | 350 | res\drawable-xxxhdpi 351 | 1 352 | 353 | 354 | res\drawable-xxxhdpi 355 | 1 356 | 357 | 358 | 359 | 360 | res\drawable-ldpi 361 | 1 362 | 363 | 364 | res\drawable-ldpi 365 | 1 366 | 367 | 368 | 369 | 370 | res\drawable-mdpi 371 | 1 372 | 373 | 374 | res\drawable-mdpi 375 | 1 376 | 377 | 378 | 379 | 380 | res\drawable-hdpi 381 | 1 382 | 383 | 384 | res\drawable-hdpi 385 | 1 386 | 387 | 388 | 389 | 390 | res\drawable-xhdpi 391 | 1 392 | 393 | 394 | res\drawable-xhdpi 395 | 1 396 | 397 | 398 | 399 | 400 | res\drawable-mdpi 401 | 1 402 | 403 | 404 | res\drawable-mdpi 405 | 1 406 | 407 | 408 | 409 | 410 | res\drawable-hdpi 411 | 1 412 | 413 | 414 | res\drawable-hdpi 415 | 1 416 | 417 | 418 | 419 | 420 | res\drawable-xhdpi 421 | 1 422 | 423 | 424 | res\drawable-xhdpi 425 | 1 426 | 427 | 428 | 429 | 430 | res\drawable-xxhdpi 431 | 1 432 | 433 | 434 | res\drawable-xxhdpi 435 | 1 436 | 437 | 438 | 439 | 440 | res\drawable-xxxhdpi 441 | 1 442 | 443 | 444 | res\drawable-xxxhdpi 445 | 1 446 | 447 | 448 | 449 | 450 | res\drawable-small 451 | 1 452 | 453 | 454 | res\drawable-small 455 | 1 456 | 457 | 458 | 459 | 460 | res\drawable-normal 461 | 1 462 | 463 | 464 | res\drawable-normal 465 | 1 466 | 467 | 468 | 469 | 470 | res\drawable-large 471 | 1 472 | 473 | 474 | res\drawable-large 475 | 1 476 | 477 | 478 | 479 | 480 | res\drawable-xlarge 481 | 1 482 | 483 | 484 | res\drawable-xlarge 485 | 1 486 | 487 | 488 | 489 | 490 | res\values 491 | 1 492 | 493 | 494 | res\values 495 | 1 496 | 497 | 498 | 499 | 500 | 1 501 | 502 | 503 | Contents\MacOS 504 | 1 505 | 506 | 507 | 0 508 | 509 | 510 | 511 | 512 | Contents\MacOS 513 | 1 514 | .framework 515 | 516 | 517 | Contents\MacOS 518 | 1 519 | .framework 520 | 521 | 522 | 0 523 | 524 | 525 | 526 | 527 | 1 528 | .dylib 529 | 530 | 531 | 1 532 | .dylib 533 | 534 | 535 | 1 536 | .dylib 537 | 538 | 539 | Contents\MacOS 540 | 1 541 | .dylib 542 | 543 | 544 | Contents\MacOS 545 | 1 546 | .dylib 547 | 548 | 549 | 0 550 | .dll;.bpl 551 | 552 | 553 | 554 | 555 | 1 556 | .dylib 557 | 558 | 559 | 1 560 | .dylib 561 | 562 | 563 | 1 564 | .dylib 565 | 566 | 567 | Contents\MacOS 568 | 1 569 | .dylib 570 | 571 | 572 | Contents\MacOS 573 | 1 574 | .dylib 575 | 576 | 577 | 0 578 | .bpl 579 | 580 | 581 | 582 | 583 | 0 584 | 585 | 586 | 0 587 | 588 | 589 | 0 590 | 591 | 592 | 0 593 | 594 | 595 | 0 596 | 597 | 598 | Contents\Resources\StartUp\ 599 | 0 600 | 601 | 602 | Contents\Resources\StartUp\ 603 | 0 604 | 605 | 606 | 0 607 | 608 | 609 | 610 | 611 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 612 | 1 613 | 614 | 615 | 616 | 617 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 618 | 1 619 | 620 | 621 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 622 | 1 623 | 624 | 625 | 626 | 627 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 628 | 1 629 | 630 | 631 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 632 | 1 633 | 634 | 635 | 636 | 637 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 638 | 1 639 | 640 | 641 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 642 | 1 643 | 644 | 645 | 646 | 647 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 648 | 1 649 | 650 | 651 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 652 | 1 653 | 654 | 655 | 656 | 657 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 658 | 1 659 | 660 | 661 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 662 | 1 663 | 664 | 665 | 666 | 667 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 668 | 1 669 | 670 | 671 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 672 | 1 673 | 674 | 675 | 676 | 677 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 678 | 1 679 | 680 | 681 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 682 | 1 683 | 684 | 685 | 686 | 687 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 688 | 1 689 | 690 | 691 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 692 | 1 693 | 694 | 695 | 696 | 697 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 698 | 1 699 | 700 | 701 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 702 | 1 703 | 704 | 705 | 706 | 707 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 708 | 1 709 | 710 | 711 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 712 | 1 713 | 714 | 715 | 716 | 717 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 718 | 1 719 | 720 | 721 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 722 | 1 723 | 724 | 725 | 726 | 727 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 728 | 1 729 | 730 | 731 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 732 | 1 733 | 734 | 735 | 736 | 737 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 738 | 1 739 | 740 | 741 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 742 | 1 743 | 744 | 745 | 746 | 747 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 748 | 1 749 | 750 | 751 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 752 | 1 753 | 754 | 755 | 756 | 757 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 758 | 1 759 | 760 | 761 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 762 | 1 763 | 764 | 765 | 766 | 767 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 768 | 1 769 | 770 | 771 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 772 | 1 773 | 774 | 775 | 776 | 777 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 778 | 1 779 | 780 | 781 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 782 | 1 783 | 784 | 785 | 786 | 787 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 788 | 1 789 | 790 | 791 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 792 | 1 793 | 794 | 795 | 796 | 797 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 798 | 1 799 | 800 | 801 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 802 | 1 803 | 804 | 805 | 806 | 807 | 1 808 | 809 | 810 | 1 811 | 812 | 813 | 814 | 815 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 816 | 1 817 | 818 | 819 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 820 | 1 821 | 822 | 823 | 824 | 825 | ..\ 826 | 1 827 | 828 | 829 | ..\ 830 | 1 831 | 832 | 833 | 834 | 835 | 1 836 | 837 | 838 | 1 839 | 840 | 841 | 1 842 | 843 | 844 | 845 | 846 | ..\$(PROJECTNAME).launchscreen 847 | 64 848 | 849 | 850 | ..\$(PROJECTNAME).launchscreen 851 | 64 852 | 853 | 854 | 855 | 856 | 1 857 | 858 | 859 | 1 860 | 861 | 862 | 1 863 | 864 | 865 | 866 | 867 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 868 | 1 869 | 870 | 871 | 872 | 873 | ..\ 874 | 1 875 | 876 | 877 | ..\ 878 | 1 879 | 880 | 881 | 882 | 883 | Contents 884 | 1 885 | 886 | 887 | Contents 888 | 1 889 | 890 | 891 | 892 | 893 | Contents\Resources 894 | 1 895 | 896 | 897 | Contents\Resources 898 | 1 899 | 900 | 901 | 902 | 903 | library\lib\armeabi-v7a 904 | 1 905 | 906 | 907 | library\lib\arm64-v8a 908 | 1 909 | 910 | 911 | 1 912 | 913 | 914 | 1 915 | 916 | 917 | 1 918 | 919 | 920 | 1 921 | 922 | 923 | Contents\MacOS 924 | 1 925 | 926 | 927 | Contents\MacOS 928 | 1 929 | 930 | 931 | 0 932 | 933 | 934 | 935 | 936 | library\lib\armeabi-v7a 937 | 1 938 | 939 | 940 | 941 | 942 | 1 943 | 944 | 945 | 1 946 | 947 | 948 | 949 | 950 | Assets 951 | 1 952 | 953 | 954 | Assets 955 | 1 956 | 957 | 958 | 959 | 960 | Assets 961 | 1 962 | 963 | 964 | Assets 965 | 1 966 | 967 | 968 | 969 | 970 | 971 | 972 | 973 | 974 | 975 | 976 | 977 | 978 | 979 | 980 | 981 | 982 | False 983 | False 984 | False 985 | False 986 | True 987 | False 988 | 989 | 990 | 12 991 | 992 | 993 | 994 | 995 | 996 | -------------------------------------------------------------------------------- /Tester/GetTester.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HemulGM/MiniWebServer/37769fea8d1e6527773d4279351e2a02ae69111f/Tester/GetTester.res -------------------------------------------------------------------------------- /Win32/Debug/www/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HemulGM/MiniWebServer/37769fea8d1e6527773d4279351e2a02ae69111f/Win32/Debug/www/favicon.ico --------------------------------------------------------------------------------