httpupgrader.lpr 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. program httpupgrader;
  2. {$mode objfpc}{$H+}
  3. uses
  4. {$IFDEF UNIX}
  5. cthreads,
  6. {$ENDIF}
  7. Classes, SysUtils, CustApp, jsonparser,fpmimetypes, fphttpserver, fpwebfile, httproute, wschat, wsupgrader, fpwebsocket, fpcustwsserver;
  8. type
  9. { THTTPUpgradeApplication }
  10. THTTPUpgradeApplication = class(TCustomApplication)
  11. private
  12. procedure DoChatLog(Sender: TObject; const Msg: String);
  13. procedure DoRequest(Sender: TObject; var ARequest: TFPHTTPConnectionRequest; var AResponse: TFPHTTPConnectionResponse);
  14. protected
  15. FServer : TFPHttpServer;
  16. FUpgrader : TWebsocketUpgrader;
  17. FChat: TWebsocketChat;
  18. procedure DoRun; override;
  19. public
  20. constructor Create(TheOwner: TComponent); override;
  21. destructor Destroy; override;
  22. procedure Usage(Msg : string); virtual;
  23. end;
  24. { THTTPUpgradeApplication }
  25. procedure THTTPUpgradeApplication.DoChatLog(Sender: TObject; const Msg: String);
  26. begin
  27. Writeln(Msg);
  28. end;
  29. procedure THTTPUpgradeApplication.DoRequest(Sender: TObject; var ARequest: TFPHTTPConnectionRequest;
  30. var AResponse: TFPHTTPConnectionResponse);
  31. begin
  32. HTTPRouter.RouteRequest(aRequest,aResponse);
  33. end;
  34. procedure THTTPUpgradeApplication.DoRun;
  35. var
  36. ErrorMsg: String;
  37. begin
  38. // quick check parameters
  39. ErrorMsg:=CheckOptions('hH:d:p:r:st:', ['help','host:','directory:','port:','resource:','ssl','thread:']);
  40. if (ErrorMsg<>'') or HasOption('h', 'help') then
  41. begin
  42. Usage(ErrorMsg);
  43. Terminate;
  44. Exit;
  45. end;
  46. TSimpleFileModule.BaseDir:=GetOptionValue('d','directory');
  47. TSimpleFileModule.IndexPageName:='index.html';
  48. TSimpleFileModule.RegisterDefaultRoute;
  49. MimeTypes.LoadKnownTypes;
  50. FServer.UseSSL:=Hasoption('s','ssl');
  51. FServer.Port:=StrToIntDef(GetOptionValue('p','port'),3030);
  52. FUpgrader.Host:=GetOptionValue('H','host');
  53. FUpgrader.Resource:=GetOptionValue('r','resource');
  54. Case LowerCase(getOptionValue('t','thread')) of
  55. 'none' :
  56. begin
  57. FServer.ThreadMode:=tmNone;
  58. FUpgrader.ThreadMode:=wtmNone;
  59. end;
  60. 'pool' :
  61. begin
  62. FServer.ThreadMode:=tmThreadPool;
  63. FUpgrader.ThreadMode:=wtmThreadPool;
  64. end;
  65. else
  66. FServer.ThreadMode:=tmThread;
  67. FUpgrader.ThreadMode:=wtmThread;
  68. end;
  69. FUpgrader.Active:=True;
  70. FServer.Active:=True;
  71. Terminate;
  72. end;
  73. constructor THTTPUpgradeApplication.Create(TheOwner: TComponent);
  74. begin
  75. inherited Create(TheOwner);
  76. StopOnException:=True;
  77. FServer:=TFPHttpServer.Create(Self);
  78. FServer.OnRequest:=@DoRequest;
  79. FUpgrader:=TWebsocketUpgrader.Create(Self);
  80. FUpgrader.WebServer:=FServer;
  81. FUpgrader.name:='UWebSocket';
  82. FChat:=TWebsocketChat.Create(Self);
  83. FChat.WebsocketServer:=FUpgrader;
  84. FChat.OnLog:=@DoChatLog;
  85. // Must do this here, because the events are protected
  86. FUpgrader.OnMessageReceived:[email protected];
  87. FUpgrader.OnControlReceived:[email protected];
  88. FUpgrader.OnDisconnect:[email protected];
  89. end;
  90. destructor THTTPUpgradeApplication.Destroy;
  91. begin
  92. FreeAndNil(FUpgrader);
  93. FreeAndNil(FServer);
  94. inherited Destroy;
  95. end;
  96. procedure THTTPUpgradeApplication.Usage(Msg: string);
  97. begin
  98. if Msg<>'' then
  99. Writeln('Error: ',Msg);
  100. Writeln('Usage: ', ExeName, ' [options]');
  101. Writeln('Where [options] is one or more of:');
  102. Writeln('-d --directory=DIRECTORY Directory to serve files from');
  103. Writeln('-h --help This message');
  104. Writeln('-H --host=HOST The hostname to use for accepting websockets.');
  105. Writeln('-p --port=PORT Port nr to listen on');
  106. Writeln('-r --resource=PATH Resource to use for accepting websockets');
  107. Writeln('-s --ssl Use SSL');
  108. Writeln('-t --thread=MODEL Threading model to use (one of: none,thread,pool)');
  109. end;
  110. var
  111. Application: THTTPUpgradeApplication;
  112. begin
  113. Application:=THTTPUpgradeApplication.Create(nil);
  114. Application.Title:='HTTP Server & Websocket chat Application';
  115. Application.Run;
  116. Application.Free;
  117. end.