DmBel преди 2 години
родител
ревизия
f44158d4e9
променени са 4 файла, в които са добавени 74 реда и са изтрити 58 реда
  1. 3 4
      SynHttpSrv.pas
  2. 31 15
      SynSrv.pas
  3. 38 31
      blcksock.pas
  4. 2 8
      ssposix.inc

+ 3 - 4
SynHttpSrv.pas

@@ -20,10 +20,9 @@ uses
  {$ELSE}
  SynaUtil,
  {$ENDIF}
- ssl_openssl,
+
  SysUtils,
  Classes,
- synsock,
  blcksock,
  SynSrv;
 //-------------------------------------------------------------
@@ -532,7 +531,7 @@ begin
  // Right-trim:
  len := Length(Line);
  if (len = 0) then
-  exit;
+  Exit;
  if (Line[1] <= ' ') then
   Line := Trim(Line)
  else
@@ -540,7 +539,7 @@ begin
   Line := TrimRight(Line);
  // Normalize arround ":"...
  p := Pos(':', Line);
- if (p > 1) then
+ if (p > 1) and (p < Length(Line) - 1) then
   if (Line[p - 1] <= ' ') or not (Line[p + 1] <= ' ') or (Line[p + 2] <= ' ') then
   begin
    // Needs normalize...

+ 31 - 15
SynSrv.pas

@@ -34,7 +34,7 @@ type
 
  TListenerThread = class(TThread)
  private
-  FThreadList: TObjectList<TSynTcpSrvConnection>;
+  FThreadList: TThreadList<TSynTcpSrvConnection>;
   FSocket:     TTCPBlockSocket;
   FPort:       string;
   FHost:       string;
@@ -71,6 +71,7 @@ type
  TCommandHandler = procedure(Connection: TSynTcpSrvConnection; Command: string) of object;
 
  // TSynTcpServer - Generic TCP server component
+ [ComponentPlatformsAttribute(pidAllPlatforms)]
  TSynTcpServer = class(TComponent)
  protected
   FActive:        boolean;
@@ -106,6 +107,7 @@ type
 
 //-------------------------------------------------------------
 implementation
+
 //-------------------------------------------------------------
 
 { TSynTcpServer }
@@ -175,10 +177,19 @@ end;
 procedure TListenerThread.ClearFinishedThreads;
 var
  i: integer;
+ List: TList<TSynTcpSrvConnection>;
 begin
- for i := FThreadList.Count - 1 downto 0 do
-  if FThreadList[i].FFinished then
-   FThreadList.Remove(FThreadList[i]);
+ List := FThreadList.LockList;
+ try
+  for i := List.Count - 1 downto 0 do
+   if List[i].FFinished then
+   begin
+    List[i].Free;
+    List.Remove(List[i]);
+   end;
+ finally
+  FThreadList.UnlockList;
+ end;
 end;
 
 procedure TListenerThread.BindSocket;
@@ -204,7 +215,7 @@ end;
 constructor TListenerThread.Create(ASuspended: boolean; ATcpServer: TSynTcpServer);
 begin
  FSocket := TTCPBlockSocket.Create;
- FThreadList := TObjectList<TSynTcpSrvConnection>.Create;
+ FThreadList := TThreadList<TSynTcpSrvConnection>.Create;
  FTcpServer := ATcpServer;
  inherited Create(ASuspended);
 end;
@@ -212,14 +223,20 @@ end;
 destructor TListenerThread.Destroy;
 var
  i: integer;
+ List: TList<TSynTcpSrvConnection>;
 begin
  FSocket.CloseSocket;
- for i := 0 to FThreadList.Count - 1 do
- begin
-  FThreadList[i].Terminate;
-  FThreadList[i].Socket.CloseSocket;
+ List := FThreadList.LockList;
+ try
+  for i := 0 to List.Count - 1 do
+  begin
+   List[i].Terminate;
+   List[i].Socket.CloseSocket;
+   List[i].Free;
+  end;
+ finally
+  FThreadList.UnlockList;
  end;
- ClearFinishedThreads;
  FreeAndNil(FThreadList);
  FreeAndNil(FSocket);
  inherited;
@@ -229,7 +246,6 @@ procedure TListenerThread.Execute;
 var
  SynapseConnect: TSynTcpSrvConnection;
 begin
- inherited;
  repeat
   if FSocket.CanRead(100) then
   begin
@@ -252,10 +268,10 @@ begin
  inherited Create(ASuspended);
  FSocket := TTCPBlockSocket.Create;
  FSocket.Owner := Self;
- FSocket.SSL.CertificateFile:= ATcpServer.FSynapseServer.FSocket.SSL.CertificateFile;
- FSocket.SSL.PrivateKeyFile:= ATcpServer.FSynapseServer.FSocket.SSL.PrivateKeyFile;
- FSocket.SSL.KeyPassword:= ATcpServer.FSynapseServer.FSocket.SSL.KeyPassword;
- FSocket.SSL.VerifyCert:= ATcpServer.FSynapseServer.FSocket.SSL.VerifyCert;
+ FSocket.SSL.CertificateFile := ATcpServer.FSynapseServer.FSocket.SSL.CertificateFile;
+ FSocket.SSL.PrivateKeyFile := ATcpServer.FSynapseServer.FSocket.SSL.PrivateKeyFile;
+ FSocket.SSL.KeyPassword := ATcpServer.FSynapseServer.FSocket.SSL.KeyPassword;
+ FSocket.SSL.VerifyCert := ATcpServer.FSynapseServer.FSocket.SSL.VerifyCert;
  FTcpServer := ATcpServer;
  if ASocket <> INVALID_SOCKET then
  begin

+ 38 - 31
blcksock.pas

@@ -285,8 +285,7 @@ type
     );
 
   {:@abstract(this object is used for remember delayed socket option set.)}
-  TSynaOption = class(TObject)
-  public
+  TSynaOption = record
     Option: TSynaOptionType;
     Enabled: Boolean;
     Value: Integer;
@@ -301,7 +300,7 @@ type
   TOptionList = TList<TSynaOption>;
   TSocketList = TList<TBlockSocket>;
 {$ELSE}
-  TOptionList = TList;
+  TOptionList = TArray<TSynaOption>;
   TSocketList = TList;
 {$ENDIF}
   {:@abstract(Basic IP object.)
@@ -1591,7 +1590,7 @@ var
 {$ENDIF}
 begin
   inherited Create;
-  FDelayedOptions := TOptionList.Create;
+  //FDelayedOptions := TOptionList.Create;
   FRaiseExcept := False;
 {$IFDEF RAISEEXCEPT}
   FRaiseExcept := True;
@@ -1637,21 +1636,22 @@ begin
 end;
 
 destructor TBlockSocket.Destroy;
-var
-  n: integer;
-  p: TSynaOption;
+//var
+  //n: integer;
+//  p: TSynaOption;
 begin
   CloseSocket;
 {$IFNDEF ONCEWINSOCK}
   synsock.WSACleanup;
   DestroySocketInterface;
 {$ENDIF}
-  for n := FDelayedOptions.Count - 1 downto 0 do
+  {for n := FDelayedOptions.Count - 1 downto 0 do
     begin
       p := TSynaOption(FDelayedOptions[n]);
       FreeAndNil(p);
-    end;
-  FreeAndNil(FDelayedOptions);
+    end;}
+  //FreeAndNil(FDelayedOptions);
+  Finalize(FDelayedOptions);
   inherited Destroy;
 end;
 
@@ -1850,14 +1850,14 @@ begin
         ExceptCheck;
       end;
   end;
-  FreeAndNil(Value);
+  //FreeAndNil(Value);
 end;
 
 procedure TBlockSocket.DelayedOption(const Value: TSynaOption);
 begin
   if FSocket = INVALID_SOCKET then
   begin
-    FDelayedOptions.Insert(0, Value);
+    FDelayedOptions := FDelayedOptions + [Value];
   end
   else
     SetDelayedOption(Value);
@@ -1868,12 +1868,12 @@ var
   n: integer;
   d: TSynaOption;
 begin
-  for n := FDelayedOptions.Count - 1 downto 0 do
+  for n := 0 to High(FDelayedOptions) do
   begin
     d := TSynaOption(FDelayedOptions[n]);
     SetDelayedOption(d);
   end;
-  FDelayedOptions.Clear;
+  Finalize(FDelayedOptions);
 end;
 
 procedure TBlockSocket.SetSin(var Sin: TVarSin; const IP, Port: string);
@@ -1989,19 +1989,20 @@ begin
 end;
 
 procedure TBlockSocket.AbortSocket;
-var
-  n: integer;
-  p: TSynaOption;
+//var
+//  n: integer;
+//  p: TSynaOption;
 begin
   if FSocket <> INVALID_SOCKET then
     synsock.CloseSocket(FSocket);
   FSocket := INVALID_SOCKET;
-  for n := FDelayedOptions.Count - 1 downto 0 do
+  {for n := FDelayedOptions.Count - 1 downto 0 do
     begin
       p := TSynaOption(FDelayedOptions[n]);
       FreeAndNil(p);
     end;
-  FDelayedOptions.Clear;
+  FDelayedOptions.Clear;}
+  Finalize(FDelayedOptions);
   FFamily := FFamilySave;
   DoStatus(HR_SocketClose, '');
   FDisconnected := False;
@@ -2034,7 +2035,9 @@ procedure TBlockSocket.Connect(const IP, Port: string);
 var
   Sin: TVarSin;
   b: boolean;
+  {$IFDEF MSWINDOWS}
   lError: Integer;
+  {$ENDIF}
 begin
   SetSin(Sin, IP, Port);
   if FLastError = 0 then
@@ -2050,9 +2053,13 @@ begin
       if (FLastError = WSAEINPROGRESS) OR (FLastError = WSAEWOULDBLOCK) then
         if not CanWrite(FConnectionTimeout) then
           FLastError := WSAETIMEDOUT;
+      {$IFDEF MSWINDOWS}
       lError := FLastError;
+      {$ENDIF}
       NonBlockMode := b;
+      {$IFDEF MSWINDOWS}
       FLastError := lError;
+      {$ENDIF}
     end
     else
       SockCheck(synsock.Connect(FSocket, Sin));
@@ -2803,7 +2810,7 @@ procedure TBlockSocket.SetLinger(Enable: Boolean; Linger: Integer);
 var
   d: TSynaOption;
 begin
-  d := TSynaOption.Create;
+  //d := TSynaOption.Create;
   d.Option := SOT_Linger;
   d.Enabled := Enable;
   d.Value := Linger;
@@ -3065,7 +3072,7 @@ procedure TBlockSocket.SetSizeRecvBuffer(Size: Integer);
 var
   d: TSynaOption;
 begin
-  d := TSynaOption.Create;
+  //d := TSynaOption.Create;
   d.Option := SOT_RecvBuff;
   d.Value := Size;
   DelayedOption(d);
@@ -3095,7 +3102,7 @@ procedure TBlockSocket.SetSizeSendBuffer(Size: Integer);
 var
   d: TSynaOption;
 begin
-  d := TSynaOption.Create;
+  //d := TSynaOption.Create;
   d.Option := SOT_SendBuff;
   d.Value := Size;
   DelayedOption(d);
@@ -3105,7 +3112,7 @@ procedure TBlockSocket.SetNagleMode(Value: Boolean);
 var
   d: TSynaOption;
 begin
-  d := TSynaOption.Create;
+  //d := TSynaOption.Create;
   d.Option := SOT_NoDelay;
   d.Enabled := Value;
   DelayedOption(d);
@@ -3115,7 +3122,7 @@ procedure TBlockSocket.SetNonBlockMode(Value: Boolean);
 var
   d: TSynaOption;
 begin
-  d := TSynaOption.Create;
+  //d := TSynaOption.Create;
   d.Option := SOT_nonblock;
   d.Enabled := Value;
   DelayedOption(d);
@@ -3131,7 +3138,7 @@ procedure TBlockSocket.SetSendTimeout(Timeout: Integer);
 var
   d: TSynaOption;
 begin
-  d := TSynaOption.Create;
+  //d := TSynaOption.Create;
   d.Option := SOT_sendtimeout;
   d.Value := Timeout;
   DelayedOption(d);
@@ -3141,7 +3148,7 @@ procedure TBlockSocket.SetRecvTimeout(Timeout: Integer);
 var
   d: TSynaOption;
 begin
-  d := TSynaOption.Create;
+  //d := TSynaOption.Create;
   d.Option := SOT_recvtimeout;
   d.Value := Timeout;
   DelayedOption(d);
@@ -3190,7 +3197,7 @@ procedure TBlockSocket.EnableReuse(Value: Boolean);
 var
   d: TSynaOption;
 begin
-  d := TSynaOption.Create;
+  //d := TSynaOption.Create;
   d.Option := SOT_reuse;
   d.Enabled := Value;
   DelayedOption(d);
@@ -3200,7 +3207,7 @@ procedure TBlockSocket.SetTTL(TTL: integer);
 var
   d: TSynaOption;
 begin
-  d := TSynaOption.Create;
+  //d := TSynaOption.Create;
   d.Option := SOT_TTL;
   d.Value := TTL;
   DelayedOption(d);
@@ -3759,7 +3766,7 @@ procedure TUDPBlockSocket.EnableBroadcast(Value: Boolean);
 var
   d: TSynaOption;
 begin
-  d := TSynaOption.Create;
+  //d := TSynaOption.Create;
   d.Option := SOT_Broadcast;
   d.Enabled := Value;
   DelayedOption(d);
@@ -3920,7 +3927,7 @@ procedure TUDPBlockSocket.SetMulticastTTL(TTL: integer);
 var
   d: TSynaOption;
 begin
-  d := TSynaOption.Create;
+  //d := TSynaOption.Create;
   d.Option := SOT_MulticastTTL;
   d.Value := TTL;
   DelayedOption(d);
@@ -3944,7 +3951,7 @@ procedure TUDPBlockSocket.EnableMulticastLoop(Value: Boolean);
 var
   d: TSynaOption;
 begin
-  d := TSynaOption.Create;
+  //d := TSynaOption.Create;
   d.Option := SOT_MulticastLoop;
   d.Enabled := Value;
   DelayedOption(d);

+ 2 - 8
ssposix.inc

@@ -1020,10 +1020,7 @@ begin
       end;
     finally
       if Assigned(Addr) then
-      begin
-        _Addr := Addr^;
-        FreeAddrInfo(_Addr);
-      end;
+        FreeAddrInfo(Addr^);
     end;
   end;
 end;
@@ -1081,10 +1078,7 @@ begin
       end;
     finally
       if Assigned(Addr) then
-      begin
-        _Addr := Addr^;
-        FreeAddrInfo(_Addr);
-      end;
+        FreeAddrInfo(Addr^);
     end;
   end;
 end;