@@ -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+
830834end AWS.Net.WebSocket.Protocol.RFC6455 ;
0 commit comments