/usr/share/ada/adainclude/aws/aws-net-websocket.ads is in libaws3.2.0-dev 3.2.0-3.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 | ------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2012-2014, AdaCore --
-- --
-- This library is free software; you can redistribute it and/or modify --
-- it under terms of the GNU General Public License as published by the --
-- Free Software Foundation; either version 3, or (at your option) any --
-- later version. This library is distributed in the hope that it will be --
-- useful, but WITHOUT ANY WARRANTY; without even the implied warranty of --
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. --
-- --
-- --
-- --
-- --
-- --
-- You should have received a copy of the GNU General Public License and --
-- a copy of the GCC Runtime Library Exception along with this program; --
-- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see --
-- <http://www.gnu.org/licenses/>. --
-- --
-- --
-- --
-- --
-- --
-- --
-- --
------------------------------------------------------------------------------
-- This implements the WebSocket protocol as defined in RFC-6455
with Ada.Strings.Unbounded;
with AWS.Status;
private with Interfaces;
package AWS.Net.WebSocket is
use Ada.Strings.Unbounded;
type Object is new Net.Socket_Type with private;
type Object_Class is access Object'Class;
No_Object : constant Object'Class;
type Kind_Type
is (Unknown, Connection_Open, Text, Binary, Ping, Pong, Connection_Close);
-- Data Frame Kind
type Error_Type is
(Normal_Closure,
Going_Away,
Protocol_Error,
Unsupported_Data,
No_Status_Received,
Abnormal_Closure,
Invalid_Frame_Payload_Data,
Policy_Violation,
Message_Too_Big,
Mandatory_Extension,
Internal_Server_Error,
TLS_Handshake,
Cannot_Resolve_Error,
User_01, -- User's defined error code
User_02,
User_03,
User_04,
User_05);
--
-- The following three methods are the one to override or redefine. In fact
-- the default Send implementation should be ok for most usages.
--
function Create
(Socket : Socket_Access;
Request : AWS.Status.Data) return Object'Class;
-- Create a new instance of the WebSocket, this is used by AWS internal
-- server to create a default WebSocket if no other constructor are
-- provided. It is also needed when deriving from WebSocket.
procedure On_Message (Socket : in out Object; Message : String) is null;
-- Default implementation does nothing, it needs to be overriden by the
-- end-user. This is the callback that will get activated for every server
-- incoming data. It is also important to keep in mind that the thread
-- handling this WebSocket won't be released until the procedure returns.
-- So the code inside this routine should be small and most importantly not
-- wait for an event to occur otherwise other requests won't be served.
procedure On_Message (Socket : in out Object; Message : Unbounded_String);
-- Same a above but takes an Unbounded_String. This is supposed to be
-- overriden when handling large messages otherwise a stack-overflow could
-- be raised. The default implementation of this procedure to to call the
-- On_Message above with a string.
--
-- So either this version is overriden to handle the incoming messages or
-- the one above if the messages are known to be small.
procedure On_Open (Socket : in out Object; Message : String) is null;
-- As above but activated when a WebSocket is opened
procedure On_Close (Socket : in out Object; Message : String) is null;
-- As above but activated when a WebSocket is closed
procedure On_Error (Socket : in out Object; Message : String) is null;
-- As above but activated when a WebSocket error is detected
procedure Send
(Socket : in out Object;
Message : String;
Is_Binary : Boolean := False);
-- This default implementation just send a message to the client. The
-- message is sent in a single chunk (not fragmented).
procedure Send
(Socket : in out Object;
Message : Unbounded_String;
Is_Binary : Boolean := False);
-- Same as above but can be used for large messages. The message is
-- possibly sent fragmented.
procedure Send
(Socket : in out Object;
Message : Stream_Element_Array;
Is_Binary : Boolean := True);
-- As above but default is a binary message
procedure Close
(Socket : in out Object;
Message : String;
Error : Error_Type := Normal_Closure);
-- Send a close frame to the WebSocket
--
-- Simple accessors to WebSocket state
--
function Kind (Socket : Object) return Kind_Type;
-- Returns the message kind of the current read data
function Protocol_Version (Socket : Object) return Natural;
-- Returns the version of the protocol for this WebSocket
function URI (Socket : Object) return String;
-- Returns the URI for the WebSocket
function Origin (Socket : Object) return String;
-- Returns the Origin of the WebSocket. That is the value of the Origin
-- header of the client which has opened the socket.
function Error (Socket : Object) return Error_Type;
-- Returns the current error type
function End_Of_Message (Socket : Object) return Boolean;
-- Returns True if we have read a whole message
--
-- Socket's methods that must be overriden
--
overriding procedure Shutdown
(Socket : Object;
How : Shutmode_Type := Shut_Read_Write);
-- Shutdown the socket
overriding function Get_FD (Socket : Object) return FD_Type;
-- Returns the file descriptor associated with the socket
overriding function Peer_Addr (Socket : Object) return String;
-- Returns the peer name/address
overriding function Peer_Port (Socket : Object) return Positive;
-- Returns the port of the peer socket
overriding function Get_Addr (Socket : Object) return String;
-- Returns the name/address of the socket
overriding function Get_Port (Socket : Object) return Positive;
-- Returns the port of the socket
overriding function Errno (Socket : Object) return Integer;
-- Returns and clears error state in socket
overriding function Get_Send_Buffer_Size (Socket : Object) return Natural;
-- Returns the internal socket send buffer size.
-- Do not confuse with buffers for the AWS.Net.Buffered operations.
overriding function Get_Receive_Buffer_Size
(Socket : Object) return Natural;
-- Returns the internal socket receive buffer size.
-- Do not confuse with buffers for the AWS.Net.Buffered operations.
private
type Internal_State is record
Kind : Kind_Type := Unknown;
Errno : Interfaces.Unsigned_16 := Interfaces.Unsigned_16'Last;
end record;
type Internal_State_Access is access Internal_State;
type Protocol_State;
type Protocol_State_Access is access Protocol_State;
type Object is new Net.Socket_Type with record
Socket : Net.Socket_Access;
Request : AWS.Status.Data;
Version : Natural;
State : Internal_State_Access;
P_State : Protocol_State_Access;
end record;
-- Routines read/write from a WebSocket, this handles the WebSocket
-- protocol.
overriding procedure Send
(Socket : Object;
Data : Stream_Element_Array;
Last : out Stream_Element_Offset);
overriding procedure Receive
(Socket : Object;
Data : out Stream_Element_Array;
Last : out Stream_Element_Offset);
-- Routine without implementation for a WebSocket
overriding procedure Bind
(Socket : in out Object;
Port : Natural;
Host : String := "";
Reuse_Address : Boolean := False;
Family : Family_Type := Family_Unspec) is null;
overriding procedure Listen
(Socket : Object; Queue_Size : Positive := 5) is null;
overriding procedure Accept_Socket
(Socket : Socket_Type'Class; New_Socket : in out Object) is null;
overriding procedure Connect
(Socket : in out Object;
Host : String;
Port : Positive;
Wait : Boolean := True;
Family : Family_Type := Family_Unspec) is null;
overriding procedure Socket_Pair (S1, S2 : out Object) is null;
overriding function Pending
(Socket : Object) return Stream_Element_Count;
overriding function Is_Listening (Socket : Object) return Boolean;
overriding procedure Set_Send_Buffer_Size
(Socket : Object; Size : Natural) is null;
overriding procedure Set_Receive_Buffer_Size
(Socket : Object; Size : Natural) is null;
overriding procedure Free (Socket : in out Object);
No_Object : constant Object'Class :=
Object'
(Net.Socket_Type with
Socket => null,
Request => <>,
Version => 0,
State => null,
P_State => null);
-- Error codes corresponding to all errors
Error_Code : constant array (Error_Type) of Interfaces.Unsigned_16 :=
(Normal_Closure => 1000,
Going_Away => 1001,
Protocol_Error => 1002,
Unsupported_Data => 1003,
No_Status_Received => 1005,
Abnormal_Closure => 1006,
Invalid_Frame_Payload_Data => 1007,
Policy_Violation => 1008,
Message_Too_Big => 1009,
Mandatory_Extension => 1010,
Internal_Server_Error => 1011,
TLS_Handshake => 1015,
Cannot_Resolve_Error => 0000,
User_01 => 3000,
User_02 => 3001,
User_03 => 3002,
User_04 => 3003,
User_05 => 3004);
end AWS.Net.WebSocket;
|