Skip to content

Commit fbf67d6

Browse files
committed
Code refactoring to share code to send payload.
Motivated by V825-006.
1 parent c2b879d commit fbf67d6

File tree

1 file changed

+57
-53
lines changed

1 file changed

+57
-53
lines changed

src/core/aws-net-websocket-protocol-rfc6455.adb

Lines changed: 57 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,14 @@ package body AWS.Net.WebSocket.Protocol.RFC6455 is
107107
Error : Status_Code := 0);
108108
-- Send the frame (header + data)
109109

110+
procedure Send_Payload
111+
(Socket : Object;
112+
Data : Stream_Element_Array;
113+
Has_Mask : Boolean;
114+
Mask : Masking_Key;
115+
Flush : Boolean := True) with Inline;
116+
-- Send payload, possibly masked if a client side socket
117+
110118
function Is_Library_Error (Code : Interfaces.Unsigned_16) return Boolean;
111119
-- Returns True if Code is a valid library error code
112120

@@ -568,7 +576,6 @@ package body AWS.Net.WebSocket.Protocol.RFC6455 is
568576
First : Positive := 1;
569577
Last : Natural;
570578
Mask : Masking_Key;
571-
Mask_Pos : Masking_Key_Index := 0;
572579
begin
573580
if From_Client then
574581
Mask := Create_Random_Mask;
@@ -590,19 +597,15 @@ package body AWS.Net.WebSocket.Protocol.RFC6455 is
590597
Last := Positive'Min (Len_Data, First + Chunk_Size - 1);
591598

592599
declare
593-
S : Stream_Element_Array :=
600+
S : constant Stream_Element_Array :=
594601
Translator.To_Stream_Element_Array
595602
(Slice (Data, First, Last));
596603
begin
597-
if From_Client then
598-
for Idx in S'Range loop
599-
S (Idx) := S (Idx)
600-
xor Mask (Stream_Element_Offset (Mask_Pos));
601-
Mask_Pos := Mask_Pos + 1;
602-
end loop;
603-
end if;
604-
605-
Net.Buffered.Write (Socket, S);
604+
Send_Payload
605+
(Socket, S,
606+
Has_Mask => From_Client,
607+
Mask => Mask,
608+
Flush => False);
606609
end;
607610

608611
exit Send_Data when Last = Len_Data;
@@ -619,9 +622,7 @@ package body AWS.Net.WebSocket.Protocol.RFC6455 is
619622
Data : Stream_Element_Array)
620623
is
621624
From_Client : constant Boolean := Socket.Is_Client_Side;
622-
623-
Mask : Masking_Key;
624-
Mask_Pos : Masking_Key_Index := 0;
625+
Mask : Masking_Key;
625626
begin
626627
if From_Client then
627628
Mask := Create_Random_Mask;
@@ -636,24 +637,10 @@ package body AWS.Net.WebSocket.Protocol.RFC6455 is
636637

637638
-- Send payload
638639

639-
if From_Client then
640-
declare
641-
D : Stream_Element_Array (Data'Range);
642-
begin
643-
for Idx in Data'Range loop
644-
D (Idx) := Data (Idx)
645-
xor Mask (Stream_Element_Offset (Mask_Pos));
646-
Mask_Pos := Mask_Pos + 1;
647-
end loop;
648-
649-
Net.Buffered.Write (Socket, D);
650-
end;
651-
652-
else
653-
Net.Buffered.Write (Socket, Data);
654-
end if;
655-
656-
Net.Buffered.Flush (Socket);
640+
Send_Payload
641+
(Socket, Data,
642+
Has_Mask => From_Client,
643+
Mask => Mask);
657644
end Send;
658645

659646
----------------
@@ -677,7 +664,6 @@ package body AWS.Net.WebSocket.Protocol.RFC6455 is
677664
Data'Length + (if Error_Code_Needed then 2 else 0);
678665
From_Client : constant Boolean := Socket.Is_Client_Side;
679666
Mask : Masking_Key;
680-
Mask_Pos : Masking_Key_Index := 0;
681667

682668
begin
683669
if From_Client then
@@ -704,26 +690,10 @@ package body AWS.Net.WebSocket.Protocol.RFC6455 is
704690
end;
705691
end if;
706692

707-
-- Send payload
708-
709-
if From_Client then
710-
declare
711-
D : Stream_Element_Array (Data'Range);
712-
begin
713-
for Idx in Data'Range loop
714-
D (Idx) := Data (Idx)
715-
xor Mask (Stream_Element_Offset (Mask_Pos));
716-
Mask_Pos := Mask_Pos + 1;
717-
end loop;
718-
719-
Net.Buffered.Write (Socket, D);
720-
end;
721-
722-
else
723-
Net.Buffered.Write (Socket, Data);
724-
end if;
725-
726-
Net.Buffered.Flush (Socket);
693+
Send_Payload
694+
(Socket, Data,
695+
Has_Mask => From_Client,
696+
Mask => Mask);
727697
end Send_Frame;
728698

729699
-----------------------
@@ -827,4 +797,38 @@ package body AWS.Net.WebSocket.Protocol.RFC6455 is
827797
Net.Buffered.Put_Line (Sock, Messages.Sec_WebSocket_Accept (Acc));
828798
end Send_Header;
829799

800+
------------------
801+
-- Send_Payload --
802+
------------------
803+
804+
procedure Send_Payload
805+
(Socket : Object;
806+
Data : Stream_Element_Array;
807+
Has_Mask : Boolean;
808+
Mask : Masking_Key;
809+
Flush : Boolean := True) is
810+
begin
811+
if Has_Mask then
812+
declare
813+
D : Stream_Element_Array (Data'Range);
814+
Mask_Pos : Masking_Key_Index := 0;
815+
begin
816+
for Idx in Data'Range loop
817+
D (Idx) := Data (Idx)
818+
xor Mask (Stream_Element_Offset (Mask_Pos));
819+
Mask_Pos := Mask_Pos + 1;
820+
end loop;
821+
822+
Net.Buffered.Write (Socket, D);
823+
end;
824+
825+
else
826+
Net.Buffered.Write (Socket, Data);
827+
end if;
828+
829+
if Flush then
830+
Net.Buffered.Flush (Socket);
831+
end if;
832+
end Send_Payload;
833+
830834
end AWS.Net.WebSocket.Protocol.RFC6455;

0 commit comments

Comments
 (0)