@@ -107,6 +107,14 @@ package body AWS.Net.WebSocket.Protocol.RFC6455 is
107
107
Error : Status_Code := 0 );
108
108
-- Send the frame (header + data)
109
109
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
+
110
118
function Is_Library_Error (Code : Interfaces.Unsigned_16) return Boolean;
111
119
-- Returns True if Code is a valid library error code
112
120
@@ -568,7 +576,6 @@ package body AWS.Net.WebSocket.Protocol.RFC6455 is
568
576
First : Positive := 1 ;
569
577
Last : Natural;
570
578
Mask : Masking_Key;
571
- Mask_Pos : Masking_Key_Index := 0 ;
572
579
begin
573
580
if From_Client then
574
581
Mask := Create_Random_Mask;
@@ -590,19 +597,15 @@ package body AWS.Net.WebSocket.Protocol.RFC6455 is
590
597
Last := Positive'Min (Len_Data, First + Chunk_Size - 1 );
591
598
592
599
declare
593
- S : Stream_Element_Array :=
600
+ S : constant Stream_Element_Array :=
594
601
Translator.To_Stream_Element_Array
595
602
(Slice (Data, First, Last));
596
603
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);
606
609
end ;
607
610
608
611
exit Send_Data when Last = Len_Data;
@@ -619,9 +622,7 @@ package body AWS.Net.WebSocket.Protocol.RFC6455 is
619
622
Data : Stream_Element_Array)
620
623
is
621
624
From_Client : constant Boolean := Socket.Is_Client_Side;
622
-
623
- Mask : Masking_Key;
624
- Mask_Pos : Masking_Key_Index := 0 ;
625
+ Mask : Masking_Key;
625
626
begin
626
627
if From_Client then
627
628
Mask := Create_Random_Mask;
@@ -636,24 +637,10 @@ package body AWS.Net.WebSocket.Protocol.RFC6455 is
636
637
637
638
-- Send payload
638
639
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);
657
644
end Send ;
658
645
659
646
-- --------------
@@ -677,7 +664,6 @@ package body AWS.Net.WebSocket.Protocol.RFC6455 is
677
664
Data'Length + (if Error_Code_Needed then 2 else 0 );
678
665
From_Client : constant Boolean := Socket.Is_Client_Side;
679
666
Mask : Masking_Key;
680
- Mask_Pos : Masking_Key_Index := 0 ;
681
667
682
668
begin
683
669
if From_Client then
@@ -704,26 +690,10 @@ package body AWS.Net.WebSocket.Protocol.RFC6455 is
704
690
end ;
705
691
end if ;
706
692
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);
727
697
end Send_Frame ;
728
698
729
699
-- ---------------------
@@ -827,4 +797,38 @@ package body AWS.Net.WebSocket.Protocol.RFC6455 is
827
797
Net.Buffered.Put_Line (Sock, Messages.Sec_WebSocket_Accept (Acc));
828
798
end Send_Header ;
829
799
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
+
830
834
end AWS.Net.WebSocket.Protocol.RFC6455 ;
0 commit comments