Aws PDF
Aws PDF
Aws PDF
Release 18.0
AdaCore
1 Introduction 1
2 Building AWS 3
2.1 Requirements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.2 AWS.Net.Std . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.3 Building . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.4 Building on cross-platforms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.5 Demos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.6 Installing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
3 Using AWS 7
3.1 Setting up environment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
3.1.1 Using environment variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
3.1.2 Using GNAT Project Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
3.2 Basic notions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
3.2.1 Building an AWS server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
3.2.2 Callback procedure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3.2.3 Form parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.2.4 Distribution of an AWS server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.3 Building answers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.3.1 Redirection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.3.2 New location for a page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.3.3 Authentication required . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.3.4 Sending back an error message . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.3.5 Response from a string . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.3.6 Response from a Stream_Element_Array . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.3.7 Response from a file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.3.8 Response from a stream . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.3.9 Response from a on-disk stream . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.3.10 Response from a on-disk once stream . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.3.11 Response from a memory stream . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.3.12 Response from a compressed memory stream . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.3.13 Split page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.3.14 Response a from pipe stream . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3.4 Configuration options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3.5 Session handling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.6 HTTP state management . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3.7 Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.8 File upload . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
3.9 Communication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
i
3.9.1 Communication - client side . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
3.9.2 Communication - server side . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
3.10 Hotplug module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
3.10.1 Hotplug module - server activation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
3.10.2 Hotplug module - creation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
3.11 Server Push . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
3.12 Working with Server sockets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.13 Server Log . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.14 Secure server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
3.14.1 Initialization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
3.14.2 Verify callback . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
3.14.3 Self-signed certificate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
3.14.4 Using a Certificate Authority . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.14.5 Security level . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.14.6 Protocol . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.15 Unexpected exception handler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.16 Socket log . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.17 Client side . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
5 Using SOAP 59
5.1 SOAP Client . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
5.2 SOAP Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
5.2.1 Step by step instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
5.2.2 SOAP helpers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
6 Using WSDL 63
ii
6.1 Creating WSDL documents . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
6.1.1 Using ada2wsdl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
6.1.2 Ada mapping to WSDL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
6.1.3 ada2wsdl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
6.1.4 ada2wsdl limitations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
6.2 Working with WSDL documents . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
6.2.1 Client side (stub) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
6.2.2 Server side (skeleton) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
6.2.3 wsdl2aws . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
6.2.4 wsdl2aws behind the scene . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
6.2.5 wsdl2aws limitations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
6.2.6 awsascb . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
6.3 Using ada2wsdl and wsdl2aws together . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
8 LDAP 81
9 Jabber 83
9.1 Jabber presence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
9.2 Jabber message . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
10 Resources 85
10.1 Building resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
10.2 Using resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
10.3 Stream resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
10.4 awsres tool . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
11 Status page 87
12 References 91
iii
13.21 AWS.Log . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
13.22 AWS.Messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
13.23 AWS.MIME . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
13.24 AWS.Net . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
13.25 AWS.Net.Buffered . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
13.26 AWS.Net.Log . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
13.27 AWS.Net.Log.Callbacks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
13.28 AWS.Net.SSL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
13.29 AWS.Net.SSL.Certificate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
13.30 AWS.Net.WebSocket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
13.31 AWS.Net.WebSocket.Registry . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
13.32 AWS.Net.WebSocket.Registry.Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
13.33 AWS.Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
13.34 AWS.POP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
13.35 AWS.Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
13.36 AWS.Resources.Embedded . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
13.37 AWS.Resources.Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
13.38 AWS.Resources.Streams . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
13.39 AWS.Resources.Streams.Disk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
13.40 AWS.Resources.Streams.Disk.Once . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
13.41 AWS.Resources.Streams.Memory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224
13.42 AWS.Resources.Streams.Memory.ZLib . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
13.43 AWS.Resources.Streams.Pipe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
13.44 AWS.Response . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230
13.45 AWS.Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
13.46 AWS.Server.Hotplug . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
13.47 AWS.Server.Log . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
13.48 AWS.Server.Push . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246
13.49 AWS.Server.Status . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252
13.50 AWS.Services.Callbacks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254
13.51 AWS.Services.Directory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
13.52 AWS.Services.Dispatchers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
13.53 AWS.Services.Dispatchers.Linker . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260
13.54 AWS.Services.Dispatchers.Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
13.55 AWS.Services.Dispatchers.URI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
13.56 AWS.Services.Dispatchers.Virtual_Host . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
13.57 AWS.Services.Download . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
13.58 AWS.Services.Page_Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
13.59 AWS.Services.Split_Pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271
13.60 AWS.Services.Split_Pages.Alpha . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
13.61 AWS.Services.Split_Pages.Alpha.Bounded . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
13.62 AWS.Services.Split_Pages.Uniform . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277
13.63 AWS.Services.Split_Pages.Uniform.Alpha . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279
13.64 AWS.Services.Split_Pages.Uniform.Overlapping . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
13.65 AWS.Services.Transient_Pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282
13.66 AWS.Services.Web_Block . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283
13.67 AWS.Services.Web_Block.Context . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284
13.68 AWS.Services.Web_Block.Registry . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
13.69 AWS.Session . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
13.70 AWS.SMTP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293
13.71 AWS.SMTP.Client . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296
13.72 AWS.Status . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300
13.73 AWS.Templates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307
13.74 AWS.Translator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 308
iv
13.75 AWS.URL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312
13.76 SOAP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316
13.77 SOAP.Client . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317
13.78 SOAP.Dispatchers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319
13.79 SOAP.Dispatchers.Callback . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
13.80 SOAP.Message . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
13.81 SOAP.Message.XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
13.82 SOAP.Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327
13.83 SOAP.Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331
v
vi
CHAPTER
ONE
INTRODUCTION
AWS stand for Ada Web Server. It is an Ada implementation of the HTTP/1.1 protocol as defined in the RFC-2616
from June 1999.
The goal is not to build a full Web server but more to make it possible to use a Web browser (like Internet Explorer,
or Netscape Navigator) to control an Ada application. As well see later it is also possible to have two Ada programs
exchange informations via the HTTP protocol. This is possible as AWS also implement the client side of the HTTP
protocol.
Moreover with this library it is possible to have more than one server in a single application. It is then possible to
export different kind of services by using different HTTP ports, or to have different ports for different services priority.
Client which must be served with a very high priority can be assigned a specific port for example.
As designed, AWS big difference with a standard CGI server is that there is only one executable. A CGI server has
one executable for each request or so, this becomes a pain to build and to distribute when the project gets bigger. We
will also see that it is easier with AWS to deal with session data.
AWS support also HTTPS (secure HTTP) using SSL. This is based on either OpenSSL or GNUTLS two Open Source
SSL implementations.
Major supported features are:
HTTP implementation
HTTPS (Secure HTTP) implementation based on SSLv3
Template Web pages (separate the code and the design)
Web Services - SOAP based
WSDL support (generate stub/skeleton from WSDL documents)
Basic and Digest authentication
Transparent session handling (server side)
HTTP state management (client side cookies)
File upload
Server push
SMTP / POP (client API)
LDAP (client API)
Embedded resources (full self dependant Web server)
Complete client API, including HTTPS
Web server activity log
1
AWS Documentation, Release 18.0
2 Chapter 1. Introduction
CHAPTER
TWO
BUILDING AWS
2.1 Requirements
AWS has been mainly developed with GNAT on Windows. It is built and tested regularly on GNU/Linux and Solaris,
it should be fairly portable across platforms. To build AWS you need:
GNU/Ada (GNAT compiler) ;
Obviously an Ada compiler is mandatory. Only GNAT is tested, the code should be fairly portable but has never
been tested on another compiler. See INSTALL file distributed with AWS for specific versions supported.
OpenSSL (optional) ;
OpenSSL is an Open Source toolkit implementing the Secure Sockets Layer (SSL v2 and v3 and TLS 1.1,
1.2) and much more. It is possible to download the OpenSSL source distribution from http://www.openssl.org
<http://www.openssl.org> and build it. A Windows binary distribution may also be downloaded there.
LibreSSL (optional) ;
LibreSSL is an Open Source toolkit implementing the Secure Sockets Layer which is fully compatible with
OpenSSL. It is possible to download the LibreSSL source distribution from https://www.libressl.org/> and build
it.
GNUTLS (optional) ;
GNUTLS is an Open Source toolkit implementing the Secure Sockets Layer (SSL v3 and TLS 1.1, 1.2) and
much more. It is necessary to install the developers libraries to use it in AWS.
OpenLDAP (optional) ;
OpenLDAP is an Open Source toolkit implementing the Lightweight Directory Access Protocol. If you want
to use the AWS/LDAP API on UNIX based systems, you need to install properly the OpenLDAP package. On
Windows you dont need to install it as the libldap.a library will be built by AWS and will use the standard
Windows LDAP DLL wldap32.dll.
You can download OpenLDAP from http://www.openldap.org <http://www.openldap.org>.
2.2 AWS.Net.Std
This package is the standard (non-SSL) socket implementation. It exists different implementations of this package:
IPv4 Version based on GNAT.Sockets. This is the default implementation used.
IPv6 As above but supporting IPv6 protocol. To select this implementation just do:
3
AWS Documentation, Release 18.0
2.3 Building
Before building be sure to edit makefile.conf, this file contains many settings important for the build. Note that
it is important to run make setup each time you edit this file.
When you have built and configured all external libraries you must set the ADA_PROJECT_PATH variable to point
to the GNAT Project files for the different packages. For XML/Ada support, you also need to set XMLADA to true in
makefile.conf.
At this point you can build AWS with:
Note that some demos require that AWS be built with SSL support. If you want to activate SSL you must have installed
the necessary developers libraries. It is possible to specify the SSL implementation to use with the SOCKET variable.
To build with GNUTLS:
Note that by default AWS is configured to use the GNAT compiler. So, if you use GNAT you can build AWS just with:
To build for a cross platform the TARGET makefile variable must be set with the cross toolchain to be used. The value
must be the triplet of the toolchain to use.
For example, to build on VxWorks:
Note that on cross-environment one need to build the demos manually. See demos/README.
2.5 Demos
AWS comes with some ready to use demos. The demos are a good way to learn how to use AWS.
Here are a short description of them:
agent A program using the AWS client interface. This simple tool can be used to retrieve Web page content. It supports
passing through a proxy with authentication and basic authentication on the Web site.
auth A simple program to test the Web Basic and Digest authentication feature.
autobahn A demo to validate the WebSocket implementation against the autobahn test suite.
cert A secure server using a Certificate Authority and validating clients with certificate. This is the highest security
level possible.
com Two simples program that uses the AWS communication service.
dispatch A simple demo using the dispatcher facility. see URI dispatcher.
hello_world The famous Hello World program. This is a server that will always return a Web page saying Hello
World!.
hello_wsdl An hello world kind of application using a WSDL document for describing the messages format.
hotplug A simple test for the hotplug feature.
https A simple secure server enforcing TLS 1.2 protocol to be used by the Web Browser. This demo also uses a signed
servers key and proper setup hand over the password to the secure layer.
interoplab A WSDL based demo that test most of the SOAP features.
jabber_demo A simple Jabber command line client to check the presence of a JID (Jabber ID). This uses the Jabber
API, see AWS.Jabber.
multiple_sessions A demo of two embedded servers using different sessions.
res_demo A demo using the resource feature. This Web Server embedded a PNG image and an HTML page. The
executable is self contained.
runme An example that test many AWS features.
soap_demo A simple client/server program to test the SOAP protocol.
soap_disp Like above but use a SOAP dispatcher.
soap_vs A client and server that implement seven SOAP procedures for testing purpose.
split A demo for the transient pages and page splitter AWSs feature. Here a very big table is split on multiple pages.
A set of links can be used to navigate to the next or previous page or to access directly to a given page.
test_ldap A simple LDAP demo which access a public LDAP server and display some information.
test_mail A simple application that send a set of SMTP messages with different kind of attachments.
text_input A simple demo which handle textarea and display the content.
vh_demo Two servers on the same machine... virtual hosting demo. see Virtual host dispatcher.
web_block A simple Web Bock based counter.
web_block_ajax As above but using also Ajax.
web_block_ajax_templates As above but using also the templates2ada tool which create a tight coupling between the
web templates and the Ada code.
web_elements A driver to browse the Web Elements library and see some examples.
web_mail A simple Web Mail implementation that works on a POP mailbox.
websockets A simple WebSocket demo.
wps A very simple static Web page server based on AWS.Services.Page_Server. see Static Page server.
ws A static Web page server and push enabled server.
2.5. Demos 5
AWS Documentation, Release 18.0
2.6 Installing
When the build is done you must install AWS at a specific location. The target directory is defined with the prefix
makefile.conf variable. The default value is set to the compiler root directory. Note that the previously installed
version is automatically removed before installing the new one. To install:
$ make install
To install AWS into another directory you can either edit makefile.conf and set prefix to the directory you like to
install AWS or just force the make prefix variable:
Alternatively, with GNAT 5.03 and above it is possible to install AWS into the GNAT Standard Library location. In
this case AWS is ready-to-use as there is no need to set ADA_PROJECT_PATH, just set prefix to point to GNAT root
directory:
THREE
USING AWS
After installing AWS you must set the build environment to point the compiler to the right libraries. First lets say that
AWS has been installed in awsroot directory.
Following are the instructions to set the environment yourself. Note that the preferred solution is to use project files.
In this case there is no manual configuration.
spec files
The spec files are installed in <awsroot>/include/aws. Add this path into ADA_INCLUDE_PATH
or put it on the command line -aI<awsroot>/include/aws.
libraries
The GNAT library files (.ali) and the AWS libraries (libaws.a) are installed into <awsroot>/
lib/aws. Add this path into ADA_OBJECTS_PATH or put it on the command line -
aO<awsroot>/lib/aws/static. Furthermore for gnatlink to find the libraries you must add the following
library path option on the gnatmake command line -largs -L<awsroot>/lib/aws -laws.
Note that to build SSL applications you need to add -lssl -lcrypto on gnatmakes -largs section.
external libraries
You must do the same thing (setting ADA_INCLUDE_PATH and ADA_OBJECTS_PATH) for all external
libraries that you will be using.
The best solution is to use the installed GNAT Project File aws.gpr. This is supported only for GNAT 5.01 or above.
You must have installed XML/Ada with project file support too.
If this is the case just set the ADA_PROJECT_PATH variable to point to the AWS and XML/Ada install directories.
From there you just have to with the AWS project file in your GNAT Project file, nothing else to set:
with "aws";
project Simple is
7
AWS Documentation, Release 18.0
end Simple;
See the GNAT Users Guide for more information about GNAT Project Files.
AWS is not a Web Server like IIS or Apache, it is a component to embedded HTTP protocol in an application. It
means that it is possible to build an application which can also answer to a standard browser like Internet Explorer
or Netscape Navigator. Since AWS provides support client and server HTTP protocol, applications can communicate
through the HTTP channel. This give a way to build distributed applications, see AWS.Client.
An application using AWS can open many HTTP channels. Each channel will use a specific port. For example, it is
possible to embedded many HTTP and/or many HTTPS channels in the same application.
WS : AWS.Server.HTTP;
procedure Start
(Web_Server : in out HTTP;
Name : in String;
Callback : in Response.Callback;
Max_Connection : in Positive := Def_Max_Connect;
Admin_URI : in String := Def_Admin_URI;
Port : in Positive := Def_Port;
Security : in Boolean := False;
Session : in Boolean := False;
Case_Sensitive_Parameters : in Boolean := True;
Upload_Directory : in String := Def_Upload_Dir);
-- Start the Web server. It initialize the Max_Connection connections
-- lines. Name is just a string used to identify the server. This is used
-- for example in the administrative page. Admin_URI must be set to enable
-- the administrative status page. Callback is the procedure to call for
-- each resource requested. Port is the Web server port. If Security is
-- set to True the server will use an HTTPS/SSL connection. If Session is
-- set to True the server will be able to get a status for each client
-- connected. A session ID is used for that, on the client side it is a
-- cookie. Case_Sensitive_Parameters if set to False it means that the CGI
-- parameters name will be handled without case sensitivity. Upload
-- directory point to a directory where uploaded files will be stored.
This procedure receive the request status. It is possible to retrieve information about the request through the
AWS.Status API (see AWS.Status.).
For example, to know what URI has been asked:
Then this function should return an answer using one of the constructors in AWS.Response (see AWS.Response.).
For example, to return an HTML message:
It is also possible to return a file. For example, here is the way to return a PNG image:
Note that the main procedure should exit only when the server is terminated. For this you can use the AWS.Server.Wait
service.
A better solution is to use a template engine like Templates_Parser to build the HTML Web Server answer. Tem-
plates_Parser module is distributed with this version of AWS.
The callback procedure is the users code that will be called by the AWS component to get the right answer for the
requested resource. In fact AWS just open the HTTP message, parsing the HTTP header and it builds an object of type
AWS.Status.Data. At this point it calls the users callback procedure, passing the object. The callback procedure must
returns the right response for the requested resources. Now AWS will just build up the HTTP response message and
send it back to users browser.
But what is the resource ?
Indeed in a standard Web development a resource is either a static object - an HTML page, an XML or XSL document -
or a CGI script. With AWS a resource is just a string to identify the resource, it does not represent the name of a static
object or CGI script.
So this string is just an internal representation for the resource. The callback procedure must be implemented to handle
each internal resource and return the right response.
Lets have a small example. For example we want to build a Web server that will answer Hello World if we ask for
the internal resource /hello, and must answer Hum... otherwise:
with AWS.Response;
with AWS.Server;
with AWS.Status;
procedure Hello_World is
WS : AWS.Server.HTTP;
begin
AWS.Server.Start
(WS, "Hello World", Callback => HW_CB'Unrestricted_Access);
delay 30.0;
end Hello_World;
Now of course the resource internal name can represent a file on disk. It is not mandatory but it is possible. For
example it is perfectly possible to build with AWS a simple page server.
As an example, lets build a simple page server. This server will returns files in the current directory. Resources
internal name represent an HTML page or a GIF or PNG image for example. This server will return a 404 message
(Web Page Not Found) if the file does not exist. Here is the callback procedure that implements such simple page
server:
function Get (Request : in AWS.Status.Data) return AWS.Response.Data is
URI : constant String := AWS.Status.URI (Request);
Filename : constant String := URI (2 .. URI'Last);
begin
if Utils.Is_Regular_File (Filename) then
return AWS.Response.File
(Content_Type => AWS.MIME.Content_Type (Filename),
Filename => Filename);
else
return AWS.Response.Acknowledge
(Messages.S404,
"<p>Page '" & URI & "' Not found.");
end if;
end Get;
Form parameters are stored into a table of key/value pair. The key is the form input tag name and the value is the
content of the input field as filled by the user:
Enter your name
Note that as explained above Callback procedure, the resource described in ACTION is just an internal string repre-
sentation for the resource.
In this example there is two form parameters:
name The value is the content of this text field as filled by the client.
go The value is Ok.
There is many functions (in AWS.Parameters) to retrieve the tag name or value and the number of parameters. Here
are some examples:
function Service (Request : in AWS.Status.Data) return AWS.Response.Data is
P : constant AWS.Parameters.List := AWS.Status.Parameters (Request);
...
The directory containing the server program must contain the following files if you plan to use a status page see Status
page.
aws_status.thtml
The template HTML file for the AWS status page.
aws_logo.png
The AWS logo displayed on the status page.
aws_up.png
The AWS hotplug table up arrow.
aws_down.png
The AWS hotplug table down arrow.
Note that these filenames are the current AWS default. But it is possible to change those defaults using the configuration
files see Configuration options.
We have already seen, in simple examples, how to build basic answers using AWS.Response API. In this section we
present all ways to build answers from basic support to the more advanced support like the compressed memory stream
response.
3.3.1 Redirection
A redirection is a way to redirect the clients browser to another URL. Clients wont notice that a redirection has
occurs. As soon as the browser has received the response from the server it will retrieve the page as pointed by the
redirection:
User will receive a Web page saying that this page has moved and eventually pointing to the new location:
return Response.Moved
(Location => "/use-this-one";
Message => "This page has moved, please update your reference");
For protected pages you need to ask user to enter a password. See Authentication.
Acknowledge can be used to send back error messages. There is many kind of status code, see Message.Status_Code
definition. Together with the status code it is possible to pass textual error message in Message_Body parameter:
return Response.Acknowledge
(Status_Code => Messages.S503,
Message_Body => "Can't connect to the database, please retry later.",
Content_Type => MIME.Text_Plain);
This is the simplest way to build a response object. There is two constructors in AWS.Response, one based on a
standard string and one for Unbounded_String:
The Build routine takes also a status code parameter to handle errors. By default this code is Messages.S200 which
is the standard HTTP status (no error encountered). The other parameter can be used to control caches. See
AWS.Response.
This is exactly as above but the Build routine takes a Stream_Element_Array instead of a string.
To build a File response there is a single constructor named File. This routine is very similar to the one above except
that we specify a filename as the response:
Again there parameters to control the status code and cache. No check on the filename is done at this point, so if
index.html does not exit no exception is raised. The server is responsible to check for the file and to properly send
back the 404 message if necessary.
Note that this routine takes an optional parameter named Once that is to be used for temporary files created on the
server side for the client. With Once set to True the file will be deleted by the server after sending it (this includes the
case where the download is suspended).
Sometimes it is not possible (or convenient) to build the response in memory as a string object for example. Streams
can be used to workaround this. The constructor for such response is again very similar to the ones above except that
instead of the data we pass an handle to a Resources.Streams.Stream_Type object.
The first step is to build the stream object. This is done by deriving a new type from Resources.Streams.Stream_Type
and implementing three abstract procedures.
Read
Must return the next chunk of data from the stream. Note that initialization if needed are to be done there
during the first call to read.
End_Of_File
Must return True when there is no more data on the stream.
Close
Must close the stream and for example release all memory used by the implementation.
The second step is to build the response object:
Stream_Object : SQL_Stream;
...
Note that in some cases it is needed to create a file containing the data for the client (for example a tar.gz or a zip
archive). But there is no way to properly remove this file from the file system as we really dont know when the upload
is terminated when using the AWS.Response.File constructor. To solve this problem it is possible to use a stream as the
procedure Close is called by the server when all data have been read. In this procedure it is trivial to do the necessary
clean-up.
An ready-to-use implementation of the stream API described above where the stream content is read from an on-disk
file.
An ready-to-use implementation of the stream API described above where the stream content is read from an on-disk
file. When the transfer is completed the file is removed from the file system.
This is an implementation of the standard stream support described above. In this case the stream is in memory and
built by adding data to it.
To create a memory stream just declare an object of type AWS.Resources.Streams.Memory.Stream_Type. When cre-
ated, this memory stream is empty, using the Streams.Memory.Append routines it is possible to add chunk of data to
it. It is of course possible to call Append as many times as needed. When done just return this object to the server:
Data : AWS.Resources.Streams.Memory.Stream_Type;
...
Note that you do not have to take care of releasing the allocated memory, the default Close routine will do just that.
This is a slight variant of the standard memory stream described above. In this case the stream object must be declared
as a AWS.Resources.Streams.Memory.ZLib.Stream_Type.
The ZLib stream object must be initialized to enable the compression and select the right parameters. This is done
using the AWS.Resources.Streams.Memory.ZLib.Deflate_Initialize routine which takes many parameters to select the
right options for the compression algorithm, all of them have good default values. When initialized the compressed
stream object is used exactly as a standard stream:
Data : AWS.Resources.Streams.Memory.ZLib.Stream_Type;
Deflate_Initialize (Data);
...
Note that there is the reverse implementation to decompress a stream. See AWS.Resources.Streams.Memory.ZLib. Its
usage is identical.
AWS has a specific high level service to split a large response into a set of pages. For more information see Split pages.
The response sent to the server is read from the output of an external application. This kind of stream can be used to
avoid writing a temporary file into the hard disk. For example it is possible to return an archive created with the tar
tool without writing the intermediate tar achive on the disk.
To configure an AWS server it is possible to use a configuration object. This object can be set using the AWS.Config.Set
API or initialized using a configuration file.
Configuration files are a way to configure the server without recompiling it. Each application can be configured using
two configurations files:
aws.ini
This file is parsed first and corresponds to the configuration for all AWS server runs in the same directory.
<program_name>.ini
This file is parsed after aws.ini. It is possible with this initialization file to have specific settings for
some servers. program_name.ini is looked first in the applications directory and then in the current
working directory. This is only supported on platforms where Ada.Command_Line is implemented. So,
on VxWorks only aws.ini is parsed.
Furthermore, it is possible to read a specific configuration file using the AWS.Config.Ini.Read routine. See
AWS.Config.Ini.
Current supported options are:
Accept_Queue_Size (positive)
This is the size of the queue for the incoming requests. Higher this value will be and less connection
refused will be reported to the client. The default value is 64.
Admin_Password (string)
This is the password used to call the administrative page. The password can be generated with
aws_password (the module name must be admin):
Admin_URI (string)
This is the URI to call the administrative page. This can be used when calling AWS.Server.Start. The
default is <not-defined>.
Case_Sensitive_Parameters (boolean)
If set to True the HTTP parameters are case sensitive. The default value TRUE.
Certificate (string)
Set the certificate file to be used with the secure servers. The default is cert.pem. A single certificate
or a certificate chain is supported. The certificates must be in PEM format and the chain must be sorted
starting with the subjects certificate, followed by intermediate CA certificates if applicable and ending at
the highest level (root) CA certificate. If the file contains only a single certificate, it can be followed by a
private key. In this case the Key parameter (see below) must empty.
Check_URL_Validity (boolean)
Server have to check URI for validity. For example it checks that an URL does not reference a resource
above the Web root. The default is TRUE.
Cipher_Priorities
Values are dependent on the actual secure layer (OpenSSL or GNUTLS). It is used to specify the sessions
handshake algorithms and options.
Cleaner_Wait_For_Client_Timeout (duration)
Number of seconds to timeout on waiting for a client request. This is a timeout for regular cleaning task.
The default is 80.0 seconds.
Cleaner_Client_Header_Timeout (duration)
Number of seconds to timeout on waiting for client header. This is a timeout for regular cleaning task.
The default is 7.0 seconds.
Cleaner_Client_Data_Timeout (duration)
Number of seconds to timeout on waiting for client message body. This is a timeout for regular cleaning
task. The default is 28800.0 seconds.
Cleaner_Server_Response_Timeout (duration)
Number of seconds to timeout on waiting for client to accept answer. This is a timeout for regular cleaning
task. The default is 28800.0 seconds.
Config_Directory (string)
The directory in which AWS keeps some configuration parameters. The default is .config/ada-web-srv.
CRL_File (string)
This configuration option must point to a filename containing a CRL (Certificate Revocation List). This
will make it possible to control client connecting to the server. The default values is <not-defined>.
Directory_Browser_Page (string)
Specify the filename for the directory browser template page. The default value is aws_directory.thtml.
Down_Image (string)
The name of the down arrow image to use in the status page. The default is aws_down.png.
Error_Log_Filename_Prefix (string)
This is to set the filename prefix for the log file. By default the log filename prefix is the program name
(without extension) followed by _error.
Error_Log_Split_Mode [None/Each_Run/Daily/Monthly]
It indicates how to split the error logs. Each_Run means that a new log file is used each time the process
is started. Daily and Monthly will use a new log file each day or month. The default is NONE.
Exchange_Certificate (boolean)
If set to True it means that the client will be asked to send its certificate to the server. The default value is
FALSE.
Certificate_Required (boolean)
If set to True the server will reject all SSL connections if the client did not provide a certificate (be it valid
or not). The Exchange_Certificate option must be set in this case. The default value is FALSE.
Force_Wait_For_Client_Timeout (duration)
Number of seconds to timeout on waiting for a client request. This is a timeout for urgent request when
resources are missing. The default is 2.0 seconds.
Force_Client_Header_Timeout (duration)
Number of seconds to timeout on waiting for client header. This is a timeout for urgent request when
resources are missing. The default is 2.0 seconds.
Force_Client_Data_Timeout (duration)
Number of seconds to timeout on waiting for client message body. This is a timeout for urgent request
when resources are missing. The default is 10800.0 seconds.
Force_Server_Response_Timeout (duration)
Number of seconds to timeout on waiting for client to accept answer. This is a timeout for urgent request
when resources are missing. The default is 10800.0 seconds.
Free_Slots_Keep_Alive_Limit (positive)
This is the minimum number of remaining free slots to enable keep-alive HTTP connections.
For heavy-loaded HTTP servers, the Max_Connection parameter should be big enough, and
Free_Slots_Keep_Alive_Limit should be about 1-10% of the Max_Connection parameter depending on
the duration of the average server response. Longer is the average time to send back a response bigger
Free_Slots_Keep_Alive_Limit should be. The default is 1.
Hotplug_Port (positive)
This is the hotplug communication port needed to register and un-register an hotplug module. The default
value is 8888.
Key (string)
Set the RSA key file to be used with the secure servers. The default file is <not-defined>.
Line_Stack_Size (positive)
The HTTP lines stack size. The stack size must be adjusted for each applications depending on the use of
the stack done by the callback procedures. The default is 1376256.
Log_Extended_Fields (string list)
Comma separated list of the extended log field names. If this parameter is empty, the HTTP log would be
in the apache compartible format, otherwise log file would be in Extended format. For more information
see Server Log.
Log_File_Directory (string)
This is to set the directory where log file must be written. This parameter will be used automatically by
AWS.Log if logging facility is enabled. By default log files are written in the current directory. The default
is ./.
Log_Filename_Prefix (string)
This is to set the filename prefix for the log file. By default the log filename prefix is the program name
(without extension).
Log_Split_Mode [None/Each_Run/Daily/Monthly]
It indicates how to split the logs. Each_Run means that a new log file is used each time the process is
started. Daily and Monthly will use a new log file each day or month. The default is NONE.
Logo_Image (string).
The name of the logo image to use in the status page. The default is aws_logo.png.
Max_Concurrent_Download (positive)
Control the maximum number of parallel downloads accepted by the download manager. The default
value is 25.
Max_Connection (positive)
This is the maximum number of simultaneous connections for the server. This can be used when calling
the AWS.Server.Start. The default is 5.
Note that the total number of threads used by a server is:
Note: [...] means optional value Add 1 only if the session feature is activated. This is due to the session
cleaner task.
Max_POST_Parameters (positive)
The maximum number of POST parameters supported by AWS. The default value is 100.
Max_WebSocket (positive)
The maximum number of WebSocket that can be opened simultaneously in AWS. Above this value AWS
will try to close timed-out WebSockets (see WebSocket_Timeout). The default value is 512.
Max_WebSocket_Handler (positive)
The maximum number of message to handle simultaenously. The default value is 2.
MIME_Types (string)
The name of the file containing the MIME types associations. The default file name is aws.mime.
Receive_Timeout (duration)
Number of seconds to timeout when receiving chunk of data. The default is 30.0 seconds.
Reuse_Address (boolean)
Set the socket reuse address policy. If set to True the server will be able to bind to a socket that has just
been released without the need of waiting. Enabling this feature may introduce security risks on some
platforms. The default is FALSE.
Security_Mode (string)
Set the security mode to use for the secure connections. The default mode is SSLv23. See AWS.Net.SSL.
Send_Buffer_Size (positive)
This is the socket internal buffer used for sending data to the clients. The default is 0.
Send_Timeout (duration)
Number of seconds to timeout when sending chunk of data. The default is 40.0 seconds.
Server_Host (string)
The name of the host machine. This can be used if a computer has more than one IP address, it is possible
to have two servers at the same port on the same machine, both being binded on different IP addresses.
Server_Name (string)
The name of the server. This can be used when calling AWS.Server.Start. The default is AWS Module.
Server_Priority (natural)
Priority of the task handling the HTTP protocol. The default is Default_Priority.
Server_Port (integer)
The port where server will wait for incoming connections requests. This can be used when calling
AWS.Server.Start. The default is 8080.
Service_Priority (natural)
Priority of the tasks used by optional services like SMTP Server, Server Push, Jabber and the Transient
Page cleaner. The default is Default_Priority.
Session (boolean)
Whether the session support must be activated or not. The default is FALSE.
Session_Name (string)
The name of the cookie session. This can be used to support sessions for multiple servers embedded into
the same executable. The default is AWS.
Session_Id_Length (positive)
The length of the session id in characters. The default is 11 characters.
Session_Lifetime (duration)
Number of seconds to keep session information. After this period a session is obsoleted and will be
removed at next cleanup. The default is 600.0 seconds.
Session_Cleanup_Interval (duration)
Number of seconds between each run of the session cleanup task. This task will remove all session data
that have been obsoleted. The default is 300.0 seconds.
Session_Cleaner_Priority (natural)
Priority of the task cleaning the session data. The default is Default_Priority.
Status_Page (string)
The name of the status page to used. The default is aws_status.thtml.
TLS_Ticket_Support (boolean)
Specify whether the TLS ticket support is activated or not. The default value is FALSE.
Transient_Cleanup_Interval (positive)
Specify the number of seconds between each run of the cleaner task to remove transient pages. The default
value is 180.0 seconds.
Transient_Lifetime (duration)
Specify the number of seconds to keep a transient page. After this period the transient page is obsoleted
and will be removed during next cleanup. The default value is 300.0 seconds.
Trusted_CA (string)
This must point to the file containing the list of trusted Certificate Authorities. The CA in this file will be
used to verify the client certificate validity. The default values is <not-defined>.
Up_Image (string)
The name of the up arrow image to use in the status page. The default is aws_up.png.
Upload_Directory (string)
This is to set the directory where upload files must be stored. By default uploaded files are written in the
current directory. The default is <not-defined>.
WebSocket_Message_Queue_Size (positive)
This is the size of the queue containing incoming messages waiting to be handled by one of the task, see
Max_WebSocket_Handler above. The default value is 10.
WebSocket_Origin (string)
This is a regular expression which can be used to handle WebSockets originating from a specific domain.
By default AWS handles WebSockets from any origins.
WebSocket_Priority (natural)
Priority of the task handling the WebSockets. The default is Default_Priority.
WebSocket_Timeout (duration)
A number of seconds after which a WebSocket without activity is considered timed-out and can be elected
to be closed if the maximum number of sockets opened has been reached. (see Max_WebSocket). The
default is 28800.0.
WWW_Root (string)
This option sets the Web Server root directory. All Web resources are referenced from this root directory.
The default value is ./.
Each option value can be retrieved using the AWS.Config unit or set using AWS.Config.Set.
For example to build a server where the port and the maximum number of connection can be changed via a configura-
tion file (either aws.ini or <program_name>.ini):
WS : AWS.Server.HTTP;
AWS provides a way to keep session data while users are browsing. It works by creating transparently a session ID
where it is possible to insert, delete and retrieve session data using a standard Ada API (see AWS.Session.). Session
data are key/value pair each of them being strings. These sessions data are kept on the server, for client side state
management see HTTP state management.
First you declare and start an HTTP channel with session enabled:
WS : AWS.Server.HTTP;
Server.Start (WS,
Port => 1234,
Callback => Service'Access,
Session => True);
Here we have built an HTTP channel with a maximum of 3 simultaneous connections using the port 1234. A
session ID will be created and sent inside a cookie to the clients browser at the first request. This session ID
will be sent back to the server each time the client will ask for a resource to the server.
Next, in the Service callback procedure that you have provided you must retrieve the Session ID. As we have
seen, the callback procedure has the following prototype:
The Session ID is kept in the Request object and can be retrieved using:
From there it is quite easy to get or set some session data using the provided API. For example:
declare
C : Integer;
begin
C := AWS.Session.Get (Session_ID, "counter");
C := C + 1;
AWS.Session.Set (Session_ID, "counter", C);
end;
This example first get the value (as an Integer) for session data whose key is counter, increment this counter
and then set it back to the new value.
It is also possible to save and restore all session data. It means that the server can be shutdown and launched some
time after and all client data are restored as they were at shutdown time. Client will just see nothing. With this feature
it is possible to shutdown a server to update its look or because a bug has been fixed for example. It is then possible to
restart it keeping the complete Web server context.
AWS provides a full implementation of RFC 2109 via the AWS.Cookie package. Using this package you set, get and
expire client-side HTTP cookies.
First we set a cookie:
declare
Content : AWS.Response.Data;
begin
AWS.Cookie.Set (Content,
Key => "hello",
Value => "world",
Max_Age => 86400.0);
end;
Here we set the cookie hello with the value world, and we tell the client to expire the cookie 86400 seconds into the
future.
Getting the cookie value back is equally simple:
declare
Request : AWS.Status.Data
-- Assume that this object contain an actual HTTP request.
begin
Put_Line (AWS.Cookie.Get (Request, "hello"));
-- Output 'world'
end;
Had the cookie hello not existed, an empty String wouldve been returned.
In some cases it might be of value to know if a given cookie exists, and for that we have the Exists function available:
declare
Request : AWS.Status.Data
-- Assume that this object contain an actual HTTP request
begin
if AWS.Cookie.Exists ("hello") then
Put_Line ("The 'hello' cookie exists!");
end if;
end;
Note that Exists doesnt care if the cookie contains an actual value or not. If a cookie with no value exists, Exists will
return True.
And finally we might wish to tell the client to expire a cookie:
declare
Content : AWS.Response.Data;
begin
AWS.Cookie.Expire (Content,
Key => "hello");
end;
The Cookie package provide Get functions and Set procedures for String, Integer, Float and Boolean types, but
since cookies are inherently strings, its important to understand what happens when the cookie String value cant be
converted properly to either Integer, Float or Boolean.
So if either conversion fails or the cookie simply doesnt exist, the following happens:
For Integer, the value 0 is returned
For Float, the value 0.0 is returned.
For Boolean, the value False is returned. Note that only the string True is True. Everything else is False.
For more information see AWS.Cookie.
3.7 Authentication
AWS supports Basic and Digest authentication. The authentication request can be sent at any time from the callback
procedure. For this the AWS.Response.Authenticate message must be returned.
The authentication process is as follow:
Send authentication request
From the callback routine return an authentication request when needed:
The first parameter is the Realm, it is just a string that will be displayed (on the authentication dialog box) by
the browser to indicate for which resource the authentication is needed.
3.7. Authentication 23
AWS Documentation, Release 18.0
Check authentication
When an authentication as been done the callbacks request data contain the user and password. Checks the
values against an ACL for each protected resources:
function Protected_Service
(Request : in AWS.Status.Data) return AWS.Response.Data
is
User : constant String := Status.Authorization_Name (Request);
Pwd : constant String := Status.Authorization_Password (Request);
begin
if User = "xyz" and then Pwd = "azerty" then
return ...;
Note that the Basic authentication is not secure at all. The password is sent unencoded by the browser to the server. If
security is an issue it is better to use the Digest authentication and/or an SSL server.
File upload is the way to send a file from the client to the server. To enable file upload on the client side the Web page
must contain a FORM with an INPUT tag of type FILE. The FORM must also contain the enctype attribute set to
multipart/form-data:
On the server side, AWS will retrieve the file and put it into the upload directory. AWS add a prefix to the file to ensure
that the filename will be unique on the server side. The upload directory can be changed using the configuration
options. See Configuration options.
The uploaded files are removed after the users callback. This is done for security reasons, if files were not removed
it would be possible to fill the server hard disk by uploading large files to the server. This means that uploaded files
must be specifically handled by the users by either copying or renaming them.
AWS will also setup the form parameters as usual. In the above example there is two parameters (see Form parameters).
filename
This variable contains two values, one with the client side name and one with the server side name.
First value : Parameters.Get (P, filename)
The value is the full pathname of the file on the server. (i.e. the upload directory catenated with the prefix
and filename).
Second value : Parameters.Get (P, filename, 2)
The value is the simple filename (no path information) of the file on the client side.
go
The value is Send File
3.9 Communication
This API is used to do communication between programs using the HTTP GET protocol. It is a very simple API
not to be compared with GLADE or SOAP. This communication facility is to be used for simple request or when a
light communication support is needed. For more complex communications or to achieve inter-operability with other
modules it is certainly a good idea to have a look at the AWS/SOAP support, see SOAP.
In a communication there is a Client and a Server. Here is what is to be done on both sides to have programs talking
together.
On the client side it is quite simple. You just have to send a message using AWS.Communication.Client.Send_Message:
function Send_Message
(Server : in String;
Port : in Positive;
Name : in String;
Parameters : in Parameter_Set := Null_Parameter_Set)
return Response.Data;
The message is sent to the specified server using the given port. A message is composed of a name which is a string
and a set of parameters. There is a parameter set constructor in AWS.Communication. This function return a response
as for any callback procedure.
On the server side things are a bit more complex but not that difficult. You must instantiate the
AWS.Communication.Server generic package by providing a callback procedure. This callback procedure will must
handle all kind of message that a client will send.
During instantiation you must also pass a context for the communication server. This context will be passed back to
the callback procedure:
generic
package AWS.Communication.Server is
...
A complete example can be found in the demos directory. Look for com_1.adb and com_2.adb.
Note that this communication API is used by the Hotplug module facility, see Hotplug module.
3.9. Communication 25
AWS Documentation, Release 18.0
An Hotplug module is a module that can by dynamically binded to a running server. It is a Web server and the
development process is very similar to what we have seen until now Building an AWS server. The Hotplug module
will register itself into a Web server by sending a message using the communication API. The Hotplug module send
to the server a regular expression and an URL. The main server will redirect all URL matching the regular expression
to the Hotplug module.
Note that the main server will redirect the URL to the first matching regular expression.
The first step is to properly create the main server hotplug module registration file. This file must list all hotplug
modules that can register into the main server. Each line have the following format:
hotplug_module_name:password:server:port
hotplug_module_name
The name of the hotplug module. You can choose any name you want. This name will be use during the
registration process and to generate the password.
password
The MD5 password, see below.
server
The name of the server where the redirection will be made. This is for security reasons, main server will
not permit to redirect requests to any other server.
port
The port to use for the redirection on server.
You must create a password for each hotplug modules. The generated password depends on the hotplug module name.
A tool named aws_password is provided with AWS to generate such password. Usage is simple:
Then, after starting the main server you must activate the Hotplug feature:
Here we have a server listening to the port 1235. This server can be used alone if needed as any Server developed
with AWS.
Then you register the Hotplug module to the main server, see AWS.Client.Hotplug:
Response := AWS.Client.Hotplug.Register
(Name => "Hotplug_Module_Demo",
Password => "my_password",
Server => "http://dieppe:2222",
Regexp => ".*AWS.*",
URL => "http://omsk:1235/");
The hotplug module Hotplug_Module_Demo must have been declared on the main server, the password and
redirection must have been properly recorded too for security reasons, see Hotplug module - server activation.
This command register Hotplug_Module_Demo into the server running on the machine dieppe and ask it to
redirect all URL containing AWS to the server running on machine omsk on port 1235.
When the Hotplug module is stopped, you must unregister it:
Response := AWS.Client.Hotplug.Unregister
(Name => "Hotplug_Module_Demo",
Password => "my_password",
Server => "http://dieppe:2222",
Regexp => ".*AWS.*");
Here we ask to unregister Hotplug_Module_Demo from server dieppe. As for the registration process a proper
password must be specified, see Hotplug module - server activation.
A complete example can be found in the demos directory. Look for main.adb and hotplug.adb.
This protocol is obsolescent, it is hightly recommended to use the WebSockets now. See WebSockets.
Server Push is a feature that let the Web Server send continuously data to clients Web Browser or client applications.
The client does not have to reload at periodic time (which is what is called client pull) to have the data updated, each
time the server send a piece of data it gets displayed on the client.
To build a push server you need to build an instance of the AWS.Server.Push package. This package takes a set of
formal parameters. Here are the step-by-step instructions to build a Push Server:
The data to be sent
First you must create a type that will contains the data to be sent to clients browser except if it is a standard Ada
type. See Client_Output_Type formal parameter.
The data that will be streamed
This is the representation of the data that will be sent to clients browser. This will be either a String for Web
pages or Stream_Element_Array for binary data like pictures. See Stream_Output_Type formal parameter.
The context
It is often nice to be able to configure each client with different parameters if needed. This can be achieved
with the Context data type that will be passed as parameter of the conversion function described below. See
Client_Environment formal parameter.
Provides a function to convert from the data type to be sent to the data that will be streamed.
This is a function that will transform the data described on point 1 above to the form described on point 2 above.
See To_Stream_Output formal parameter.
Build the Push Server
To do so you just need to instantiate AWS.Server.Push with the above declarations.
With AWS is is possible to take out a socket from the server and give it back later. This feature must be used carefully
but it gives a lot of flexibility. As the socket is taken away, the connection line (or slot) is released, AWS can then use
it to handle other requests.
This can be used to better support heavy loaded servers when some requests need a long time to complete. Long time
here means longer than most of the other requests which should be mostly interractives for a Web server. Of course in
such a case a keep-alive connection is kept open.
The usage in such a case is to take out the socket and put it in a waiting line. This releases the connection for the
server. When the data to prepare the answer is ready you give back the socket to the server.
Take a socket from the server
This first step is done form the callback function. A user instead of replying immediatly decides to take away
the socket from the server. The first step is to record the connection socket socket by calling AWS.Status.Socket.
The second step is to tell the server to not release this socket by returning AWS.Response.Socket_Taken from the
callback function. At this point the server will continue to serve other clients.
Note that this feature is used by the server push implementation, see Server Push.
Give back the socket to the server
Calling AWS.Sever.Give_Back_Socket will register the socket for reuse. This socket will be placed into a spool,
next time the server will check for incoming requests it will be picked up.
It is possible to have the server activity logged into the file <progname>-Y-M-D.log. To activate the logging
you must call the AWS.Server.Log.Start, and it is possible to stop logging by calling AWS.Server.Log.Stop. Note that
AWS.Server.Log.Start have a parameter named Auto_Flush to control output buffering. This parameter is False by
default. If set to True, the log file will be automatically flushed after each data. If the server logging is not buffered,
i.e. Auto_Flush is False, the log can still be flushed by calling the AWS.Server.Log.Flush routine. See AWS.Log for
more information especially about the way rotating logs can be setup. Using this feature it is possible to have automatic
split of the log file each day, each month or at every run. See AWS.Log spec. This is very useful to avoid having very
big log files.
The log format depend on Log_Extended_Fields configuration parameter. If this parameter is empty, the HTTP log
would have fixed apache compartible format:
<client IP> - <auth name> - [<date and time>] "<request>" <status code> <size>
For example:
If the extended fields list is not empty, the log file format would have user defined fields set:
#Version: 1.0
#Date: 2006-01-09 00:00:01
#Fields: date time c-ip cs-method cs-uri cs-version sc-status sc-bytes
2006-01-09 00:34:23 100.99.12.1 GET /foo/bar.html HTTP/1.1 200 30
It is not much difficult to use a secure server (HTTPS) than a standard one. Here we describe only what is specific to
an HTTPS server.
Before going further you must check that AWS has been configured with SSL support. See Building. You must also
have installed the OpenSSL or GNUTLS libraries on your system. If this is done, you can continue reading this section.
3.14.1 Initialization
A server is configured as using the HTTPS protocol at the time it is started. The only thing to do is to set the Starts
Security parameter to True. This will start a server and activate the SSL layer by default. A secure server must use a
valid certificate, the default one is cert.pem. This certificate has been created by the OpenSSL or GNUTLS tool and is
valid until year 2008. Yet, this certificate has not been signed. To build a secure server users can rely on, you must
have a valid certificate signed by one of the Certificate Authorities.
The certificate to be used must be specified before starting the secure server with AWS.Server.Set_Security:
With a key and certificate files:
AWS.Server.Set_Security
(WS,
Key_Filename => "server.key",
Certificate_Filename => "server.crt");
First note that it is not necessary to use such callback to verify the certificate validity, see Using a Certificate Authority.
This callback will receive the client certificate as sent during SSL handshake between the server and the client. The
certificate information can be checked for logging purpose or to impose some restriction. Generally this callback
should return the value from AWS.Net.SSL.Certificate.Verified, see AWS.Net.SSL.Certificate.
The Verified status of the certificate is the one that has been issued by the SSL implementation during certificate
verification and can generally be trusted.
The goal here is not to replace the OpenSSL documentation but just to present one way to create a self signed certificate
for an HTTPS test server. Note that GNUTLS offers similar tools to generate certificates.
Generate a RSA key:
Filename must point to any file, this is used to initialized the random seed.
Generate the certificate:
$ openssl req -new -x509 -days 730 -key aws-server.key -out aws-server.cert
A this point you can use aws.pem with your server or the separate server.key and server.crt files.
It is also possible to sign the servers key. In this case the key wont be in plain text but will require to setup a password
on the server code for the key to be decoded. See routine Set_Password_Callback in AWS.Net.SSL.Certificate.
Generate a crypted RSA key:
A certificate can also be used on a Web browser and passed to the server to have a strong client authentication. A client
certificate must be PKCS12. The steps to generate such certificate are:
Generate a RSA key:
Filename must point to any file, this is used to initialized the random seed.
Generate the certificate:
$ openssl req -new -x509 -days 730 -key aws-client.key -out aws-client.cert
In this section we will use a Certificate Authority to signed the server certificates and the client certificates. Using
this method is required if the server must ensure that only clients with a valid certificate will be able to connect to the
server. The server will verify that the client certificate received has been signed by a known Certificate Authority.
Note that these checks are happening during the SSL handshake, so before the users callback.
For this to work the following configuration options must be used:
Exchange_Certificate To request that the client certificate be sent.
Trusted_CA The file containing the certificate of the Certificate Authority we trust. The CA which has signed the
clients certificate.
Certificate_Required If no certificate has been received from the client the server will reject the connection. If this
is not set, we can still validate the clients certificate in the verify callback, see Verify callback and for example
log the connecting users.
First the Certificate Authority must be initialized on the computer. This is heavily dependent on the actual Operating
System used, describing this part is out of scope of this document.
On GNU/Debian the default setup (see default_ca in /etc/ssl/openssl.cnf) can be used to create a demo
Certificate Authority locally to test this feature:
$ mkdir demoCA
$ mkdir demoCA/newcerts
$ touch demoCA/index.txt
$ echo ABCC > demoCA/serial
$ echo 01 > demoCA/crlnumber
During this step youll be asked for information about the CA (Country, State or Province, Organization Name...).
Create the CA certificate:
$ openssl x509 -req -days 365 -in private-ca.csr -signkey private-ca.key -out private-
,ca.crt
This certificate will be used by AWS as the trusted CA, see Configuration options.
During this step youll be asked for information about the server (Country, State or Province, Common Name...). Note
that the Organization Name here must match the one from the CA and the Common Name should be the server fully
qualified domain name.
Create the server certificate, signed it with our CA:
During this step youll be asked for information about the client (Country, State or Province, Common Name...). Note
that the Organization Name here must match the one from the CA and the Common Name should be the clients one.
Create the client certificate, signed it with our CA:
$ openssl pkcs12 -export -clcerts -in aws-client.crt -inkey aws-client.key -out aws-
,client.p12
A Certificate Revocation List is used to revoke some clients certificates. Those clients wont be able to connect to the
secure server anymore. Using the CA created above the following commands can be used to create a CRL.
Revoke the certificate:
The file crl.pem is the one to install on the server using the CRL_File configuration option, see Configuration
options. This file contains the list of all revoked certificates for the corresponding CA.
This table summarize the security level achieved with different settings of the security oriented configuration parame-
ters.
3.14.6 Protocol
There are different security options, either SSLv2, SSLv3 or TLSv1. SSLv2 and SSLv3 are supported by most if not all
Web browsers. These are the default protocol used by AWS.
TLSv1 is not supported at this point.
When AWS detects an internal problem, it calls a specific handler. This handler can be used to log the error, send an
alert message or build the answer to be sent back to the clients browser.
Here is the spec for this handler:
AUTH_MODE
The authorization mode (Either NONE, BASIC or DIGEST).
EXCEPTION
Exception information with traceback if activated.
HTTP_VERSION
Either HTTP/1.0 or HTTP/1.1
METHOD
The request method (Either GET, HEAD, POST or PUT)
PAYLOAD
The full XML payload for SOAP request.
PEERNAME
The IP address of the client
SOAP_ACTION
Either True or False. Set to True for a SOAP request.
URI
The complete URI
For more information see AWS.Server and AWS.Exceptions.
To ease AWS applications debugging it is possible to log all data sent/received to/from the sockets. For this you need
to call the AWS.Net.Log.Start routine by passing a write procedure callback. You have to create such procedure or use
one read-to-use provided in AWS.Net.Log.Callbacks package.
For more information see AWS.Net.Log and AWS.Net.Log.Callbacks.
AWS is not only a server it also implement the HTTP and HTTPS protocol from the client side. For example with AWS
it is possible to get a Web page content using the AWS.Client API, see AWS.Client.
It also support client Keep-Alive connections. It is then possible to request many URI from the same server using the
same connection (i.e. the same sockets).
AWS client API also support proxy, proxy authentication and Web server authentication. Only basic (and not digest)
authentication is supported at this time.
Lets say that you want to retrieve the contrib.html Web page from Pascal Obrys homepage which is http://perso.
wanadoo.fr/pascal.obry. The code to do so is:
Data := Client.Get
(URL => "http://perso.wanadoo.fr/pascal.obry/contrib.html");
From there you can ask for the results content type:
If the content is some kind of binary data (executable, PNG image, Zip archive...), then it is possible to write the result
to a file for example. Look at the agent program in the demos directory.
If the Web page is protected and you must pass the request through an authenticating proxy, the call will becomes:
Data := Client.Get
(URL => "http://www.mydomain.net/protected/index.html"
User => "me",
Pwd => "mypwd",
Proxy => "192.168.67.1",
Proxy_User => "puser",
Proxy_Pwd => "ppwd");
The client upload protocol is implemented. Using AWS.Client.Upload it is possible to send a file to a server which
support the file upload protocol.
FOUR
Here you will find a description of high level services. These services are ready to use with AWS and can be used
together with users callbacks.
Refer to the Ada spec for a complete API and usage description.
This service will help building a Web directory browser. It has a lot of options to sort directory entries and is based
on the templates interface AWS.Templates. This means that you can use the default directory template or provide your
own.
see AWS.Services.Directory for complete spec and services descriptions.
4.2 Dispatchers
In many AWS applications it is needed to check the URI to give the right answer. This means that part of the application
is a big if/elsif procedure. Also, in standard callback it is not possible to have user data. Both of these restrictions are
addressed with the Dispatchers facilities.
Working with a dispatcher is quite easy:
Create a new dispatcher by inheriting from the service you want to build.
Register a set of action based on rules (strings, regular expressions depending on the service)
This is a wrapper around the standard callback procedure. It is needed to mix dispatcher based callback and access
to procedure callback. Note that it is not in the AWS.Services.Dispatchers hierarchy but in AWS.Dispatchers.Callback
because this is a basic service needed for the server itself. It is referenced here for documentation purpose but an AWS
server can be built with using it.
see AWS.Dispatchers.Callback for complete spec description.
This is a dispatcher based on the request method. A different callback procedure can be registered for the supported
request methods: GET, POST, PUT, HEAD.
see AWS.Services.Dispatchers.Method for complete spec description.
37
AWS Documentation, Release 18.0
This is a dispatcher based on the request resource. A different callback procedure can be registered for specific
resources. The resource is described either by its full name (string) or a regular expression.
see AWS.Services.Dispatchers.URI for complete spec description.
This is a dispatcher based on the host name. A different callback procedure can be registered for specific host. This is
also known as virtual hosting.
The same computer can be registered into the DNS with different names. So all names point to the same machine. But
in fact you want each name to be seen as a different Web server. This is called virtual hosting. This service will just
do that, call different callback procedures or redirect to some machine/port based on the host name in the clients
request.
see AWS.Services.Dispatchers.Virtual_Host for complete spec description.
This is a dispatcher that calls a users callback and if the resource requested is not found (i.e. the users callback returns
status code 404) it checks if this resource is known as a transient page. see Transient Pages.
A timer dispatcher can be used to call different callback routines depending on the current date and time. Such
dispatcher is composed of a set of Period activated. When the current date and time is inside a Period the corresponding
callback is called. A Period can eventually be repeated. Here are the different kind of Period supported by AWS:
Once A unique period in time. The boundaries are fully described using a year, month, day, hour, minute and second.
Yearly A period that repeats each year. The boundaries are described using a month, day, hour, minute and second.
Monthly A period that repeats each month. The boundaries are described using a day, hour, minute and second.
Weekly A period that repeats each week. The boundaries are described using a day name, hour, minute and second.
Daily A period that repeats each day. The boundaries are described using an hour, minute and second.
Hourly A period that repeats each hour. The boundaries are described using a minute and second.
Minutely A period that repeats each minute. The boundaries are described using a second.
A dispatcher that can be used to chain two dispatchers. The response of the first dispatcher is returned except if it is a
404 (Not Found) error. In this case, the response of the second dispatcher is returned.
AWS provides also a SOAP specific dispatcher. This is a way to automatically route HTTP requests or SOAP requests
to different callback routines.
see SOAP helpers for more information. see SOAP.Dispatchers.Callback for complete spec description.
This service is a ready to use static page server callback. Using it is possible to build a simple static page server, as
simple as:
with AWS.Server;
with AWS.Services.Page_Server;
procedure WPS is
WS : AWS.Server.HTTP;
begin
AWS.Server.Start
(WS, "Simple Page Server demo",
Port => 8080,
Callback => AWS.Services.Page_Server.Callback'Access,
Max_Connection => 5);
AWS.Server.Wait (AWS.Server.Q_Key_Pressed);
AWS.Server.Shutdown (WS);
end WPS;
Build this program and launch it, it will server HTML pages and images in the current directory.
It is possible to activate the directory browsing facility of this simple page server. This is not activated by default. This
feature is based on the directory browsing service see Directory browser.
Note that this service uses two template files:
aws_directory.thtml The template page used for directory browsing. See see AWS.Services.Directory for a full de-
scription of this template usage.
404.thtml The Web page returned if the requested page is not found. This is a template with a single tag variable
named PAGE. It will be replaced by the ressource which was not found.
Note that on Microsoft IE this page will be displayed only if the total page size is bigger than 512 bytes or it
includes at least one image.
see AWS.Services.Page_Server for a complete spec description.
A transient page is a resource that has a certain life time on the server. After this time the resource will be released
and will not be accessible anymore.
Sometimes you want to reference, in a Web page, a resource that is built in memory by the server. This resource can
be requested by the client (by clicking on the corresponding link) or not, in both cases the page must be released after
a certain amount of time to free the associated memory.
This is exactly what the transient pages high level service do automatically. Each transient page must be regis-
tered into the service, a specific routine named Get_URI can be used to create a unique URI on this server. see
AWS.Services.Transient_Pages.
A transient pages dispatcher can be used to build a transient pages aware server. see Transient pages dispatcher.
It not not very convenient to send back a Web page with a large table. In such a case it is better to split the table in
chunks (20 lines or so) and to send only the first page. This page reference the next pages and can also contains an
index of the pages.
The AWSs split page feature can automatically do that for you. Given template Translate_Table or Translate_Set and
the max line per page it returns the first page and create a set of transient pages for all other pages. A set of template
tags are used to reference the previous and next page and also to build the page index.
There is different ways to split a set of pages and ready-to-use splitters are available:
Alpha Split in (at most) 28 pages, one for empty fields, one for all fields that start with a digit, and one for each
different initial letter. see AWS.Services.Split_Pages.Alpha.
Alpha.Bounded Same as the alpha splitter, but pages larger than a Max_Per_Page value are further split-
ted. A secondary index is generated that gives the various pages for a given letter. see
AWS.Services.Split_Pages.Alpha.Bounded.
Uniform Split in pages of length Max_Per_Page (except the last one). This corresponds to the default service in
Split_Pages package. see AWS.Services.Split_Pages.Uniform.
Uniform.Alpha Same as the uniform splitter, but builds in addition an alphabetical secondary index from a key field.
see AWS.Services.Split_Pages.Uniform.Alpha.
Uniform.Overlapping Same as the uniform splitter, but pages (except the first one) repeat Overlap lines from the
previous page in addition to the Max_Per_Page lines. see AWS.Services.Split_Pages.Uniform.Overlapping.
Using the spliter abstract interface it is possible to build a customized splitter algorithm. see AWS.Services.Split_Pages.
A server that need to handle lot of large downloads can run out of connection to answer the standard Web pages. A
solution is to increase the number of simultaneous connections, but this is not really efficient as a task is created for
each connection and does not ensure that all the connections will be used for the downloads anyway.
The download manager can be used for that, and provides the following feature:
use a single task for all downloads
can be configured to limit the number of simultaneous connections
downloads past this limit are queued
send messages to the client with the position in the waiting line
send messages to the client when the download is about to start
The server must be configured to use dispatchers (standard callbacks are not supported, note that it is possible to create
a dispatcher for standard callbacks. see AWS.Dispatchers.Callback).
To start the download manager you need to pass the main server dispatcher object. The start routine will return a new
dispatcher, linked with the download server specific dispatcher, that must be used to start the standard Web server. See
comment in see AWS.Services.Download.
To queue a download request in the download manager you just need to create a stream object (can be any kind of
stream, see AWS.Resources.Streams.*) for the resource to download.
The download manager needs two templates files:
aws_download_manager_waiting.thtml This template is used for sending a message to the client when the request is
on the waiting line. The tags defined in this template file are:
NAME the name of the resource to download (the filename), this is the default filename used for the client side
save dialog.
RES_URI the URI used to access the resource.
POSITION the position in the waiting line (not counting the current served clients).
aws_download_manager_start.thtml This template is used for sending a message to the client when the download is
about to start (the request is out of the waiting line). The tags defined in this template file are:
NAME as above
RES_URI as above
It is important to note that those templates must be reloaded periodically. The best way to do that in the context of an
HTML document is to use a meta-tag. For example to refresh the page every two seconds:
<meta http-equiv="refresh" content="2">
aws_download_manager_start.thtml
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="refresh" content="2">
<title>Download Manager - waiting</title>
</head>
<body>
<p>Waiting for downloading @_NAME_@
<p>The download will start in a moment
</body>
</html>
AWS provides some components to help creating nice looking Web interfaces. It is possible to browse those Web
Elements using the web_elements demo. Just launch this Web application from the demos directory and turn your
Web browser to http://localhost:2400.
4.7.1 Installation
4.7.2 Ajax
First of all, Ajax stand for Asynchronous JavaScript language and XML, and is not well defined at the moment. Ajax
is on one side able to send HTTP requests to the Web server and on the other side able to manipulate directly the Web
browsers DOM tree. On the DOM it can add, remove or replace XML nodes. So, it is possible to change the content
of a Web page without reloading it from the server.
Most importantly, Ajax changes the way Web applications are thought from page based to event based.
As implemented into AWS, Ajax support comes as a set of JavaScript templates. Using those templates there is no need
to know JavaScript (except for the JavaScript event names) and it makes Ajax programming lot easier. Two actions
are provided, one for replacing another for clearing part of the web page content.
Steps to do Ajax
This section describes the AWS/Ajax support where the answer from the server is an HTML fragment. This basic
support is designed to be used for migration of a Web server to Ajax. For new applications, it is worth considering
using the XML based Ajax support, see XML based Ajax.
Lets have a very simple example:
The AWS/Ajax runtime support
@@INCLUDE@@@ aws.tjs
The AWS/Ajax
Basically it places an onclick attribute (the event) in the HTML <input> identified as clickme (the action) above.
Here is what happen when the button is clicked:
send the /onclick$clickme HTTP request to the server
asynchronously wait for the answer, when received place the message body into the <div> placeholder.
On the server side the code would look like this:
So when the button is clicked the string you click me! will replace the ... result here ... string of the place holder
div above.
This is a simple and very limited example as there is no parameter passed to the HTTP request. In real Web applications
it is necessary to send a context with the request. This can be either the value of other widgets or all values of widgets
form.
References to widgets or forms can be passed to the aws_action_replace.tjs template starting with the 5th
parameter:
...
or:
Note that the onclick event is only one of the possible JavaScript event on a button. It is possible to used any supported
event, for example on an HTML <select> widget it is common to map the action to the onchange event.
AWS also provides support for clearing an area or a widget content (like an input):
This simple action adds the onclick event to the clear button to erase the content of the field widget.
In many cases youll like to update and/or clear multiple areas in your Web interface. With the templates above only a
single action is possible. AWS provides support for XML based answers. In this XML documents it is possible to:
replace an area with a new content:
clear an area:
<clear id="item_id"/>
check a checkbox:
clear a checkbox:
<get url="http://thishost/action">
<parameters value="name=Ajax"/>
<field id="input1"/>
</get>
http://thishost/action?name=Ajax&input1=<val_input1>
Where val_input1 is the current value of the input1 input widget. The result must be an XML/Ajax document
that will be parsed.
make a list sortable:
<make_sortable>
<list id="firstlist"/>
<list id="secondlist"/>
</make_sortable>
Here firstlist and secondlist are id of UL elements. It is possible to specified as many list id as needed. A drag
and drop is then possible for all elements in those lists. It is then possible to reference such list by passing the
list id as a field to the template. Items on those list will be serialized and passed to the AWS callback. Note that
for the serialization to work properly, each LI elements must be given the id of the list and then the value we
want to pass:
<ul id="firstlist">
<li id="firstlist_red">Red</li>
<li id="firstlist_green">Green</li>
<li id="firstlist_blue">Blue</li>
</ul>
The serialization will send each value on this list using a multi-valued parameter named firstlist[]:
http://server?firstlist[]=red&firstlist[]=green&firstlist[]=blue
<destroy_sortable>
<list id="firstlist"/>
<list id="secondlist"/>
</destroy_sortable>
<location url="http://thishost/go_there"/>
<refresh/>
Refresh the current page as if the Web Browser refresh button was pressed.
add a CSS style to a given node:
<apply_style id="node_id">
<attribute id="display" value="none"/>
</apply_style>
Add the CSS style display:none to the node_id element. It is possible to specify multiple attributes if needed.
make an entry disabled or enabled:
reset a form:
<reset id="form_id"/>
To register an Ajax action to a specific tag id a macro can be used. It is named JS_ACTION and defined in ajax_api.
tjs. The usage is similar to what is described in the previous section (see Basic Ajax support) except that in this case
we use a macron instead of an include file and we do not have to pass the placeholder.
Lets revisit the first example above to use the XML Ajax support.
The AWS/Ajax runtime support:
@@INCLUDE@@@ aws.tjs
@@INCLUDE@@@ ajax_api.tjs
Must be included at least once during an application life-time. It gives access to the JS_ACTION macro.
The widget: a button:
The AWS/Ajax:
@_JS_ACTION(onclick, clickme)_@
Basically it places an onclick attribute (the event) in the HTML <input> identified as clickme (the action) above.
Here is what happen when the button is clicked:
send the /onclick$clickme HTTP request to the server
asynchronously wait for the XML answer, when received parse the answer and perform the actions ac-
cording to the XML content.
To set the placeholder with new text, the XML document returned by the server must be:
If we want also to clear the input field named field and to select the radio button named radio1 we must return:
This is by far the most flexible solution as it is possible to return, from the server, a structured answer.
A final comment, if the text returned by the server to replace a specific area is an HTML fragment, the content must be
placed into a CDATA tag:
Advanced Ajax
Finally, if this is not enough because you need to use some specific JavaScript code, AWS provides a macro named
BIND_JS to add an event to a specific widget, the action being the name of a JavaScript routine.
This macro together with the aws_func_replace.tjs, aws_func_clear.tjs templates and the
JS_ACTION macro can be used to chain multiple actions. Those templates are the function body used by the corre-
sponding templates aws_action_replace.tjs, aws_action_clear.tjs.
Let say you want to clear a widget, change the content of another one and calling one of your specific JavaScript
routine when clicking on a button. It is not possible to have mutiple onclick events on the same widget, the solution is
the following:
Create the JavaScript routine to do the job
For this in the the body of the clear_replace() JavaScript routine we place:
function clear_replace()
{
@@INCLUDE@@ aws_func_replace.tjs (clickme placeholder 4=>field)
@@INCLUDE@@ aws_func_clear.tjs (area)
call_this_routine();
}
Furthermore, it is possible to pass (as the parameter number 20) a routine to call after a specific action to all templates
and to the JS_ACTION macro. This is another way to chain multiple actions for a single event.
Note that all AWS/Ajax templates and the ajax_api.tjs file have a set of comments at the start explaining in details
the usage of each parameter.
The AWS.Services.Web_Block hierarchy contains an API useful for keeping context on Web pages. It has been designed
to be able to split a Web application into a set of independent blocks that can be put together in the same Web page.
The context is then useful as it is passed and known by each individual block. Note that this is different than the
session as a session is global to the current Web browser whereas the context can be different for each individual web
pages opened.
Instead of parsing a whole page using AWS.Templates API the web blocks are registered independently using
AWS.Services.Web_Block.Registry. The block is registered together with its templates and a callback to use to get
users data for this specific block with the given context.
So using this API, instead of having a set of callbacks returning an AWS.Response.Data and where the final rendering
is to be done by the client code, we have a set of callbacks that returns a Translate_Set. The client just have to fill the
set with the data corresponding to the actual request and possibly using the context. The final rendering is done by the
provided services in Web_Block.Registry.
Note that all Web pages must also be registered into the registry to ensure that the context identification is properly
kept. The context identification is injected into the Web pages transparently for the end-user when using Ajax.
Lets have a simple example, a page containing a single block with a tag (@_COUNTER_@) which is incremented
by one each time it is used. The code can be found in demos/web_block.
First create the following HTML fragment and place it into counter.thtml:
<p>@_COUNTER_@</p>
Then create the main page and place it into page.thtml. The important part is the @_CTX_WB_@ tag which is
passed to the link. This tag is the context identifier, it must be passed to each request. Note that this is automatically
done when using the Ajax framework (see Web Block and Ajax):
<html>
<head>
<title>Main Page</title>
</head>
<body>
<p>This is the main page, bellow is a simple counter</p>
<p>@_COUNTER_@</p>
<a href="/?CTX_WB=@_CTX_WB_@>Next</a>
</body>
</html>
with AWS.Response;
with AWS.Status;
with AWS.Templates;
with AWS.Services.Web_Block.Context;
package Web_Callbacks is
use AWS;
use AWS.Services;
procedure Counter
(Request : in Status.Data;
Context : not null access Web_Block.Context.Object;
Translations : in out Templates.Translate_Set);
-- The callback handling the counter web block
end Web_Callbacks;
Last part is to actually implement the Counter callback. Here is a possible implementation making use of the context
to keep the counter state:
with AWS.Utils;
with AWS.Messages;
with AWS.MIME;
with AWS.Services.Web_Block.Registry;
-------------
-- Counter --
-------------
procedure Counter
(Request : in Status.Data;
Context : not null access Web_Block.Context.Object;
Translations : in out Templates.Translate_Set)
is
N : Natural := 0;
begin
if Context.Exist ("N") then
N := Natural'Value (Context.Get_Value ("N"));
end if;
N := N + 1;
Context.Set_Value ("N", Utils.Image (N));
Templates.Insert
(Translations, AWS.Templates.Assoc ("COUNTER", N));
end Counter;
----------
-- Main --
----------
end Web_Callbacks;
with Ada.Text_IO;
with AWS.Server;
with AWS.Services.Web_Block.Registry;
with Web_Callbacks;
procedure Web_Block is
use Ada;
use AWS;
use AWS.Services;
HTTP : AWS.Server.HTTP;
begin
-- First we register the main page and the counter block
Services.Web_Block.Registry.Register
("COUNTER", "counter.thtml",
Web_Callbacks.Counter'Access, Context_Required => True);
Server.Wait (Server.Q_Key_Pressed);
Server.Shutdown (HTTP);
end Web_Block;
Compile and run the server. Then connect to the server and click on next. The counter will be incremented by one
each time.
The Web Block framework has really been designed to be used with Ajax. It is the only way to gain the full power of
the Web Block framework.
For the complete code, see demos/web_block_ajax.
When using Ajax it is not needed to explicitly pass the context identification to every link. This is done automatically
by the framework. So the main page will look like this:
@@INCLUDE@@ ../../web_elements/javascripts/ajax_api.tjs
<html>
<head>
<title>Main Page</title>
@@INCLUDE@@ ../../web_elements/javascripts/aws.tjs
</head>
<body>
<p>This is the main page, bellow is a simple counter</p>
@_WIDGET_COUNTER_@
</body>
</html>
Services.Web_Block.Registry.Register
("WIDGET_COUNTER", "widget_counter.thtml",
Web_Callbacks.Widget_Counter'Access);
Services.Web_Block.Registry.Register
("/onclick$next", "r_widget_counter.txml",
Web_Callbacks.Onclick_Next'Access,
Content_Type => MIME.Text_XML,
Context_Required => True);
The next Ajax button is using an XML based response which is defined in r_widget_counter.txml:
<?xml version="1.0" encoding="UTF-8" ?>
<response>
<replace id="counter">@_COUNTER_@</replace>
</response>
The Widget_Counter callbacks just have to set the COUNTER tag variable to the corresponding value. This is used to
display the block. The Ajax callback Onclick_Next has to increment the counter and set the COUNTER tag variable, a
simple implementation is:
procedure Onclick_Next
(Request : in Status.Data;
Context : not null access Web_Block.Context.Object;
Translations : in out Templates.Translate_Set)
is
N : Natural := 0;
begin
if Context.Exist ("N") then
N := Natural'Value (Context.Get_Value ("N"));
end if;
N := N + 1;
Templates.Insert
(Translations, Templates.Assoc ("COUNTER", N));
end Onclick_Next;
The framework will then call Onclick_Next when pressing the Next button. This routine increments N by one sending
back a response based on r_widget_counter.txml. Finally, the client browser will parse this XML response and do the
corresponding actions.
<body>
<p>This is the main page, bellow is a simple counter</p>
@_LAZY_WIDGET_COUNTER_@
</body>
</html>
We need also modify the standard templates.tads as distributed with the Templates_Parser. Here is the interest-
ing part:
@@SET@@ PACKAGE = WBlocks
...
with AWS.MIME;
with AWS.Services.Web_Block.Registry;
with Web_Callbacks;
@@TABLE@@
with @_PACKAGE_@.@_CAPITALIZE:REPLACE_ALL(\\./_):BASENAME_@;
@@END_TABLE@@
use AWS;
--------------
-- Register --
--------------
procedure Register is
use AWS.Services;
begin
-- Register blocks
@@TABLE@@
@@IF@@ @_UPPER:SLICE(1..5):VARIABLE_LIST_@ = "LAZY_"
Web_Block.Registry.Register
("@_VARIABLE_LIST_@",
"@_LOWER:REPLACE_ALL(LAZY_/):[email protected]",
Web_Callbacks.@_CAPITALIZE:REPLACE_ALL(LAZY_/):VARIABLE_LIST_@'Access);
@@END_IF@@
@@END_TABLE@@
-- Register Ajax
@@TABLE@@
@@TABLE@@
@@IF@@ not @_IS_EMPTY:AJAX_EVENT_@
Services.Web_Block.Registry.Register
("/@_AJAX_EVENT_@$@_AJAX_ACTION_@",
@[email protected]_@_CAPITALIZE:REPLACE_ALL(\\./_):[email protected],
Web_Callbacks.@_CAPITALIZE:AJAX_EVENT_@@_UNDERSCORE_@@_CAPITALIZE:AJAX_
,ACTION_@'Access,
end Register;
end Lazy;
end @_PACKAGE_@;
Basically this is to write a register call for every templates tag starting with LAZY_. The second section is to write a
register call for every Ajax event. All callbacks are expected to be in a package named Web_Callbacks. It is of course
possible to change this template to reference callbacks for blocks and Ajax in separate packages. The use of a template
here is very flexible.
Now lets parse the application HTML and XML templates and create the corresponding Ada specs and register calls:
Look at the generated code below, it properly register the Widget_Counter callback to be used for rendering
LAZY_WIDGET_COUNTER using the widget_counter.thtml. So we have a tight coupling between the code
and the template file. If the tag is renamed in the template file the application will not compile anymore. The same is
true for Ajax callbacks, every Ajax action put in a template file needs a corresponding callback in Ada. This greatly
helps keeping the application code synchronized:
procedure Register is
use AWS.Services;
begin
Web_Block.Registry.Register
("LAZY_WIDGET_COUNTER",
"widget_counter.thtml",
Web_Callbacks.Widget_Counter'Access);
Services.Web_Block.Registry.Register
("/onclick$next",
WBlocks.R_Widget_Counter.Template,
Web_Callbacks.Onclick_Next'Access,
Content_Type => MIME.Text_XML,
Context_Required => True);
end Register;
In the main, it is just now required to register the Web pages and to call the generated Register procedure:
WBlocks.Lazy.Register;
Moreover, an Ada spec containing reference for the tag names is generated for every HTML and XML template file.
All tags can be referenced using those specs, it is not needed to use string literal in the application. Again, this ensures
that a tag which is renamed or deleted is detected at compilation time. For example the Widget_Counter callback can
be rewritten as follow:
procedure Widget_Counter
(Request : in Status.Data;
Context : not null access Web_Block.Context.Object;
Translations : in out Templates.Translate_Set)
is
N : Natural := 0;
begin
if Context.Exist ("N") then
N := Natural'Value (Context.Get_Value ("N"));
end if;
Templates.Insert
(Translations, Templates.Assoc (WBlocks.Widget_Counter.COUNTER, N));
end Widget_Counter;
When building an Ajax Web applications it is required to give ids to web elements to be able to reference them. It is
also quite common to use CSS to give such and such item a specific style. After some time it is quite difficult to keep
track of all those ids. Are they all used ? Dont we reference an id that does not exist anymore ?
webxref has been designed to help finding such problems.
The files kinds handled are:
.css, .tcss A CSS (or template CSS file). Ids and classes inside are recorded as CSS definitions.
.xml, .html, .thtml A meta-language document. Ids and classes inside are recorded as referencing a CSS definition
and meta-language definition.
.txml An Ajax response file. Ids declared inside are recorded as referencing a meta-language definition.
The features are:
cross-references By default webxref output all the references to ids and classes.
finding unused items Output the ids/classes that are defined but not used. For example an id declared in a CSS but
never referenced into an HTML document or an HTML id never referenced in an Ajax response file .txml
document.
finding undeclared items Output ids/classes that are referenced but never defined. This is for example an id inside an
Ajax response file which is never defined into an HTML document.
enforcing a naming scheme for ids and classes It can enforce a specific prefix for ids and classes. The id prefix can
be based on the filename (using filenames first character and all character before an underscore). This make it
less likely to find the same id on multiple files.
Note that all references are in a format recognized by tools like GPS and Emacs. It is then possible to navigate inside
them easily.
All webxref options are listed using the -h option.
4.10 WebSockets
WebSockets are part of HTML5, the API is being standardized by the W3C and the protocol by the IETF (see RFC-
6455). It is a bidirectional and full-duplex communication channel between the client and the server. Most Web
Browsers are now supporting (at least part) of the WebSocket recommendation. On the client side, the WebSockets
are programmed in JavaScript as done for Ajax for example.
A WebSocket is always opened at the request of a client. This can be done on the same port as the main HTTP
protocol. This is possible because the initial handshake to open a WebSocket is done in pure HTTP protocol. Past this
initial handshake the socket is switching protocol from HTTP to the one called WebSocket protocol.
It is not needed to know the protocol to use the WebSockets, AWS comes with some high level services on the server
side and also on the client side.
The WebSocket is created on the client side. As there is some differences between Web browsers, AWS provides a
wrapper routine to create a WebSocket:
ws = AWS.WebSocket.open('ws://localhost:8080/echo');
This basically create a WebSocket and contact the local server using port 8080.
This method is declared into aws.tjs which must be included:
@@INCLUDE@@@ aws.tjs
message_id The id of the HTML element which will be used to display the incoming messages. This is most of the
time the id of a p or div HTML element.
status_id The id of the HTML element which will be used to display the status and error messages. For example
when a connection is closed.
When those default callbacks are not what is needed it is always possible to redefine them:
The first step is to setup the server to dispatch the incoming messages to the proper WebSocket object. For this one
needs to inherit from AWS.Net.WebSocket.Object and redefine at least two methods Create and On_Message:
Create This is the constructor that will be used by the server to handle some WebSockets. This constructor will be
associated to some URI, see below:
function Create
(Socket : Socket_Access;
Request : AWS.Status.Data) return Object'Class;
The default constructor creates a WebSocket of type AWS.Net.WebSocket.Object. It is not possible to receive
events (close, open, error) using such object it is only possible to send messages to the clients.
Here is an example on a custom socket:
function Create
(Socket : Socket_Access;
Request : AWS.Status.Data) return AWS.Net.WebSocket.Object'Class
is
-- Note the call to the other version of Create*
return MySocket'
(AWS.Net.WebSocket.Object
(AWS.Net.WebSocket.Create (Socket, Request)) with null record);
end Create;
procedure On_Open
(Socket : in out Object; Message : String) is null;
On_Message This is the callback that will be called for every message sent by the client on the corresponding Web-
Socket:
procedure On_Message
(Socket : in out Object; Message : String);
The first parameter is the WebSocket itself, it is possible to send a message directly by using the associated Send
method. Note that the default implementation supports the XML based Ajax actions. See see XML based Ajax
and can be used to redirect simple message to an HTML widget given its id.
On_Close This is the callback that will be called when the WebSocket is closed:
procedure On_Close
(Socket : in out Object; Message : String) is null;
On_Error This is the callback that will be called when an error occurs on the WebSocket:
procedure On_Error
(Socket : in out Object; Message : String) is null;
When this is done, the constructor declared above needs to be registered to handle some WebSocket designated by the
URI. For example to have this WebSocket handling all URI named /echo:
Where CB.Create is the constructor redefined for the new WebSocket class.
The last step is to start the WebSocket server which are needed to handle the incoming messages:
Net.WebSocket.Registry.Control.Start;
At this point all is setup to have AWS supports WebSockets. Sending messages can be done to a single client or by
broadcasting to all clients for a specific URI. To send a message one need to create a Net.WebSocket.Registry.Recipient
object. For example to broadcast a message to all Web clients having opened the /echo WebSocket:
4.10. WebSockets 57
AWS Documentation, Release 18.0
Rcp : Net.WebSocket.Registry.Recipient :=
Net.WebSocket.Registry.Create (URI => "/echo");
As we have seen before, this will send a message to clients which will in turn trigger the onmessage Javascript method.
It is also possible to send a message to clients from a specific origin by using the Origin information:
Rcp : Net.WebSocket.Registry.Recipient :=
Net.WebSocket.Registry.Create (URI => "/echo"; Origin => ".*\\.fr");
The above recipent targets all WebSockets whose URI is /echo and that have been created from a Web page origi-
nating from a Web server running in the .fr domain. Note that URI and the Origin are regular expressions.
The Origin value can be used by a server to handle only WebSockets originating from its own domain. Restricting
the origin of the WebSockets can be done with the WEBSOCKET_ORIGIN config parameter, see WebSocket_Origin.
FIVE
USING SOAP
SOAP can be used to implements Web Services. The SOAP implementation uses AWS HTTP as the transport layer.
SOAP is platforms and languages independent, to ensure a good inter-operability, AWS/SOAP implementation has
been validated through http://validator.soapware.org/, the version number listed on this server corresponds to the AWS
version string (AWS.Version) catenated with the SOAP version string (SOAP.Version).
This SOAP implementation is certainly one with the higher level of abstraction. No need to mess with a serializer, to
know what is a payload or be an XML expert. All the low level stuffs are completely hidden as the SOAP type system
has been binded as much as possible to the Ada type system.
The SOAP type system has been relaxed to be compatible with WSDL based SOAP implementation. In these imple-
mentations, types are generally (as in the Microsoft implementation) not part of the payload and should be taken from
the WSDL (Web Services Description Language). AWS/SOAP is not WSDL compliant at this stage, all such types are
binded into the Ada type system as strings. It is up to the programer to convert such strings to the desired type.
The SOAP client interface is quite simple. Here are the step-by-step instructions to call a SOAP Web Service:
Build the SOAP parameters
As for the SOAP servers, the SOAP parameters are built using a SOAP.Parameters.List object:
declare
Payload : Message.Payload.Object;
begin
Payload := Message.Payload.Build ("Add", Params);
59
AWS Documentation, Release 18.0
In the above example we have called a Web Service whose spec could be described in Ada as follow:
A SOAP server implementation must provides a callback procedure as for standard Web server Callback procedure.
This callback must checks for the SOAP Action URI to handle both standard Web requests and SOAP ones. The
SOAPAction is sent with the HTTP headers and can be retrieved using AWS.Status.SOAPAction.
Here are the step-by-step instructions to be followed in the SOAP callback procedure:
Retrieve the SOAP Payload
The SOAP Payload is the XML message, it contains the procedure name to be called and the associated parame-
ters:
AWS.Status.Payload returns the XML Payload as sent by the SOAP Client. This XML Payload is then parsed
using SOAP.Message.XML.Load_Payload which returns a SOAP.Message.Payload.Object object.
Retrieve the SOAP Parameters
The SOAP procedures parameters:
SOAP.Parameters.List is a structure which holds the SOAP parameters. Each parameter can be retrieved using
a SOAP.Parameters API, SOAP.Parameters. For example to get the parameter named myStruc which is a SOAP
struct:
Another example, to get the parameter named myInt which is a SOAP integer:
declare
Resp : SOAP.Message.Response.Object;
Resp_Params : SOAP.Parameters.List;
begin
Resp := SOAP.Message.Response.From (Payload);
This build a response which is a single integer value named answer with the value My_Int * 2.
Returns the answer back to the client
This last step will encode the response object in XML and will returns it as the body of an HTTP message:
There is two ways to help building the SOAP callbacks. AWS provides a SOAP specific callback, the spec is:
function SOAP_Callback
(SOAPAction : in String;
Payload : in Message.Payload.Object;
Request : in AWS.Status.Data) return AWS.Response.Data;
With both solutions exposed below, AWS retrieve the SOAPAction and the Payload from the SOAP request. This is
transparent to the user.
Using Utils.SOAP_Wrapper
It is possible to dispatch to such callback by using the SOAP.Utils.SOAP_Wrapper generic routine:
generic
with function SOAP_CB
(SOAPAction : in String;
Payload : in Message.Payload.Object;
Request : in AWS.Status.Data) return AWS.Response.Data;
function SOAP_Wrapper
(Request : in AWS.Status.Data) return AWS.Response.Data;
-- From a standard HTTP callback call the SOAP callback passed as generic
-- formal procedure. Raise Constraint_Error if Request is not a SOAP
-- request.
For example, from the standard HTTP callback CB we want to call SOAP_CB for all SOAP requests:
function SOAP_CB
(SOAPAction : in String;
Payload : in Message.Payload.Object;
Request : in AWS.Status.Data) return AWS.Response.Data is
begin
-- Code here
end SOAP_CB;
function SOAP_CB
(SOAPAction : in String;
Payload : in Message.Payload.Object;
Request : in AWS.Status.Data) return AWS.Response.Data is
begin
-- Code here
end SOAP_CB;
begin
AWS.Server.Start
(WS,
Dispatcher =>
SOAP.Dispatchers.Callback.Create (CB'Access, SOAP_CB'Access),
Config =>
AWS.Config.Default_Config);
The dispacther is created using SOAP.Dispatchers.Callback.Create. This routine takes two parameters, one is
the standard HTTP callback procedure and the other is the SOAP callback procedure.
SIX
USING WSDL
WSDL (Web Service Definition Language) is an XML based document which described a set of Web Services either
based on SOAP or XML/RPC. By using a WSDL document it is possible to describe, in a formal way, the interface to any
Web Services. The WSDL document contains the end-point (URL to the server offering the service), the SOAPAction
(needed to call the right routine), the procedure names and a description of the input and output parameters.
AWS provides two tools to work with WSDL documents:
ada2wsdl
which creates a WSDL document from an Ada package spec.
wsdl2aws
which create the interfaces to use a Web Service or to implement Web Services. With this tool the SOAP
interface is completely abstracted out, users will deal only with Ada API. All the SOAP marshaling will
be created automatically.
ada2wsdl can be used on any Ada spec file to generated a WSDL document. The Ada spec is parsed using ASIS.
The simplest way to use it is:
$ ada2wsdl simple.ads
63
AWS Documentation, Release 18.0
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:n1="http://soapaws/Standard_pkg/"
xmlns:n2="http://soapaws/Simple_pkg/">
<wsdl:message name="Plus_Request">
<wsdl:part name="Value" type="xsd:int"/>
</wsdl:message>
<wsdl:message name="Plus_Response">
<wsdl:part name="Result" type="xsd:int"/>
</wsdl:message>
<wsdl:portType name="Simple_PortType">
<wsdl:operation name="Plus">
<wsdl:input message="tns:Plus_Request"/>
<wsdl:output message="tns:Plus_Response"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:operation name="Plus">
<soap:operation soapAction="Plus"/>
<wsdl:input>
<soap:body
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
namespace="http://soapaws/Simple_def/"
use="encoded"/>
</wsdl:input>
<wsdl:output>
<soap:body
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
namespace="http://soapaws/Simple_def/"
use="encoded"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="Simple_Service">
<wsdl:port name="Simple_Port" binding="tns:Simple_Binding">
<soap:address location="http://.../"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
The value of the name attribute in the description node is the name of the WSDL document (the name of the Ada spec
package). On the portType section we have the description of the Ada Plus function. Something important to note
is that in Ada a function does not have a named return parameter, ada2wsdl use Result for the response. Both the
input and output parameter are mapped to SOAP xsd:int type.
Note that the SOAP address generated by default (http://.../) must be edited manually or specified using ada2wsdls
-a option.
This is of course a very simple example. ada2wsdl does support lot more complex specs and will map Ada records,
arrays, enumerations, derived types to a corresponding XML schema definition. See section below for a description of
the mapping.
ada2wsdl parse Ada records, arrays, derived types, enumerations, procedures and functions and generate the corre-
sponding WSDL document. In this section we describe the mapping between Ada and WSDL.
Integer Mapped to xsd:int.
Float Mapped to xsd:float.
Long_Float Mapped to xsd:double
Long_Long_Float Mapped to xsd:double, not supported by SOAP, mapped for convenience but precision cannot be
guaranteed.
Boolean Mapped to xsd:boolean
String Mapped to xsd:string
Unbounded_String Mapped to xsd:string, note that Unbounded_String should be used only inside a record for full
interoperability. This is a current limitation.
Character Mapped to a Character schema definition:
<simpleType name="Character">
<restriction base="xsd:string">
<length value="1"/>
</restriction>
</simpleType>
is defined as:
Derived types with constraints Mapped to a type schema definition with minInclusive and maxInclusive attributes:
is defined as:
Or for a string::
.. highlight:: ada
is defined as:
Users types Mapped to a type schema definition with minInclusive and maxInclusive attributes:
is defined as:
is defined as:
</xsd:restriction>
</simpleType>
is defined as:
<simpleType name="Color">
<restriction base="xsd:string">
<enumeration value="Red"/>
<enumeration value="Green"/>
<enumeration value="Blue"/>
</restriction>
</simpleType>
is defined as:
<complexType name="Rec">
<all>
<element name="A" type="xsd:int"/>
<element name="B" type="xsd:float"/>
<element name="C" type="xsd:double"/>
<element name="D" type="tns:Character"/>
<element name="E" type="xsd:string"/>
<element name="F" type="xsd:boolean"/>
</all>
</complexType>
is defined as:
<complexType name="Set_Of_Rec">
<complexContent>
<restriction base="soap-enc:Array">
<attribute ref="soap-enc:arrayType" wsdl:arrayType="tns:Rec[]"/>
</restriction>
</complexContent>
</complexType>
Array inside a record This part is a bit delicate. A record field must be constrained but a SOAP arrays is most of the
time not constrained at all. To support this AWS use a safe access array component. Such a type is built using
a generic runtime support package named SOAP.Utils.Safe_Pointers. This package implements a reference
counter for the array access and will release automatically the memory when no more reference exists for a
given object.
For example, lets say that we have an array of integer that we want to put inside a record:
package Set_Of_Int_Safe_Pointer is
new SOAP.Utils.Safe_Pointers (Set_Of_Int, Set_Of_Int_Access);
Note that the name Set_Of_Int_Safe_Pointer (<type>_Safe_Pointer) is mandatory (and checked by ada2wsdl)
to achieve interoperability with wsdl2aws. Working with WSDL documents.
From there the safe array access can be placed into the record:
<complexType name="Set_Of_Int">
<complexContent>
<restriction base="soap-enc:Array">
<attribute ref="soap-enc:arrayType" wsdl:arrayType="xsd:int[]"/>
</restriction>
</complexContent>
</complexType>
<complexType name="Complex_Rec">
<all>
<element name="SI" type="tns:Set_Of_Int"/>
</all>
</complexType>
6.1.3 ada2wsdl
-I path Add path option for the ASIS compilation step. This option can appear any number of time on the command
line.
-n name Specify the schema name space root name. The default value is soapaws.
-noenum Do not generate WSDL representation for Ada enumerations, map them to standard string. Ada mapping to
WSDL.
-o file Generate the WSDL document into file.
-P proj The project file to use for building the spec.
-q Quiet mode (no output)
-s name Specify the Web Service name for the WSDL document, by default the spec packages name is used.
-t path Specify the path to the tree file directory to use. This is needed when using a project file the object directory
is not the current directory.
-v Verbose mode, display the parsed spec.
This section describe how to use a Web Service. Lets say that we want to use the Barnes & Noble Price Quote service.
The WSDL document for this service can be found at http://www.xmethods.net/sd/2001/BNQuoteService.wsdl. In
summary this document says that there is a service named getPrice taking as input a string representing the ISBN
number and returning the price as floating point.
The first step is to generate the client interface (stub):
This will create many files, the interesting one at this point is bnquoteservice-client.ads, inside we have:
Lets call this service to find out the price for The Sword of Shannara Trilogy book:
with Ada.Text_IO;
with BNQuoteService.Client;
procedure Price is
use Ada;
begin
Text_IO.Put_Line ("B&N Price for The Sword of Shannara Trilogy");
LFIO.Put (BNQuoteService.Client.getPrice (ISBN), Aft => 2, Exp => 0);
end Price;
Thats all is needed to use this Web Service. This program is fully functional, It is possible to build it and to run it to
get the answer.
Building a Web Service can also be done from a WSDL document. Lets say that you are Barnes & Noble and that you
want to build Web Service getPrice as described in the previous section.
You have created the WSDL document to specify the service spec. From there you can create the skeleton:
This will create many files, the interesting one here is bnquoteservice-server.ads, inside we have:
generic
with function getPrice (isbn : in String) return Float;
function getPrice_CB
(SOAPAction : in String;
Payload : in SOAP.Message.Payload.Object;
Request : in AWS.Status.Data) return AWS.Response.Data;
This is a SOAP AWSs callback routine that can be instantiated with the right routine to retrieve the price of a book
given its ISBN number. A possible implementation of such routine could be:
SOAP_getPrice is a SOAP AWSs callback routine (i.e. it is not a standard callback). To use it there is different
solutions:
Using SOAP.Utils.SOAP_Wrapper This generic function can be used to translate a standard callback based on
AWS.Status.Data into a SOAP callback routine:
The routine getPrice_Wrapper can be used as any other AWSs callback routines. Note that inside this wrapper
the XML payload is parsed to check the routine name and to retrieve the SOAP parameters. To call this routine
the payload needs to be parsed (we need to know which routine has be invoked). In this case we have parsed the
XML payload twice, this is not efficient.
Building the wrapper yourself This solution is more efficient if there is many SOAP procedures as the payload is
parsed only once:
else
...
end if;
Note that the port to be used by the AWS server is described into the server spec.
6.2.3 wsdl2aws
It is possible to pass a WSDL file or direct wsdl2aws to a WSDL document on the Web by passing its URL.
wsdl2aws options are:
-q Quiet mode (no output)
-d Generate debug code. Will output some information about the payload to help debug a Web Service.
-a Generate using Ada style names. For example getPrice will be converted to Get_Price. This formatting is done for
packages, routines and formal parameters.
-f Force creation of the file. Overwrite any exiting files with the same name.
-e URL Specify the default endpoint to use instead of the one found in the WSDL document.
-s Skip non supported SOAP routines. If -s is not used, wsdl2aws will exit with an error when a problem is found
while parsing the WSDL document. This option is useful to skip routines using non supported types and still be
able to compile the generated files.
-o name Specify the name of the local WSDL document. This option can be used only when using a Web WSDL
document (i.e. passing an URL to wsdl2aws).
-p name Specify a name prefix for all SOAPActions defined in the WDSL. This option can be used when multiple
WSDL generated callback are to be used together and some of the WSDL may have the same name.
-doc Handle document style binding as RPC ones. This is sometimes needed because some WSDL document specify
a document style binding even though the service behave like an RPC one.
-v Verbose mode, display the parsed spec.
-v -v Verbose mode, display the parsed spec and lot of information while parsing the WSDL document tree.
-wsdl Add WSDL document as comment into the generated root unit.
-cvs Add CVS Id tag in every generated file.
-nostub Do not generated stubs, only skeletons are generated.
-noskel Do not generated skeletons, only stubs are generated.
-cb Generate a SOAP dispatcher callback routine for the server. This dispatcher routine contains the code to handle
all the operations as described in the WSDL document. You need also to specify the -spec and/or -types options,
see below.
-x operation Add operation to the list of SOAP operations to skip during the code generation. It is possible to specify
multiple -x options on the command line.
-spec spec Specify the name of the spec containing the Ada implementation of the SOAP routines. This is used
for example by the -cb option above to instantiate all the server side SOAP callbacks used by the main SOAP
dispatcher routine. If -types is not specified, the type definitions are also used from this spec.
-types spec Specify the name of the spec containing the Ada types (record, array) used by SOAP routines specified
with option -spec. If -spec is not specified, the spec definitions are also used from this spec.
-main filename Specify the name of the servers procedure main to generate. If file <filename>.amt (Ada Main
Template) is present, it uses this template file to generate the main procedure. The template can reference the
following variable tags:
SOAP_SERVICE The name of the service as described into the WSDL document. This tag can be used to
include the right units:
with @[email protected];
with @[email protected];
procedure @_UNIT_NAME_@ is
begin
...
-n name Specify the schema name space root name. The default value is soapaws.
-proxy name|IP Use this proxy to access the WSDL document and generate code to access to these Web Services via
this proxy. The proxy can be specified by its DNS name or IP address.
-pu name User name for the proxy if proxy authentication required.
-pp password User password for the proxy if proxy authentication required.
-timeouts [timeouts | connect_timeout,send_timeout,receive_timeout ] Set the timeouts for the SOAP connection.
The timeouts is either a single value used for the connect, send and receive timeouts or three values separated
by a colon to set each timeout independently.
The wsdl2aws tool read a WSDL document and creates a root package and a set of child packages as described below:
<root> This is the main package, it contains eventually the full WSDL in comment and the description of the services
as read from the WSDL document.
<NS>.<type>_type_pkg Contains all the type definitions for non standard Ada types. In these packages we find for
example the definition of the records and the operation to convert them to/from SOAP objects. The types defined
here have possible constraints like range attribute and/or Dynamic_Predicate aspects for Pattern and/or Length
WSDL attribute.
The root package <NS> is the name-space of the actual type. This ensure that no type name clash will happen.
Those packages are generally not directly withed.
<root>.Types This package contains the definitions of the types which are not SOAP base types. We find here the
definitions of the SOAP structs and arrays with routines to convert them between the Ada and SOAP type model.
A subtype definition is also created for every routines returned type. In fact, all definitions here are only alias
or renaming of types and/or routines generated in other packages rooted with a name-space as described above.
This package is the one that users should import to gain the visibility of types definitions.
This package also contains the schema object which must be used when calling a Web service or parsing a
payload.
<root>.Client All spec to call Web Services.
<root>.Server All spec to build Web Services. These specs are all generic and must be instantiated with the right
routine to create the web services.
<root>.CB The SOAP dispatcher callback routine.
It is hard to know all current limitations as the WSDL and SOAP world is quite complex. We list there all known
limitations:
Some SOAP base types are not supported : date, time, xsd:hexBinary, decimal. All these are easy to add (except
decimal), it is just not supported with the current version.
Multi-dimension arrays are not supported.
abstract types are not supported.
SOAP MIME attachments are not supported.
WSDL type inheritance not supported.
The Document/Encoded SOAP messages style is not supported
complexType with xs:choice are only supported with a single occurence of each choice.
6.2.6 awsascb
The awsascb (AWS Aggregate Server Callback) tool can be used to aggregate multiple SOAP callback together. That
is, after generated multiple SOAP callback with wsdl2aws it may be needed to create a single server handling all the
services. This tools is designed for this.
This is no option to for this tool. The root parameters are the wsdl2aws generated root service name unit. This tool
generates a unit named agg_server_cb which contains a SOAP callback and a dispatcher to be used by the server main.
Here is the spec:
with AWS.Response;
with AWS.Status;
with SOAP.Dispatchers.Callback;
with SOAP.Message.Payload;
with SOAP.WSDL.Schema;
package Agg_Server_CB is
use AWS;
use SOAP;
function Create
(HTTP_Callback : AWS.Response.Callback) return Handler;
-- Returns an handler whose SOAP_Callback is the one below
function SOAP_CB
(SOAPAction : String;
Payload : Message.Payload.Object;
Request : AWS.Status.Data)
return Response.Data;
end Agg_Server_CB;
And following is an example on using such generated aggregate server callback from a servers main:
WS : Server.HTTP;
Conf : Config.Object;
Disp : Agg_Server_CB.Handler;
begin
Config.Set.Server_Port (Conf, 0);
Using both tools together is an effective way to build rapidely a SOAP server. It can be said that doing so is quite
trivial in fact. Lets take the following spec:
package Graphics is
end Graphics;
We do not show the body here but we suppose it is implemented. To build a server for this service it is as easy as:
Options
-cb is to create the SOAP dispatcher callback routine,
-main server to generate the main server procedure in server.adb,
-types graphics to use graphics.ads to get references from users spec (reference to Graphics.Point for example).
SEVEN
AWS provides a complete API to send e-mail using SMTP protocol. You need to have access to an SMTP server to use
this feature. The API covers sending simple mail with text message and/or with MIME attachments (base64 encoded).
Here are the steps to send a simple e-mail:
Initialize the SMTP server
SMTP_Server : SMTP.Receiver :=
SMTP.Client.Initialize ("smtp.hostname");
Here AWS uses the default SMTP port to create an SMTP mail server but it is possible to specify a different one.
The hostname specified must be a valid SMTP server.
Send the e-mail
To send an e-mail there is many different API. Lets send a simple text mail:
Status : SMTP.Status;
SMTP.Client.Send
(SMTP_Server,
From => SMTP.E_Mail ("Pascal Obry", "[email protected]"),
To => SMTP.E_Mail ("John Doe", "[email protected]"),
Subject => "About AWS SMTP protocol",
Message => "AWS can now send mails",
Status => Status);
In the above example, the message content was given as a string but it is possible to specify a disk file. AWS can also
send MIME messages either from disk files or with in memory base64 encoded binary data. The API provides also a
way to send messages to multiple recipients at the same time and to send messages with alternative contents (text and
77
AWS Documentation, Release 18.0
HTML for example). These features are not described here, complete documentation can be found on the spec see
AWS.SMTP and AWS.SMTP.Client.
AWS provides an API to retrieve e-mails from a POP mailbox. POP stands for Post Office Protocol and is the main
protocol used by Internet Service Providers around the world. IMAP is another well known protocol in this area but it
is not supported by AWS.
We describes here the POP API. For a complete description see AWS.POP.
Opening the mailbox
The first step is to authenticate using a user name and password. AWS supports two methods one called
Clear_Text which is the most used and another one APOP which is more secure but almost not supported
by ISP for the moment (and will probably never be supported as a more secure protocol named SPA -Secure
Password Authentication- could be used instead):
Mailbox : POP.Mailbox :=
POP.Initialize ("pop.hostname", "john.does", "mysuperpwd");
Remove can be set to False for the message to stay on the mailbox. The default value is False.
Iterating through the mailbox content
Another way to retreive message is by using an iterator:
procedure Print_Subject
(Message : in POP.Message
Index : in Positive;
Quit : in out Boolean) is
begin
Text_IO.Put_Line (POP.Subject (Message));
end Print_Message;
...
It exists a set of routines on a POP.Message object to get the subject the content, the date or any headers. It is
also possible to work with attachments. See point below.
Working with attachments
A message can have a set of MIME attachments. The number of attachments can be retrieved using Attach-
ment_Count:
As for messages it is possible to get a single attachment using its index in the message or by using an iterator:
procedure Write_Attachment
(Attachment : in POP.Attachment
Index : in Positive;
Quit : in out Boolean) is
begin
POP.Write (Attachment, Directory => ".");
end Print_Message;
procedure Write_All_Attachments is
new POP.For_Every_Attachment (Write_Attachment);
...
Write_All_Attachments (Message);
It is also possible to retrieve the attachments filename, the content as a memory stream. See AWS.POP.
Closing the connection
POP.Close (POP_Server);
EIGHT
LDAP
AWS provides a complete API to retrieve information from LDAP servers. Note that there is no support for updating,
modifying or deleting information only to read information from the server.
The AWS/LDAP implementation is based on OpenLDAP. To build an LDAP application you need to link with the
libldap.a library. This library is built by AWS on Windows based system and will use the wldap32.dll as
provided with Windows NT/2000/XP. On UNIX based systems, you must install properly the OpenLDAP package.
The steps required to read information from an LDAP server are:
Initialize the LDAP directory We open a connection:
declare
Directory : LDAP.Client.Directory;
begin
Directory := LDAP.Client.Init (Host);
Host is the hostname where the LDAP directory is running. It is possible to specify the port if the LDAP server
does not use the default one.
Bind to the LDAP server This step is the way to pass a login/password if the LDAP server required an authentication.
If not, the login/password must be empty strings:
Do the search For the search you must specify the base name, a filter, the scope and a set of attributes to retrieve:
Response_Set := LDAP.Client.Search
(Directory, Base_DN, Filter, LDAP.Client.LDAP_Scope_Subtree,
LDAP.Client.Attributes ("cn", "sn", "telephonenumber"));
81
AWS Documentation, Release 18.0
declare
Message : LDAP.Client.LDAP_Message;
begin
Message := LDAP.Client.First_Entry (Directory, Response_Set);
Read attributes for each entry Each entry has an associated set of attributes. To retrieve attributes values there is two
iterators. First_Attribute / Next_Attribute or the generic high level iterator For_Every_Attribute:
declare
BER : aliased LDAP.Client.BER_Element;
Attr : constant String := LDAP.Client.First_Attribute
(Directory, Message, BER'Unchecked_Access);
begin
Do_Job (Attr);
loop
declare
Attr : constant String := LDAP.Client.Next_Attribute
(Directory, Message, BER);
begin
exit when Attr = "";
Do_Job (Attr);
end;
end loop;
end;
Cleanup At the end of the processing it is important to release memory associated with LDAP objects:
LDAP.Client.Free (Message);
LDAP.Client.Unbind (Directory);
See AWS.LDAP.Client for all high level supported API and documentation.
Note that for complete information about AWS/LDAP you you should read an LDAP API description. AWS/LDAP is
only a binding and follow the LDAP API closely.
82 Chapter 8. LDAP
CHAPTER
NINE
JABBER
AWS support part of the Jabber protocol. At this stage only two kind of messages are supported:
Presence
To check the presence status of a specific JID (Jabber ID)
Message
To send messages to a specific JID (Jabber ID)
Note that if you want an application to check the presence or send message to users it is recommended to create a
specific Jabber ID on the server for this application and ask users to accept this specific user to check their presence
status.
To check for the presence of another JID you must first have the right to do so. The jabber server wont let you see
presence of another JID unless the JID have permitted you to see its presence.
First declare the server and status objects:
Server : AWS.Jabber.Server;
Status : AWS.Jabber.Presence_Status;
Connect to the server, you must have an account created and must know the login and password:
AWS.Jabber.Connect
(Server, "jabber.domain.org", "joe", "mysuperpwd");
To send a message to a specific JID, you must connect to the server as above and close the server when you dont need
to communicate with it anymore. The only different part is to send the message, here is an example:
83
AWS Documentation, Release 18.0
Send_Message
(Server,
JID => "[email protected]",
Subject => "Hello there!",
Content => "Are you using AWS ?");
84 Chapter 9. Jabber
CHAPTER
TEN
RESOURCES
AWS support embedded resources. It means that it is possible to build a fully self dependent executable. This is
useful when distributing a server. The server program contains the code but also the images (PNG, JPEG, GIF), the
templates, the HTML pages... more generally any file the Web Server must serve to clients.
To embbed the files into the executable you must build a resource tree. This task is greatly simplified using AWSRes
tool. For example lets say that you want to build a simple server with a single page containing some text and one
PNG image. The text is handled directly in the callback procedure and contain a reference to the image logo.png.
To build the resource tree:
$ awsres logo.png
This will create a set of packages whose root is the unit res by default. The resource tree is created. See awsres tool
for the complete AWSs usage description.
awsres can also compress the resource files. This can be done by using awsress -z option. Compressed resources are
handled transparently. If the Web client supports compression the resource is sent as-is otherwise a decompression
stream will be created for the resource to be decompressed on-the-fly while sending it.
This is really the simplest step. The resource tree must be linked with your executable, to do so you just have to with
the resource tree root into one of your program unit. This will ensure that the resource tree will be compiled and linked
into the executable. AWS and Templates_Parser know about resource files and will pick them up if available.
Note that this is transparent to users. It is possible to build the very same server based on standard files or resources
files. The only change in the code is to with or not the resource tree.
Note that AWS supports only a single resource tree. If more than one resource tree is included into a program only one
will be seen.
Users can build a response directly from a stream. In this case the callback answer is built using AWS.Response.Stream.
It creates a resource object whose operations have been inherited from AWS.Resource.Stream.Stream_Type and rede-
fined by the user. So the Read operation can dynamically create the result stream data, the End_Of_File operation must
85
AWS Documentation, Release 18.0
returns True when the stream data is out and so on. This feature is useful to let users completely create and control
dynamically AWSs response content.
See AWS.Resources.Streams.
AWSRes is a tool to build resource files. It creates a root package named res by default and a child package for each
resource file:
ELEVEN
STATUS PAGE
The status page gives information about the AWS internal status. For example it returns the server socket ID, the
number of simultaneous connection, the number of time a connection has been used...
To display the information AWS use a template file. The template file (default is aws_status.thtml) is an HTML file
with some specific tags recognized by the parser. For more information about how the template parser works, please
look for the template parser documentation distributed with AWS.
Here are the tag variables recognized by AWS status page:
ABORTABLE_V (vector tag) A list of boolean. One for each connection. True means that this connection can be
aborted if none is available. This is to be inserted in a template table.
ACCEPT_QUEUE_SIZE see Configuration options.
ACCEPTOR_LENGTH Number of sockets in the internal socket set.
ACTIVITY_COUNTER_V (vector tag) A list of natural. One for each connection. This is the number of request
the connection has answered. This counter is reset each time the connection is closed. In other word this is the
number of request a keep-alive connection has processed.
ACTIVITY_TIME_STAMP_V (vector tag) A list of date. One for each connection. This is the time of the latest
request answered.
ADMIN URI to the administrative page.
CASE_SENSITIVE_PARAMETERS see Configuration options.
CHECK_URL_VALIDITY see Configuration options.
CLEANER_CLIENT_DATA_TIMEOUT see Configuration options.
CLEANER_CLIENT_HEADER_TIMEOUT see Configuration options.
CLEANER_SERVER_RESPONSE_TIMEOUT see Configuration options.
CLEANER_WAIT_FOR_CLIENT_TIMEOUT see Configuration options.
CURRENT_CONNECTIONS Number of current connections to the server.
ERROR_LOG (boolean tag) This is set to true if error logging is active.
ERROR_LOG_FILE The error log file full pathname.
ERROR_LOG_FILENAME_PREFIX see Configuration options.
ERROR_LOG_SPLIT_MODE see Configuration options.
FORCE_CLIENT_DATA_TIMEOUT see Configuration options.
FORCE_CLIENT_HEADER_TIMEOUT see Configuration options.
FORCE_SERVER_RESPONSE_TIMEOUT see Configuration options.
87
AWS Documentation, Release 18.0
SOCK_V (vector tag) A list of sockets ID. One for each connection.
STATUS_PAGE see Configuration options.
START_TIME A timestamp in YYYY-MM-DD HH:MM:SS format. When the server was started.
TRANSIENT_CLEANUP_INTERVAL see Configuration options.
TRANSIENT_LIFETIME see Configuration options.
UPLOAD_DIRECTORY see Configuration options.
UPLOAD_SIZE_LIMIT see Configuration options.
VALUES_M (matrix tag) A list of set of values (for each value correspond a key in the vector tag KEYS_L, see
above). Each key in the vector tag start with an HTML <td> tag. This is to be able to display the key/value in
column.
VERSION AWS version string.
WWW_ROOT see Configuration options.
There is also all Templates_Parser specific tags. This is not listed here please have a look at the Templates_Parser
documentation distributed with AWS.
89
AWS Documentation, Release 18.0
TWELVE
REFERENCES
Here is a list of documents used to implement AWS, the SOAP support and associated services:
RFC 0821
Jonathan B. Postel
August 1982
RFC 1867
RFC 1939
RFC 1945
91
AWS Documentation, Release 18.0
RFC 2049
RFC 2109
RFC 2195
RFC 2554
RFC 2616
RFC 2617
Network Working Group J. Franks
Request for Comments: 2617 Northwestern University
Obsoletes: 2069 P. Hallam-Baker
Category: Standards Track Verisign, Inc.
J. Hostetler
AbiSource, Inc.
S. Lawrence
Agranat Systems, Inc.
P. Leach
Microsoft Corporation
A. Luotonen
Netscape Communications Corporation
L. Stewart
Open Market, Inc.
June 1999
draft 302
Transport Layer Security Working Group Alan O. Freier
INTERNET-DRAFT Netscape Communications
Expire in six months Philip Karlton
Netscape Communications
Paul C. Kocher
Independent Consultant
November 18, 1996
This version:
http://www.w3.org/TR/2000/NOTE-SOAP-20000508
Latest version:
http://www.w3.org/TR/SOAP
Authors (alphabetically):
Don Box, DevelopMentor
David Ehnebuske, IBM
Gopal Kakivaya, Microsoft
Andrew Layman, Microsoft
Noah Mendelsohn, Lotus Development Corp.
Henrik Frystyk Nielsen, Microsoft
Satish Thatte, Microsoft
Dave Winer, UserLand Software, Inc.
93
AWS Documentation, Release 18.0
`http://www.w3.org/TR/SOAP/ <http://www.w3.org/TR/SOAP/>`_
`http://www.soapware.org/bdg <http://www.soapware.org/bdg>`_
THIRTEEN
13.1 AWS
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2000-2016, 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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
pragma Ada_2012;
end AWS;
95
AWS Documentation, Release 18.0
13.2 AWS.Attachments
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2004-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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
pragma Ada_2012;
with Ada.Strings.Unbounded;
with AWS.Headers;
with AWS.MIME;
with AWS.Net;
package AWS.Attachments is
use Ada.Strings.Unbounded;
function File
(Filename : String;
Encode : Encoding := None;
Content_Id : String := "";
function Value
(Data : String;
Name : String := "";
Encode : Encoding := None;
Content_Id : String := "";
Content_Type : String := MIME.Text_Plain) return Content;
-- A string as content
procedure Add
(Attachments : in out List;
Filename : String;
Content_Id : String;
Headers : AWS.Headers.List := AWS.Headers.Empty_List;
Name : String := "";
Encode : Encoding := None)
with Post => Count (Attachments) = Count (Attachments'Old) + 1;
-- Adds an Attachment to the list.
-- Note that the encoding will overwrite the corresponding entry in
-- headers.
procedure Add
(Attachments : in out List;
Filename : String;
Headers : AWS.Headers.List;
Name : String := "";
Encode : Encoding := None)
with Post => Count (Attachments) = Count (Attachments'Old) + 1;
-- Adds an Attachment to the list.
-- Note that the encoding will overwrite the corresponding entry in
-- headers.
procedure Add
(Attachments : in out List;
Name : String;
Data : Content;
Headers : AWS.Headers.List := AWS.Headers.Empty_List)
with Post => Count (Attachments) = Count (Attachments'Old) + 1;
-- Adds an Attachment to the list.
-- Note that the encoding and content type attached to Data will
-- overwrite the corresponding entry in headers.
-- Alternatives content
procedure Add
(Parts : in out Alternatives;
Data : Content);
-- Add an alternative content
13.2. AWS.Attachments 97
AWS Documentation, Release 18.0
procedure Add
(Attachments : in out List;
Parts : Alternatives);
-- Add an alternative group to the current attachment list
procedure Reset
(Attachments : in out List;
Delete_Files : Boolean)
with Post => Count (Attachments) = 0;
-- Reset the list to be empty. If Delete_Files is set to true the
-- attached files are removed from the file system.
function Get
(Attachments : List;
Index : Positive) return Element
with Pre => Index <= Count (Attachments);
-- Returns specified Attachment
function Get
(Attachments : List;
Content_Id : String) return Element
with
Pre =>
(for some K in 1 .. Count (Attachments)
=> AWS.Attachments.Content_Id (Get (Attachments, K)) = Content_Id);
-- Returns the Attachment with the Content Id
generic
with procedure Action
(Attachment : Element;
Index : Positive;
Quit : in out Boolean);
procedure For_Every_Attachment (Attachments : List);
-- Calls action for every Attachment in Message. Stop iterator if Quit is
-- set to True, Quit is set to False by default.
procedure Iterate
(Attachments : List;
Process : not null access procedure (Attachment : Element));
-- Calls Process for every Attachment in Message
function Length
(Attachments : List;
Boundary : String) return Positive
with Post => Length'Result > 8;
-- Returns the complete size of all attachments including the surrounding
-- boundaries.
procedure Send_MIME_Header
(Socket : Net.Socket_Type'Class;
Attachments : List;
Boundary : out Unbounded_String;
Alternative : Boolean := False);
-- Output MIME header, returns the boundary for the content
procedure Send
(Socket : AWS.Net.Socket_Type'Class;
Attachments : List;
Boundary : String);
-- Send all Attachments, including the surrounding boundarys, in the list
-- to the socket.
private
-- implementation removed
end AWS.Attachments;
13.2. AWS.Attachments 99
AWS Documentation, Release 18.0
13.3 AWS.Client
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2000-2016, 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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
pragma Ada_2012;
with Ada.Streams;
with Ada.Strings.Unbounded;
with AWS.Attachments;
with AWS.Default;
with AWS.Headers;
with AWS.Net.SSL.Certificate;
with AWS.Response;
package AWS.Client is
use Ada.Streams;
use Ada.Strings.Unbounded;
Connection_Error : exception;
-- Raised if the connection with the server cannot be established
Protocol_Error : exception;
-- Raised if the client receives wrong HTTP protocol data
Retry_Default : constant := 0;
-- Number of time a data is requested from the Server if the first
-- time fails.
--------------
-- Timeouts --
--------------
function Timeouts
(Connect : Duration := Net.Forever;
Send : Duration := Net.Forever;
Receive : Duration := Net.Forever;
Response : Duration := Net.Forever) return Timeouts_Values;
-- Constructor for the timeouts values
--------------
-- Messages --
--------------
function Get
(URL : String;
User : String := No_Data;
Pwd : String := No_Data;
Proxy : String := No_Data;
Proxy_User : String := No_Data;
Proxy_Pwd : String := No_Data;
Timeouts : Timeouts_Values := No_Timeout;
Data_Range : Content_Range := No_Range;
Follow_Redirection : Boolean := False;
Certificate : String := Default.Client_Certificate;
Headers : Header_List := Empty_Header_List)
return Response.Data;
-- Retrieve the message data given a specific URL. It open a connection
-- with the server and ask for the resource specified in the URL it then
-- return it in the Response.Data structure.
-- If User/Pwd are given then it uses it to access the URL.
--
-- Eventually it connect through a PROXY using if necessary the Proxy
-- authentication Proxy_User:Proxy_Pwd.
--
-- Only Basic authentication is supported (i.e. Digest is not). Digest
-- authentication is supported with the keep-alive client API, see below.
--
-- If Follow_Redirection is set to True, Get will follow the redirection
-- information for 301 status code response. Note that this is not
-- supported for keep-alive connections as the redirection could point to
-- another server.
--
-- Get will retry one time if it fails.
function Head
(URL : String;
User : String := No_Data;
Pwd : String := No_Data;
Proxy : String := No_Data;
Proxy_User : String := No_Data;
Proxy_Pwd : String := No_Data;
Timeouts : Timeouts_Values := No_Timeout;
Headers : Header_List := Empty_Header_List) return Response.Data;
-- Idem as above but we do not get the message body.
-- Head will retry one time if it fails.
function Put
(URL : String;
Data : String;
User : String := No_Data;
Pwd : String := No_Data;
Proxy : String := No_Data;
Proxy_User : String := No_Data;
Proxy_Pwd : String := No_Data;
Timeouts : Timeouts_Values := No_Timeout;
Headers : Header_List := Empty_Header_List) return Response.Data;
-- Send to the server URL a PUT request with Data
-- Put will retry one time if it fails.
function Delete
(URL : String;
Data : String;
User : String := No_Data;
Pwd : String := No_Data;
Proxy : String := No_Data;
Proxy_User : String := No_Data;
Proxy_Pwd : String := No_Data;
Timeouts : Timeouts_Values := No_Timeout;
Headers : Header_List := Empty_Header_List) return Response.Data;
-- Send to the server URL a DELETE request with Data
-- Delete will retry one time if it fails.
function Delete
(URL : String;
Data : Stream_Element_Array;
User : String := No_Data;
Pwd : String := No_Data;
Proxy : String := No_Data;
Proxy_User : String := No_Data;
Proxy_Pwd : String := No_Data;
Timeouts : Timeouts_Values := No_Timeout;
Headers : Header_List := Empty_Header_List) return Response.Data;
-- Send to the server URL a DELETE request with Data
-- Delete will retry one time if it fails.
function Post
(URL : String;
Data : String;
Content_Type : String := No_Data;
User : String := No_Data;
Pwd : String := No_Data;
Proxy : String := No_Data;
Proxy_User : String := No_Data;
Proxy_Pwd : String := No_Data;
Timeouts : Timeouts_Values := No_Timeout;
Attachments : Attachment_List := Empty_Attachment_List;
Headers : Header_List := Empty_Header_List)
return Response.Data;
-- Send to the server URL a POST request with Data
-- Post will retry one time if it fails.
function Post
(URL : String;
Data : Stream_Element_Array;
Content_Type : String := No_Data;
User : String := No_Data;
Pwd : String := No_Data;
Proxy : String := No_Data;
Proxy_User : String := No_Data;
Proxy_Pwd : String := No_Data;
Timeouts : Timeouts_Values := No_Timeout;
Attachments : Attachment_List := Empty_Attachment_List;
Headers : Header_List := Empty_Header_List)
return Response.Data;
-- Idem as above but with binary data
function SOAP_Post
(URL : String;
Data : String;
SOAPAction : String;
User : String := No_Data;
Pwd : String := No_Data;
Proxy : String := No_Data;
Proxy_User : String := No_Data;
Proxy_Pwd : String := No_Data;
Timeouts : Timeouts_Values := No_Timeout;
Attachments : Attachment_List := Empty_Attachment_List;
Headers : Header_List := Empty_Header_List) return Response.Data;
-- Send to the server URL a POST request with Data
-- Post will retry one time if it fails.
function Upload
(URL : String;
Filename : String;
User : String := No_Data;
Pwd : String := No_Data;
Proxy : String := No_Data;
Proxy_User : String := No_Data;
Proxy_Pwd : String := No_Data;
Timeouts : Timeouts_Values := No_Timeout;
Headers : Header_List := Empty_Header_List;
Progress : access procedure
(Total, Sent : Stream_Element_Offset) := null)
return Response.Data;
-- This is a file upload request. Filename file's content will be send to
-- the server at address URL.
---------------------------------------
-- Keep-Alive client implementation --
---------------------------------------
function Create
(Host : String;
User : String := No_Data;
Pwd : String := No_Data;
Proxy : String := No_Data;
Proxy_User : String := No_Data;
Proxy_Pwd : String := No_Data;
Retry : Natural := Retry_Default;
procedure Create
(Connection : in out HTTP_Connection;
Host : String;
User : String := No_Data;
Pwd : String := No_Data;
Proxy : String := No_Data;
Proxy_User : String := No_Data;
Proxy_Pwd : String := No_Data;
Retry : Natural := Retry_Default;
Persistent : Boolean := True;
Timeouts : Timeouts_Values := No_Timeout;
Server_Push : Boolean := False;
SSL_Config : Net.SSL.Config := Net.SSL.Null_Config;
Certificate : String := Default.Client_Certificate;
User_Agent : String := Default.User_Agent);
-- Create a new connection. This is to be used with Keep-Alive client API
-- below. The connection will be tried Retry times if it fails. If
-- persistent is True the connection will remain open otherwise it will be
-- closed after each request. User/Pwd are the server authentication info,
-- Proxy is the name of the proxy server to use, Proxy_User/Proxy_Pwd are
-- the proxy authentication data. Only Basic authentication is supported
-- from this routine, for Digest authentication see below. Timeouts are
-- the send/receive timeouts for each request. If Server_Push is True the
-- connection will be used to push information to the client.
-- SSL_Config is to define secure connection configuration. Othewhise
-- Certificate can be set to specify the certificate filename to use for
-- the secure connection. User_Agent can be overridden to whatever you want
-- the client interface to present itself to the server.
function Get_Certificate
(Connection : HTTP_Connection) return Net.SSL.Certificate.Object;
-- Return the certificate used for the secure connection. If this is not a
-- secure connection, returns Net.SSL.Certificate.Undefined.
procedure Set_Headers
(Connection : in out HTTP_Connection; Headers : Header_List) with Inline;
-- Set additional headers for connection
procedure Set_WWW_Authentication
(Connection : in out HTTP_Connection;
User : String;
Pwd : String;
Mode : Authentication_Mode);
-- Sets the username password and authentication mode for the Web
-- authentication.
--
-- "Any" mean that user want to use Digest server authentication mode but
-- could use Basic if the server does not support Digest authentication.
--
-- "Basic" mean that client will send basic authentication. "Basic"
-- authentication is send with the first request and is a fast
-- authentication protocol.
--
-- "Digest" mean that the client ask for Digest authentication, it
-- requires that a first unauthorized request be sent to the server. The
-- server will answer "nonce" for the authentication protocol to continue.
procedure Set_Proxy_Authentication
(Connection : in out HTTP_Connection;
User : String;
Pwd : String;
Mode : Authentication_Mode);
-- Sets the username, password and authentication mode for the proxy
-- authentication.
procedure Set_Persistent
(Connection : in out HTTP_Connection; Value : Boolean) with Inline;
-- Change Persistent flag of the connection. If persistent is True the
-- connection will remain open, otherwise it will be closed after each
-- request, next request and further would be with "Connection: Close"
-- header line.
procedure Copy_Cookie
(Source : HTTP_Connection;
Destination : in out HTTP_Connection);
-- Copy a session Id from connection Source to connection Destination.
-- Allow both connections to share the same user environment. Note that
-- user's environment are thread-safe.
procedure Set_Cookie
(Connection : in out HTTP_Connection; Cookie : String) with Inline;
-- Set the connection cookie
function Read_Until
(Connection : HTTP_Connection;
Delimiter : String;
Wait : Boolean := True) return String;
-- Read data on the Connection until the delimiter (including the
-- delimiter). It can be used to retrieve the next piece of data from a
-- push server. If Wait is False the routine is looking for delimiter only
-- in the internal socket buffer and return empty string if no delimiter
-- found. If Wait is True and returned data is empty or does not termintate
procedure Read_Until
(Connection : in out HTTP_Connection;
Delimiter : String;
Result : in out Unbounded_String;
Wait : Boolean := True);
-- Idem as above but returns the result as an Unbounded_String
procedure Read_Some
(Connection : in out HTTP_Connection;
Data : out Stream_Element_Array;
Last : out Stream_Element_Offset);
-- Reads any available data from the client's connection.
-- If no data available, it will wait for some data to become available or
-- until it timeouts. Returns Last < Data'First when there is no data
-- available in the HTTP response. Connection have to be created with
-- parameter Server_Push => True.
procedure Read
(Connection : in out HTTP_Connection;
Data : out Stream_Element_Array;
Last : out Stream_Element_Offset);
-- Reads data from the client's connection until Data buffer if filled
-- or it reached the end of the response. Returns Last < Data'Last if
-- there is no more data available in HTTP response. Connection have
-- to be created with parameter Server_Push => True.
procedure Get
(Connection : in out HTTP_Connection;
Result : out Response.Data;
URI : String := No_Data;
Data_Range : Content_Range := No_Range;
Headers : Header_List := Empty_Header_List);
-- Same as Get above but using a Connection
procedure Head
(Connection : in out HTTP_Connection;
Result : out Response.Data;
URI : String := No_Data;
Headers : Header_List := Empty_Header_List);
-- Same as Head above but using a Connection
procedure Delete
(Connection : in out HTTP_Connection;
Result : out Response.Data;
Data : String;
URI : String := No_Data;
Headers : Header_List := Empty_Header_List);
-- Same as Delete above but using a Connection
procedure Delete
(Connection : in out HTTP_Connection;
Result : out Response.Data;
Data : Stream_Element_Array;
URI : String := No_Data;
Headers : Header_List := Empty_Header_List);
-- Same as Delete above but using a Connection
procedure Put
(Connection : in out HTTP_Connection;
Result : out Response.Data;
Data : String;
URI : String := No_Data;
Headers : Header_List := Empty_Header_List);
-- Same as Put above but using a Connection
procedure Put
(Connection : in out HTTP_Connection;
Result : out Response.Data;
Data : Stream_Element_Array;
URI : String := No_Data;
Headers : Header_List := Empty_Header_List);
procedure Post
(Connection : in out HTTP_Connection;
Result : out Response.Data;
Data : String;
Content_Type : String := No_Data;
URI : String := No_Data;
Attachments : Attachment_List := Empty_Attachment_List;
Headers : Header_List := Empty_Header_List);
-- Same as Post above but using a Connection
procedure Post
(Connection : in out HTTP_Connection;
Result : out Response.Data;
Data : Stream_Element_Array;
Content_Type : String := No_Data;
URI : String := No_Data;
Attachments : Attachment_List := Empty_Attachment_List;
Headers : Header_List := Empty_Header_List);
-- Same as Post above but using a Connection
procedure Upload
(Connection : in out HTTP_Connection;
Result : out Response.Data;
Filename : String;
URI : String := No_Data;
Headers : Header_List := Empty_Header_List;
Progress : access procedure
(Total, Sent : Stream_Element_Offset) := null);
-- Same as Upload above but using a Connection
procedure SOAP_Post
(Connection : HTTP_Connection;
Result : out Response.Data;
SOAPAction : String;
Data : String;
Streaming : Boolean := False;
Attachments : Attachment_List := Empty_Attachment_List;
Headers : Header_List := Empty_Header_List);
-- Same as SOAP_Post above but using a Connection
-- Streaming is to be able to parse response XML on the fly,
-- without intermediate buffer.
procedure Set_Streaming_Output
(Connection : in out HTTP_Connection;
Value : Boolean)
with Inline;
-- Call this routine with Value => True to be able to read data as a
-- stream by using Read and/or Read_Some routines above. Note that
-- Connection is already in Streaming mode if it has been created
-- with Server_Push => True.
private
-- implementation removed
end AWS.Client;
13.4 AWS.Client.Hotplug
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2004-2012, 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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
with AWS.Response;
package AWS.Client.Hotplug is
function Register
(Name : String;
Password : String;
Server : String;
Regexp : String;
URL : String) return Response.Data;
-- Register hotplug module Name into Server with address URL to respond to
-- requests matching Regexp. Server must be a valid URL, http://host:port.
-- If port is not specified the default HTTP port is used.
function Unregister
(Name : String;
Password : String;
Server : String;
Regexp : String) return Response.Data;
-- Unregister hotplug module Name responding to Regexp requests from
end AWS.Client.Hotplug;
13.5 AWS.Communication
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2000-2012, 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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
-- The communication protocol uses a light encoding scheme based on the HTTP
-- GET method. For standard, XML based, communication you can use the SOAP
-- protocol. This API can be convenient if you do not plan to build AWS with
-- SOAP support.
with Ada.Strings.Unbounded;
package AWS.Communication is
use Ada.Strings.Unbounded;
function Parameters
(P1, P2, P3, P4, P5 : String := "") return Parameter_Set;
-- Constructor function to help create a Parameter_Set. This function will
-- return a Parameter_Set array containing any parameter with a non emptry
-- string value.
private
-- implementation removed
end AWS.Communication;
13.6 AWS.Communication.Client
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2000-2012, 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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
with AWS.Response;
package AWS.Communication.Client is
function Send_Message
(Server : String;
Port : Positive;
Name : String;
Parameters : Parameter_Set := Null_Parameter_Set)
return Response.Data;
-- Send a message to server with a set of parameters. The destination is
-- server is http://Server:Port, the message name is Name and the set of
-- parameters is to be found into Parameters.
--
-- The complete message format is:
--
-- http://<Server>:<Port>/AWS_Com?HOST=<host>&NAME=<name>
-- &P1=<param1>&P2=<param2>
end AWS.Communication.Client;
13.7 AWS.Communication.Server
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2000-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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
with AWS.Response;
generic
package AWS.Communication.Server is
procedure Shutdown;
-- Shutdown the communication HTTP server
end AWS.Communication.Server;
13.8 AWS.Config
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2000-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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
pragma Ada_2012;
with System;
with GNAT.Regexp;
package AWS.Config is
-- per-server options.
procedure Load_Config;
-- Load configuration and store it into an internal object. This can be
-- called when only some server-wide configuration are to be set from
-- .ini files for example.
------------------------
-- Per Server options --
------------------------
------------
-- Server --
------------
----------------
-- Connection --
----------------
-- connections.
----------
-- Data --
----------
---------
-- Log --
---------
generic
with procedure Field_Id (Id : String);
procedure Log_Extended_Fields_Generic_Iterate (O : Object);
-- Calls procedure Field_Id for each extended http log field identifier
------------
-- Status --
------------
-- Filename for the down arrow image used in the status page
--------------
-- Timeouts --
--------------
--------------
-- Security --
--------------
-------------------------
-- Per Process options --
-------------------------
private
-- implementation removed
end AWS.Config;
13.9 AWS.Config.Ini
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2000-2012, 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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
-- Handle .ini style configuration files. In those files each option is on one
-- line. The first word is the option name and the second one is the option
-- value.
package AWS.Config.Ini is
procedure Read
(Config : in out Object;
Filename : String);
-- Read Filename and update the configuration object with the
-- options read from it. Raises Ada.Text_IO.Name_Error if Filename does
-- not exist. Raises Constraint_Error in case of wrong any parameter name
-- or value.
end AWS.Config.Ini;
13.10 AWS.Config.Set
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2000-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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
package AWS.Config.Set is
------------------------
-- Per Server Options --
------------------------
------------
-- Server --
------------
----------------
-- Connection --
----------------
procedure Free_Slots_Keep_Alive_Limit
(O : in out Object; Value : Natural);
-- The minimum number of free slots where keep-alive connections are still
-- enabled. After this limit no more keep-alive connection will be
-- accepted by the server. This parameter must be used for heavy-loaded
-- servers to make sure the server will never run out of slots. This limit
-- must be less than Max_Connection.
----------
-- Data --
----------
---------
-- Log --
---------
------------
-- Status --
------------
--------------
-- Timeouts --
--------------
procedure Cleaner_Wait_For_Client_Timeout
(O : in out Object;
Value : Duration);
-- Number of seconds to timout on waiting for a client request.
-- This is a timeout for regular cleaning task.
procedure Cleaner_Client_Header_Timeout
(O : in out Object;
Value : Duration);
-- Number of seconds to timout on waiting for client header.
-- This is a timeout for regular cleaning task.
procedure Cleaner_Client_Data_Timeout
(O : in out Object;
Value : Duration);
-- Number of seconds to timout on waiting for client message body.
-- This is a timeout for regular cleaning task.
procedure Cleaner_Server_Response_Timeout
(O : in out Object;
Value : Duration);
-- Number of seconds to timout on waiting for client to accept answer.
-- This is a timeout for regular cleaning task.
procedure Force_Wait_For_Client_Timeout
(O : in out Object;
Value : Duration);
-- Number of seconds to timout on waiting for a client request.
-- This is a timeout for urgent request when resources are missing.
procedure Force_Client_Header_Timeout
(O : in out Object;
Value : Duration);
-- Number of seconds to timout on waiting for client header.
-- This is a timeout for urgent request when resources are missing.
procedure Force_Client_Data_Timeout
(O : in out Object;
Value : Duration);
-- Number of seconds to timout on waiting for client message body.
-- This is a timeout for urgent request when resources are missing.
procedure Force_Server_Response_Timeout
(O : in out Object;
Value : Duration);
-- Number of seconds to timout on waiting for client to accept answer.
-- This is a timeout for urgent request when resources are missing.
--------------
-- Security --
--------------
-------------------------
-- Per Process Options --
-------------------------
procedure Parameter
(Config : in out Object;
Name : String;
Value : String;
Error_Context : String := "");
-- Set one of the AWS HTTP per server parameters. Raises Constraint_Error
-- in case of wrong parameter name or wrong parameter value.
-- Error_Context may contain additional information about the parameter.
-- This message will be added to the Constraint_Error exception.
-- One way to use Error_Context is to set it with information about
procedure Parameter
(Name : String;
Value : String;
Error_Context : String := "");
-- Set one of the AWS HTTP per process parameters. See description above
end AWS.Config.Set;
13.11 AWS.Containers.Tables
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2000-2017, 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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
pragma Ada_2012;
with Ada.Strings.Unbounded;
package AWS.Containers.Tables is
use Ada.Strings.Unbounded;
function Get
(Table : Table_Type;
Name : String;
N : Positive := 1) return String
with Post => (if N > Count (Table, Name) then Get'Result'Length = 0);
-- Returns the Nth value associated with Key into Table. Returns
-- the emptry string if key does not exist.
function Get_Name
(Table : Table_Type; N : Positive := 1) return String
with Post => (if N > Count (Table) then Get_Name'Result'Length = 0);
-- Returns the Nth Name in Table or the empty string if there is
-- no parameter with this number.
function Get_Value
(Table : Table_Type; N : Positive := 1) return String
with Post => (if N > Count (Table) then Get_Value'Result'Length = 0);
-- Returns the Nth Value in Table or the empty string if there is
-- no parameter with this number.
function Get_Values
(Table : Table_Type; Name : String) return VString_Array
with Post => Get_Values'Result'Length = Count (Table, Name);
-- Returns all values for the specified parameter key name
generic
with procedure Process (Name, Value : String);
procedure Generic_Iterate_Names
(Table : Table_Type; Separator : String);
-- Iterates over all names in the table.
-- All Values of the same name are separated by Separator string.
procedure Iterate_Names
(Table : Table_Type;
Separator : String;
Process : not null access procedure (Name, Value : String));
function Union
(Left : Table_Type;
Right : Table_Type;
Unique : Boolean) return Table_Type;
-- Concatenates two tables, If Unique is True do not add Right container
-- element into result when element with the same name already exists in
-- the Left container.
procedure Add
(Table : in out Table_Type;
Name, Value : String)
with Post => Count (Table) = Count (Table'Old) + 1
or else
Count (Table, Name) = Count (Table'Old, Name) + 1;
-- Add a new Key/Value pair into Table. A new value is always added,
-- even if there is already an entry with the same name.
procedure Update
(Table : in out Table_Type;
Name : String;
Value : String;
N : Positive := 1)
with
Pre =>
-- Count + 1 means it is added at the end of the table
N <= Count (Table, Name) + 1,
Post =>
-- Value already exists, it is updated
(N <= Count (Table'Old, Name)
and then Count (Table, Name) = Count (Table'Old, Name))
-- New value appended
or else
(N = Count (Table'Old, Name) + 1
and then N = Count (Table, Name));
-- Update the N-th Value with the given Name into the Table.
-- The container could already have more than one value associated with
-- this name.
procedure Case_Sensitive
(Table : in out Table_Type;
Mode : Boolean);
-- If Mode is True it will use all parameters with case sensitivity
private
-- implementation removed
end AWS.Containers.Tables;
13.12 AWS.Cookie
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2010-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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
-- A package for basic HTTP state management, ie. cookies. Tokens and
-- attributes adhere to RFC-2109: http://tools.ietf.org/html/rfc2109
with AWS.Default;
with AWS.Response;
with AWS.Status;
package AWS.Cookie is
Response_Data_Not_Initialized : exception;
-- The Response_Data_Not_Initialized exception is raised when trying to add
-- headers to an un-initialized AWS.Response.Data object.
-- The AWS.Response.Data object is initialized using the
-- AWS.Response.Build function.
function Exists
(Request : Status.Data;
Key : String;
Case_Sensitive : Boolean := True) return Boolean;
-- Check if the 'Key' cookie exists in AWS.Headers.List. Return Boolean
-- True of the cookie exists, else Boolean False.
procedure Expire
(Content : in out Response.Data;
Key : String;
Path : String := "/");
-- Expire the 'Key' cookie. This is done by setting the Max-Age attribute
-- to 0. The Value of the cookie is also set to "", in case a browser does
-- not honor the Max-Age attribute.
function Get
(Request : Status.Data;
Key : String;
Case_Sensitive : Boolean := True) return String;
-- Return the 'Key' cookie from AWS.Headers.List. If the cookie does not
-- exist, return an empty string, ie. ""
function Get
(Request : Status.Data;
Key : String;
Case_Sensitive : Boolean := True) return Integer;
-- Return the 'Key' cookie from AWS.Headers.List. If the cookie does not
-- exist or can't be converted from String to Integer then return 0.
function Get
(Request : Status.Data;
Key : String;
Case_Sensitive : Boolean := True) return Float;
-- Return the 'Key' cookie from AWS.Headers.List. If the cookie does not
-- exist or can't be converted from String to Float then return 0.0.
function Get
(Request : Status.Data;
Key : String;
Case_Sensitive : Boolean := True) return Boolean;
-- Return the 'Key' cookie from AWS.Headers.List. Only if the cookie value
-- equals "True" is Boolean True returned, else Boolean False is returned.
procedure Set
(Content : in out Response.Data;
Key : String;
Value : String;
Comment : String := "";
Domain : String := "";
Max_Age : Duration := Default.Ten_Years;
Path : String := "/";
Secure : Boolean := False)
with Pre => Response.Mode (Content) /= Response.No_Data;
-- Set a new cookie named 'Key' with value 'Value'. See RFC 2109 for more
-- information about the individual cookie attributes:
-- http://tools.ietf.org/html/rfc2109
--
-- Exceptions:
-- Response_Data_Not_Initialized
-- Is raised if AWS.Cookie.Set is called before the Content object has
-- been initialized by a call to AWS.Response.Build
procedure Set
(Content : in out Response.Data;
Key : String;
Value : Integer;
Comment : String := "";
Domain : String := "";
Max_Age : Duration := Default.Ten_Years;
Path : String := "/";
Secure : Boolean := False)
with Pre => Response.Mode (Content) /= Response.No_Data;
-- Set a new cookie named 'Key' with Integer value 'Value'. The Integer is
-- converted to a String, as both cookie keys and values are inherently
-- strings.
--
-- Exceptions:
-- Response_Data_Not_Initialized
-- Is raised if AWS.Cookie.Set is called before the Content object has
-- been initialized by a call to AWS.Response.Build
procedure Set
(Content : in out Response.Data;
Key : String;
Value : Float;
Comment : String := "";
Domain : String := "";
Max_Age : Duration := Default.Ten_Years;
Path : String := "/";
Secure : Boolean := False)
with Pre => Response.Mode (Content) /= Response.No_Data;
-- Set a new cookie named 'Key' with Float value 'Value'. The Float is
-- converted to a String, as both cookie keys and values are inherently
-- strings.
--
-- Exceptions:
-- Response_Data_Not_Initialized
-- Is raised if AWS.Cookie.Set is called before the Content object has
-- been initialized by a call to AWS.Response.Build
procedure Set
(Content : in out Response.Data;
Key : String;
Value : Boolean;
Comment : String := "";
Domain : String := "";
Max_Age : Duration := Default.Ten_Years;
Path : String := "/";
Secure : Boolean := False)
with Pre => Response.Mode (Content) /= Response.No_Data;
-- Set a new cookie named 'Key' with Boolean value 'Value'. The Boolean is
-- converted to a String ("False" or "True"), as both cookie keys and
-- values are inherently strings.
--
-- Exceptions:
-- Response_Data_Not_Initialized
-- Is raised if AWS.Cookie.Set is called before the Content object has
-- been initialized by a call to AWS.Response.Build
private
-- implementation removed
end AWS.Cookie;
13.13 AWS.Default
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2000-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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
pragma Ada_2012;
-- This package contains the default AWS configuration values. These values
-- are used to initialize the configuration objects. Users should not modify
-- the values here, see AWS.Config.* API.
with System;
use System;
-- Server configuration
-- Client configuration
-- Log values. The character '@' in the error log filename prefix is
-- replaced by the running program name.
-- Session
-- Context
-- Transient pages
-- Server's timeouts
-- Directory template
-- Status page
-- Security
-- Priorities
end AWS.Default;
13.14 AWS.Dispatchers
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2000-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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
pragma Ada_2012;
with Ada.Finalization;
with AWS.Response;
with AWS.Status;
with AWS.Utils;
package AWS.Dispatchers is
function Dispatch
(Dispatcher : Handler;
Request : Status.Data) return Response.Data is abstract;
-- Call the appropriate inherited dispatcher
private
-- implementation removed
end AWS.Dispatchers;
13.15 AWS.Dispatchers.Callback
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2000-2013, 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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
pragma Ada_2012;
with AWS.Dispatchers;
with AWS.Response;
with AWS.Status;
package AWS.Dispatchers.Callback is
private
-- implementation removed
end AWS.Dispatchers.Callback;
13.16 AWS.Exceptions
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2003-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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
with Ada.Exceptions;
with AWS.Log;
with AWS.Response;
with AWS.Status;
package AWS.Exceptions is
use Ada.Exceptions;
Slot : Positive;
-- The failing slot number
Request : Status.Data;
-- The complete request information that was served when the slot has
-- failed. This variable is set only when Fatal is False.
end record;
Error : Data;
Answer : in out Response.Data);
-- Unexpected exception handler can be set to monitor server errors.
-- Answer can be set with the answer to send back to the client's
-- browser. Note that this is possible only for non fatal error
-- (i.e. Error.Fatal is False).
-- Log is the error log object for the failing server, it can be used
-- to log user's information (if error log is activated for this
-- server). Note that the server will have already logged information
-- about the problem.
end AWS.Exceptions;
13.17 AWS.Headers
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2000-2015, 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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
pragma Ada_2012;
with AWS.Containers.Tables;
with AWS.Net;
package AWS.Headers is
Format_Error : exception;
-- Raised when header line format is wrong
private
-- implementation removed
end AWS.Headers;
13.18 AWS.Headers.Values
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2002-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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
with Ada.Strings.Unbounded;
package AWS.Headers.Values is
use Ada.Strings.Unbounded;
-----------
-- Parse --
-----------
generic
-------------------
-- Split / Index --
-------------------
function Index
(Set : Values.Set;
Name : String;
Case_Sensitive : Boolean := True) return Natural;
-- Returns index for Name in the set or 0 if Name not found.
-- If Case_Sensitive is false the find is case_insensitive.
---------------------------
-- Other search routines --
---------------------------
function Search
(Header_Value : String;
Name : String;
Case_Sensitive : Boolean := True) return String;
-- Returns Value for Name in Header_Value or the empty string if Name not
-- found. If Case_Sensitive is False the search is case insensitive.
function Get_Unnamed_Value
(Header_Value : String; N : Positive := 1) return String;
-- Returns N-th un-named value from Header_Value
function Unnamed_Value_Exists
(Header_Value : String;
Value : String;
Case_Sensitive : Boolean := True) return Boolean;
-- Returns True if the unnamed value specified has been found in
-- Header_Value.
end AWS.Headers.Values;
13.19 AWS.Jabber
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2002-2013, 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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
pragma Ada_2012;
end AWS.Jabber;
13.20 AWS.LDAP.Client
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2003-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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
-- Provides an API to add, read, modify and delete information from a LDAP
-- server. It is a thick binding, see AWS.LDAP.Thin for a thin binding.
--
-- This API has been tested on Windows and Linux (OpenLDAP).
with Ada.Containers.Indefinite_Vectors;
with Ada.Exceptions;
with Ada.Strings.Unbounded;
with AWS.LDAP.Thin;
package AWS.LDAP.Client is
use Ada.Exceptions;
use Ada.Strings.Unbounded;
type Scope_Type is
(LDAP_Scope_Default, LDAP_Scope_Base,
LDAP_Scope_One_Level, LDAP_Scope_Subtree);
-- LDAP scope for the search
----------------
-- Attributes --
----------------
function Attributes
(S1, S2, S3, S4, S5, S6, S7, S8, S9, S10 : String := "")
return Attribute_Set;
-- Returns a String_Set object containing only none empty values. Values
-- for S1 through S10 must be set in the order of the parameters. This is
-- an helper routine to help building an array of unbounded string from a
-- set of string.
function Cat
(S1, S2, S3, S4, S5, S6, S7, S8, S9, S10 : String := "") return String;
-- Returns a string object containing only none empty values. Values for
-- S1 through S10 must be set in the order of the parameters. All values
-- are catenated and separated with a coma. This is an helper routine to
-- help building a filter objects or base distinguished name.
----------------
-- Initialize --
----------------
function Init
(Host : String;
Port : Positive := Default_Port) return Directory;
-- Must be called first, to initialize the LDAP communication with the
-- server. Returns Null_Directory in case of error.
procedure Bind
(Dir : Directory;
Login : String;
Password : String);
-- Bind to the server by providing a login and password
------------
-- Search --
------------
function Search
(Dir : Directory;
Base : String;
Filter : String;
Scope : Scope_Type := LDAP_Scope_Default;
Attrs : Attribute_Set := Null_Set;
Attrs_Only : Boolean := False) return LDAP_Message;
-- Do a search on the LDAP server. Base is the name of the database.
-- Filter can be used to retrieve a specific set of entries. Attrs specify
-- the set of attributes to retrieve. If Attrs_Only is set to True only
-- the types are returned. Raises LDAP_Error in case of problem.
-----------------------
-- Add/Modify/Delete --
-----------------------
package LDAP_Mods is
new Ada.Containers.Indefinite_Vectors (Positive, Mod_Element);
-- Vector-based Storage for all modification elements. Will be
-- mapped to C LDAPMod **.
procedure Add
(Dir : Directory;
DN : String;
Mods : LDAP_Mods.Vector);
-- Add an entry specified by 'DN' to the LDAP server. The Mods-Vector
-- contains the attributes for the entry.
procedure Modify
(Dir : Directory;
DN : String;
Mods : LDAP_Mods.Vector);
-- Modify an attribute of entry specified by 'DN'. The Mods-Vector
-- contains the attributes to add/replace/delete for the entry.
---------------
-- Iterators --
---------------
function First_Entry
(Dir : Directory;
Chain : LDAP_Message) return LDAP_Message;
-- Returns the first entry (or Node) for the search result (Chain)
function Next_Entry
(Dir : Directory;
Entries : LDAP_Message) return LDAP_Message;
-- Returns next entry (or Node) for Entries
function Count_Entries
(Dir : Directory;
Chain : LDAP_Message) return Natural;
-- Returns the number of entries in the search result (Chain)
generic
with procedure Action
(Node : LDAP_Message;
Quit : in out Boolean);
procedure For_Every_Entry (Dir : Directory; Chain : LDAP_Message);
-- This iterator call Action for each entry (Node) found in the LDAP result
-- set as returned by the search procedure. Quit can be set to True to
-- stop iteration; its initial value is False.
function First_Attribute
(Dir : Directory;
Node : LDAP_Message;
BER : not null access BER_Element) return String;
-- Returns the first attribute for the entry. It initialize an iteraror
-- (the BER structure). The BER structure must be released after used by
-- using the Free routine below.
function Next_Attribute
(Dir : Directory;
Node : LDAP_Message;
BER : BER_Element) return String;
-- Returns next attribute for iterator BER. First_Attribute must have been
-- called to initialize this iterator.
generic
with procedure Action
(Attribute : String;
Quit : in out Boolean);
procedure For_Every_Attribute
(Dir : Directory;
Node : LDAP_Message);
-- This iterator call action for each attribute found in the LDAP Entries
-- Node as returned by First_Entry or Next_Entry. Quit can be set to True
-- to stop iteration; its initial value is False.
---------------
-- Accessors --
---------------
function Get_DN
(Dir : Directory;
Node : LDAP_Message) return String;
-- Returns the distinguished name for the given entry Node
function Get_Values
(Dir : Directory;
Node : LDAP_Message;
Target : String) return String_Set;
-- Returns the list of values of a given attribute (Target) found in entry
-- Node.
function Explode_DN
(DN : String;
No_Types : Boolean := True) return String_Set;
-- Breaks up an entry name into its component parts. If No_Types is set to
-- True the types information ("cn=") won't be included.
private
-- implementation removed
end AWS.LDAP.Client;
13.21 AWS.Log
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2000-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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
-- This package handle the logging facility for AWS. The log file is named
-- '<progname>-Y-M-D.log' and is written by default in the directory where
-- the server is launched, see configuration file.
--
-- Note that this package is used internally by AWS to log server requests
-- but it can also be used by users to handle application's log.
--
-- This package is thread safe.
with AWS.Containers.String_Vectors;
with AWS.Headers;
with AWS.Messages;
with AWS.Response;
with AWS.Status;
package AWS.Log is
-- Access to a procedure that handles AWS access and/or error log data.
-- If the access and/or error logs are started with a Callback procedure
-- set, then AWS will no longer handle writing the log data to file, nor
-- will it rotate or split the data. In short : If you set a Callback, it's
-- up to you to handle these things.
-- The raw log data generated by AWS is simply handed verbatim to the
-- Callback procedure.
procedure Start
(Log : in out Object;
Split : Split_Mode := None;
Size_Limit : Natural := 0;
File_Directory : String := Not_Specified;
Filename_Prefix : String := Not_Specified;
Auto_Flush : Boolean := False);
-- Activate server's activity logging. Split indicate the way the log file
-- should be created. If Size_Limit more than zero and size of log file
-- become more than Size_Limit, log file would be splitted. Filename_Prefix
-- is the log filename prefix. If it is not specified the default prefix is
-- the program name. Set Auto_Flush to True if you want every write to the
-- log to be flushed (not buffered). Auto_Flush should be set to True only
-- for logs with few entries per second as the flush has a performance
-- penalty.
procedure Start
(Log : in out Object;
Writer : Callback;
Name : String);
-- Activate server's activity logging and send all log data to Callback.
-- When the logging object is started with a Callback no splitting or size
-- limits are imposed on the logging data. This will all have to be handled
-- in the Callback.
-- When a log is started with a Callback, all log data is passed verbatim
-- to the Callback.
-- The Name String is returned when the Filename function is called. This
-- serves no other function than to label the Callback procedure.
procedure Set_Field
(Log : Object; Data : in out Fields_Table; Id, Value : String);
-- Set field value into the extended log record. Data could be used only
-- in one task and with one log file. Different tasks could write own Data
procedure Set_Header_Fields
(Log : Object;
Data : in out Fields_Table;
Prefix : String;
Header : AWS.Headers.List);
-- Set header fields into extended log record.
-- Name of the header fields would be <Prefix>(<Header_Name>).
-- Prefix should be "cs" - Client to Server or "sc" - Server to Client.
procedure Write
(Log : in out Object;
Connect_Stat : Status.Data;
Answer : Response.Data);
-- Write log info if activated (i.e. Start routine above has been called)
procedure Write
(Log : in out Object;
Connect_Stat : Status.Data;
Status_Code : Messages.Status_Code;
Content_Length : Response.Content_Length_Type);
-- Write log info if activated (i.e. Start routine above has been called).
-- This version separated the Content_Length from Status.Data, this is
-- required for example in the case of a user defined stream content. See
-- AWS.Resources.Stream.
procedure Write
(Log : in out Object;
Connect_Stat : Status.Data;
Data : String);
-- Write user's log info if activated. (i.e. Start routine above has been
-- called).
-- activated.
-- If a Callback is used to handle the log, then the name given in the
-- Start procedure is returned. See the Start procedure for starting logs
-- with a Callback.
private
-- implementation removed
end AWS.Log;
13.22 AWS.Messages
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2000-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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
pragma Ada_2012;
with Ada.Calendar;
with Ada.Streams;
with Ada.Strings.Unbounded;
package AWS.Messages is
use Ada;
use Ada.Streams;
use Ada.Strings.Unbounded;
-----------------
-- HTTP tokens --
-----------------
------------------------
-- HTTP header tokens --
------------------------
"Access-Control-Allow-Headers";
Access_Control_Allow_Methods_Token : constant String :=
"Access-Control-Allow-Methods";
Access_Control_Allow_Origin_Token : constant String :=
"Access-Control-Allow-Origin";
Access_Control_Expose_Headers_Token : constant String :=
"Access-Control-Expose-Headers";
Access_Control_Max_Age_Token : constant String :=
"Access-Control-Max-Age";
-- Other tokens
Proxy_Connection_Token : constant String := "Proxy-Connection";
Content_Disposition_Token : constant String := "Content-Disposition";
SOAPAction_Token : constant String := "SOAPAction";
Content_Id_Token : constant String := "Content-ID";
Content_Transfer_Encoding_Token : constant String :=
"Content-Transfer-Encoding";
-- WebSockets tokens
Websocket_Token : constant String := "WebSocket";
Sec_WebSocket_Accept_Token : constant String := "Sec-WebSocket-Accept";
Sec_WebSocket_Protocol_Token : constant String := "Sec-WebSocket-Protocol";
Sec_WebSocket_Key_Token : constant String := "Sec-WebSocket-Key";
Sec_WebSocket_Key1_Token : constant String := "Sec-WebSocket-Key1";
Sec_WebSocket_Key2_Token : constant String := "Sec-WebSocket-Key2";
Sec_WebSocket_Version_Token : constant String := "Sec-WebSocket-Version";
Sec_WebSocket_Origin_Token : constant String := "Sec-WebSocket-Origin";
Sec_WebSocket_Location_Token : constant String := "Sec-WebSocket-Location";
Chat_Token : constant String := "chat";
-----------------
-- Status Code --
-----------------
type Status_Code is
(S100, S101, S102,
-- 1xx : Informational - Request received, continuing process
S400, S401, S402, S403, S404, S405, S406, S407, S408, S409,
S410, S411, S412, S413, S414, S415, S416, S417, S422, S423, S424,
-- 4xx : Client Error - The request contains bad syntax or cannot be
-- fulfilled
----------------------
-- Content encoding --
----------------------
-------------------
-- Cache_Control --
-------------------
case CKind is
when Request =>
Max_Stale : Delta_Seconds := Unset;
Min_Fresh : Delta_Seconds := Unset;
Only_If_Cached : Boolean := False;
function To_Cache_Data
(Kind : Cache_Kind; Value : Cache_Option) return Cache_Data;
-- Returns a Cache_Data record parsed out of Cache_Option
----------
-- ETag --
----------
function Create_ETag
(Name : String; Weak : Boolean := False) return ETag_Value;
-------------------------------
-- HTTP message constructors --
-------------------------------
function Content_Type
(Format : String; Boundary : String := "") return String with Inline;
function Content_Disposition
(Format, Name, Filename : String) return String with Inline;
-- Note that this is not part of HTTP/1.1 standard, it is there because
-- there is a lot of implementation around using it. This header is used
-- in multipart data.
function Status_Line
(Code : Status_Code;
function WWW_Authenticate
(Realm, Nonce : String; Stale : Boolean) return String with Inline;
-- Digest authentication request
-----------------------
-- helper functions --
-----------------------
private
-- implementation removed
end AWS.Messages;
13.23 AWS.MIME
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2000-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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
package AWS.MIME is
-- Some content type constants. All of them will be defined into this
-- package and associated with the right extensions. It is possible to
-- add new MIME types with the routines below or by placing a file named
-- aws.mime into the startup directory.
--
-- A MIME type is written in two parts: type/format
----------
-- Text --
----------
-----------
-- Image --
-----------
-----------------
-- Application --
-----------------
-----------
-- Audio --
-----------
-----------
-- Video --
-----------
---------------
-- Multipart --
---------------
-------------
-- Setting --
-------------
---------------
-- MIME Type --
---------------
function Content_Type
(Filename : String;
Default : String := Application_Octet_Stream) return String;
-- Returns the MIME Content Type based on filename's extension or if not
-- found the MIME Content type where Filename matches one of the specific
-- rules set by Add_Regexp (see below).
-- Returns Default if the file type is unknown (i.e. no extension and
-- no regular expression match filename).
end AWS.MIME;
13.24 AWS.Net
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2000-2016, 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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
pragma Ada_2012;
-- There is two implementations for this spec. One for standard sockets and
-- one for SSL socket. Note that the SSL implementation does support standard
-- socket too, this is controlled with the Security boolean on rountine
-- below. The corresponding implementation will be selected at build time.
with Ada.Exceptions;
with Ada.Finalization;
with Ada.Streams;
package AWS.Net is
use Ada;
use Ada.Exceptions;
use Ada.Streams;
Socket_Error : exception;
-- Raised by all routines below, a message will indicate the nature of
-- the error.
----------------
-- Initialize --
----------------
function Socket
(Security : Boolean) return not null access Socket_Type'Class;
-- Create a dynamically allocated uninitialized socket
procedure Bind
(Socket : in out Socket_Type;
Port : Natural;
Host : String := "";
Reuse_Address : Boolean := False;
Family : Family_Type := Family_Unspec) is abstract;
-- Create the server socket and bind it on the given port.
-- Using 0 for the port will tell the OS to allocate a non-privileged
-- free port. The port can be later retrieved using Get_Port on the
-- bound socket.
procedure Listen
(Socket : Socket_Type; Queue_Size : Positive := 5) is abstract;
-- Set the queue size of the socket
procedure Accept_Socket
procedure Connect
(Socket : in out Socket_Type;
Host : String;
Port : Positive;
Wait : Boolean := True;
Family : Family_Type := Family_Unspec) is abstract
with Pre'Class => Host'Length > 0;
-- Connect a socket on a given host/port. If Wait is True Connect will wait
-- for the connection to be established for timeout seconds, specified by
-- Set_Timeout routine. If Wait is False Connect will return immediately,
-- not waiting for the connection to be establised. It is possible to wait
-- for the Connection completion by calling Wait routine with Output set to
-- True in Events parameter.
procedure Shutdown
(Socket : Socket_Type;
How : Shutmode_Type := Shut_Read_Write) is abstract;
-- Shutdown the read, write or both side of the socket.
-- If How is Both, close it. Does not raise Socket_Error if the socket is
-- not connected or already shutdown.
--------
-- IO --
--------
procedure Send
(Socket : Socket_Type'Class; Data : Stream_Element_Array);
-- Send Data chunk to the socket
procedure Send
(Sockets : Socket_Set; Data : Stream_Element_Array);
-- Send Data to all sockets from the socket set. This call will ensure that
-- the data are sent in priority to client waiting for reading. That is,
-- slow connection for one sokcet should not delay the fast connections.
-- Yet, this routine will return only when the data is sent to all sockets.
procedure Send
(Socket : Socket_Type;
Data : Stream_Element_Array;
Last : out Stream_Element_Offset) is abstract;
-- Try to place data to Socket's output buffer. If all data cannot be
-- placed to the socket output buffer, Last will be lower than Data'Last,
-- if no data has been placed into the output buffer, Last is set to
-- Data'First - 1. If Data'First is equal to Stream_Element_Offset'First
procedure Receive
(Socket : Socket_Type;
Data : out Stream_Element_Array;
Last : out Stream_Element_Offset) is abstract;
-- Read a chunk of data from the socket and set appropriate Last value.
-- This call always returns some data and will wait for incoming data only
-- if necessary.
function Receive
(Socket : Socket_Type'Class;
Max : Stream_Element_Count := 4096) return Stream_Element_Array;
-- Read a chunk of data from the socket and returns it. This call always
-- returns some data and will wait for incoming data only if necessary.
------------
-- Others --
------------
procedure Set_Send_Buffer_Size
(Socket : Socket_Type; Size : Natural) is abstract;
-- Set the internal socket send buffer size.
-- Do not confuse with buffers for the AWS.Net.Buffered operations.
procedure Set_Receive_Buffer_Size
(Socket : Socket_Type; Size : Natural) is abstract;
-- Set the internal socket receive buffer size.
-- Do not confuse with buffers for the AWS.Net.Buffered operations.
procedure Set_Blocking_Mode
(Socket : in out Socket_Type; Blocking : Boolean);
pragma Obsolescent ("Use Set_Timeout instead");
-- Set the blocking mode for the socket
procedure Set_No_Delay
(Socket : Socket_Type; Value : Boolean := True) is null;
-- Set/clear TCP_NODELAY option on socket
function Wait
(Socket : Socket_Type'Class;
Events : Wait_Event_Set) return Event_Set;
-- Waiting for Input/Output/Error events.
-- Waiting time is defined by Set_Timeout.
-- Empty event set in result mean that timeout occured.
function Check
(Socket : Socket_Type'Class;
Events : Wait_Event_Set) return Event_Set;
-- Check for Input/Output/Error events availability.
-- No wait for socket timeout.
function Poll
(Socket : Socket_Type'Class;
Events : Wait_Event_Set;
Timeout : Duration) return Event_Set;
-- Wait events on socket descriptor for specified Timeout
function Is_Timeout
(Socket : Socket_Type;
E : Exception_Occurrence) return Boolean;
-- Returns True if the message associated with the Exception_Occurence for
-- a Socket_Error is a timeout.
function Is_Peer_Closed
(Socket : Socket_Type;
E : Exception_Occurrence) return Boolean;
-- Returns True if the message associated with the Exception_Occurence for
-- a Socket_Error is a "socket closed by peer".
function To_FD_Set
(Socket : Socket_Type;
Events : Wait_Event_Set;
Size : Positive := 1) return FD_Set'Class;
-- Create appropriate socket FD set and put Socket fd there
--------------------
-- Socket FD sets --
--------------------
procedure Add
(FD_Set : in out FD_Set_Access;
FD : FD_Type;
Event : Wait_Event_Set);
-- Add FD to the end of FD_Set
procedure Add
(FD_Set : in out Net.FD_Set;
FD : FD_Type;
Event : Wait_Event_Set) is abstract;
-- Add FD to the end of FD_Set
procedure Replace
(FD_Set : in out Net.FD_Set;
Index : Positive;
FD : FD_Type) is abstract
with Pre'Class => Index <= Length (FD_Set);
-- Replaces the socket FD in FD_Set
procedure Set_Mode
(FD_Set : in out Net.FD_Set;
Index : Positive;
Mode : Wait_Event_Set) is abstract
with Pre'Class => Index <= Length (FD_Set);
-- Sets the kind of network events to wait for
procedure Set_Event
(FD_Set : in out Net.FD_Set;
Index : Positive;
Event : Wait_Event_Type;
Value : Boolean) is abstract
with Pre'Class => Index <= Length (FD_Set);
function Copy
(FD_Set : not null access Net.FD_Set;
Size : Natural) return FD_Set_Access is abstract;
-- Allocates and copy the given FD_Set with different size
procedure Remove
(FD_Set : in out Net.FD_Set; Index : Positive) is abstract
with Pre'Class => Index <= Length (FD_Set);
-- Removes socket FD from Index position.
-- Last socket FD in FD_Set is placed at position Index.
procedure Wait
(FD_Set : in out Net.FD_Set;
Timeout : Duration;
Count : out Natural) is abstract
with Post'Class => Count <= Length (FD_Set);
-- Wait for network events on the sockets FD set. Count value is the
-- number of socket FDs with non empty event set.
procedure Next
(FD_Set : Net.FD_Set; Index : in out Positive) is abstract
with
Pre'Class => Index <= Length (FD_Set) + 1,
Post'Class => Index <= Length (FD_Set) + 1;
-- Looking for an active (for which an event has been detected by routine
-- Wait above) socket FD starting from Index and return Index of the found
-- active socket FD. Use functions Status to retreive the kind of network
-- events for this socket.
function Status
(FD_Set : Net.FD_Set;
Index : Positive) return Event_Set is abstract
with Pre'Class => Index <= Length (FD_Set);
-- Returns events for the socket FD at position Index
private
-- implementation removed
end AWS.Net;
13.25 AWS.Net.Buffered
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2002-2015, 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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
pragma Ada_2012;
-- All routines below are buffered both ways (input and output) for better
-- performances.
package AWS.Net.Buffered is
------------
-- Output --
------------
procedure Write
(Socket : Socket_Type'Class; Item : Stream_Element_Array);
-- Write Item into Socket's buffer. Send the buffer to the socket if full
-----------
-- Input --
-----------
Data_Overflow : exception;
-- Raised from Get_Line and Read_Until routines when size of receiving data
-- exceeds the limit defined by Set_Input_Limit. It avoid unlimited dynamic
-- memory allocation inside of Get_Line and Read_Until when client trying
-- to attack the server by the very long lines in request. Moreover it
-- avoid stack overflow on very long data returned from Get_Line and
-- Read_Until.
procedure Read
(Socket : Socket_Type'Class; Data : out Stream_Element_Array) with Inline;
-- Returns Data array read from the socket
function Read
(Socket : Socket_Type'Class;
Max : Stream_Element_Count := 4096) return Stream_Element_Array
with Inline;
-- Returns an array of bytes read from the socket
procedure Read
(Socket : Socket_Type'Class;
Data : out Stream_Element_Array;
Last : out Stream_Element_Offset);
-- Read any available data from buffered socket.
-- Wait if no data available.
-- Same semantic with Net.Receive procedure.
procedure Read_Buffer
(Socket : Socket_Type'Class;
Data : out Stream_Element_Array;
Last : out Stream_Element_Offset);
-- Returns data read from the internal socket's read buffer. No data are
-- read from the socket. This can be useful when switching to non buffered
-- mode.
function Read_Until
(Socket : Socket_Type'Class;
Delimiter : Stream_Element_Array;
Wait : Boolean := True) return Stream_Element_Array;
-- Read data on the Socket until the delimiter (including the delimiter).
-- If Wait is False the routine looking for the delimiter only in the
-- cache buffer, if delimiter not found in the cache buffer, empty array
-- is be returned.
-- If returned data is without delimiter at the end, it means that socket
-- is closed from peer or socket error occured and rest of data returned.
-- This routine could loose some data on timeout if does not meet delimiter
-- longer then Read buffer size.
function Read_Until
(Socket : Socket_Type'Class;
Delimiter : String;
Wait : Boolean := True) return String;
-- Same as above but returning a standard string
-------------
-- Control --
-------------
end AWS.Net.Buffered;
13.26 AWS.Net.Log
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2004-2013, 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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
pragma Ada_2012;
package AWS.Net.Log is
procedure Start
(Write : Write_Callback;
Event : Event_Callback := null;
Error : Error_Callback := null);
-- Activate the logging
procedure Write
(Direction : Data_Direction;
Socket : Socket_Type'Class;
Data : Stream_Element_Array;
Last : Stream_Element_Offset);
-- Write sent/received data indirectly through the callback routine,
-- if activated (i.e. Start routine above has been called). Otherwise this
-- call does nothing.
procedure Stop;
-- Stop logging activity
end AWS.Net.Log;
13.27 AWS.Net.Log.Callbacks
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2004-2012, 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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
package AWS.Net.Log.Callbacks is
procedure Initialize
(Filename : String;
Callback : Write_Callback);
-- Initialize the logging, must be called before using the callbacks below
procedure Finalize;
-- Stop logging, close log file
procedure Text
(Direction : Data_Direction;
Socket : Socket_Type'Class;
Data : Stream_Element_Array;
Last : Stream_Element_Offset);
-- A text output, each chunk is output with an header and footer:
-- Data sent/received to/from socket <FD> (<size>/<buffer size>)
-- <data>
-- Total data sent: <nnn> received: <nnn>
procedure Binary
(Direction : Data_Direction;
Socket : Socket_Type'Class;
Data : Stream_Element_Array;
Last : Stream_Element_Offset);
-- A binary output, each chunk is output with an header and footer. The
-- data itself is written using a format close to the Emacs hexl-mode:
-- Data sent/received to/from socket <FD> (<size>/<buffer size>)
-- HH HH HH HH HH HH HH HH HH HH HH HH az.rt.mpl..q
-- Total data sent: <nnn> received: <nnn>
--
-- HH is the hex character number, if the character is not printable a dot
-- is written.
end AWS.Net.Log.Callbacks;
13.28 AWS.Net.SSL
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2002-2016, 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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
pragma Ada_2012;
-- This is the SSL based implementation of the Net package. The implementation
-- should depend only on AWS.Net.Std and the SSL library. It is important to
-- not call directly a socket binding here to ease porting.
with Ada.Calendar;
with System;
with AWS.Net.Std;
with SSL.Thin;
package AWS.Net.SSL is
----------------
-- Initialize --
----------------
--------
-- IO --
--------
--------------------
-- Initialization --
--------------------
type Method is
(SSLv23, SSLv23_Server, SSLv23_Client, -- Highest available SSL/TLS
procedure Initialize
(Config : in out SSL.Config;
Certificate_Filename : String;
Security_Mode : Method := SSLv23;
Priorities : String := "";
Ticket_Support : Boolean := False;
Key_Filename : String := "";
Exchange_Certificate : Boolean := False;
Certificate_Required : Boolean := False;
Trusted_CA_Filename : String := "";
CRL_Filename : String := "";
Session_Cache_Size : Natural := 16#4000#);
-- Initialize the SSL layer into Config. Certificate_Filename must point
-- to a valid certificate. Security mode can be used to change the
-- security method used by AWS. Key_Filename must be specified if the key
-- is not in the same file as the certificate. The Config object can be
-- associated with all secure sockets sharing the same options. If
-- Exchange_Certificate is True the client will send its certificate to
-- the server, if False only the server will send its certificate.
procedure Add_Host_Certificate
(Config : SSL.Config;
Host : String;
Certificate_Filename : String;
Key_Filename : String := "");
-- Support for Server name indication (SNI). Client can ask for different
-- host names on the same IP address. This routines provide a way to have
-- different certificates for different server host names.
procedure Initialize_Default_Config
(Certificate_Filename : String;
Security_Mode : Method := SSLv23;
Priorities : String := "";
Ticket_Support : Boolean := False;
Key_Filename : String := "";
Exchange_Certificate : Boolean := False;
Certificate_Required : Boolean := False;
Trusted_CA_Filename : String := "";
CRL_Filename : String := "";
Session_Cache_Size : Natural := 16#4000#);
-- As above but for the default SSL configuration which is will be used
-- for any socket not setting explicitly an SSL config object. Not that
-- this routine can only be called once. Subsequent calls are no-op. To
-- be effective it must be called before any SSL socket is created.
procedure Set_Config
(Socket : in out Socket_Type; Config : SSL.Config);
-- Set the SSL configuration object for the secure socket
function Secure_Client
(Socket : Net.Socket_Type'Class;
Config : SSL.Config := Null_Config) return Socket_Type;
-- Make client side SSL connection from plain socket.
-- SSL handshake does not performed. SSL handshake would be made
-- automatically on first Read/Write, or explicitly by the Do_Handshake
-- call. Do not free or close source socket after this call.
function Secure_Server
(Socket : Net.Socket_Type'Class;
Config : SSL.Config := Null_Config) return Socket_Type;
-- Make server side SSL connection from plain socket.
-- SSL handshake does not performed. SSL handshake would be made
-- automatically on first Read/Write, or explicitly by the Do_Handshake
-- call. Do not free or close source socket after this call.
procedure Set_Session_Cache_Size
(Size : Natural; Config : SSL.Config := Null_Config);
-- Set session cache size in the SSL context.
-- Null_Config mean default context.
function Session_Cache_Number
(Config : SSL.Config := Null_Config) return Natural;
-- Returns number of sessions currently in the cache.
-- Null_Config mean default context.
procedure Generate_DH;
-- Regenerates Diffie-Hellman parameters.
-- The call could take a quite long time.
-- Diffie-Hellman parameters should be discarded and regenerated once a
-- week or once a month. Depends on the security requirements.
-- (gnutls/src/serv.c).
procedure Generate_RSA;
-- Regenerates RSA parameters.
-- The call could take some time.
-- RSA parameters should be discarded and regenerated once a day, once
-- every 500 transactions etc. Depends on the security requirements
-- (gnutls/src/serv.c).
procedure Start_Parameters_Generation
(DH : Boolean; Logging : access procedure (Text : String) := null)
with Inline;
-- Start SSL parameters regeneration in background.
-- DH is False mean only RSA parameters generated.
-- DH is True mean RSA and DH both parameters generated.
procedure Set_Debug
(Level : Natural; Output : Debug_Output_Procedure := null);
-- Set debug information printed level and output callback.
-- Null output callback mean output to Ada.Text_IO.Current_Error.
procedure Set_Session_Data
(Socket : in out Socket_Type; Data : Session_Type);
-- For the client side SSL socket try to resume session from data taken
-- from previosly connected socket by Session_Data routine.
function Signature
(Data : String;
Key : Private_Key;
Hash : Hash_Method) return Stream_Element_Array with Inline;
function Signature
(Data : Stream_Element_Array;
Key : Private_Key;
Hash : Hash_Method) return Stream_Element_Array with Inline;
private
-- implementation removed
end AWS.Net.SSL;
13.29 AWS.Net.SSL.Certificate
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2003-2015, 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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
pragma Ada_2012;
with Ada.Calendar;
package AWS.Net.SSL.Certificate is
overriding function "=" (Left, Right : Object) return Boolean with Inline;
-- Compare 2 certificates
--
-- Client verification support
--
type Verify_Callback is
access function (Cert : SSL.Certificate.Object) return Boolean;
-- Client certificate verification callback, must return True if Cert can
-- be accepted or False otherwise. Such callback should generally return
-- the value returned by Verified above.
procedure Set_Verify_Callback
(Config : in out SSL.Config; Callback : Verify_Callback);
-- Register the callback to use to verify client's certificates
type Password_Callback is
access function (Certificate_Filename : String) return String;
-- Callback to get password for signed server's keys. An empty string
-- must be returned if the password is unknown or the certificate isn't
-- signed.
private
-- implementation removed
end AWS.Net.SSL.Certificate;
13.30 AWS.Net.WebSocket
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2012-2015, 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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
pragma Ada_2012;
with Ada.Strings.Unbounded;
with AWS.Status;
package AWS.Net.WebSocket is
use Ada.Strings.Unbounded;
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
with Pre => Socket /= null;
-- 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 Send
(Socket : in out Object;
Message : String;
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
--
--
-- Socket's methods that must be overriden
--
--
-- Socket reference
--
private
-- implementation removed
end AWS.Net.WebSocket;
13.31 AWS.Net.WebSocket.Registry
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2012-2015, 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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
pragma Ada_2012;
-- This package is used to build and register the active WebSockets. Some
-- services to send or broadcast messages are also provided.
with AWS.Status;
package AWS.Net.WebSocket.Registry is
procedure Register_Pattern
(Pattern : String;
Factory : Registry.Factory)
with
Pre => Pattern'Length > 0;
-- Register a WebObject's constructor for a specific URI and pattern
-- Sending messages
function Create (URI : String; Origin : String := "") return Recipient with
Pre => URI'Length > 0;
-- A recipient with only an URI is called a broadcast as it designate all
-- registered WebSocket for this specific URI. If Origin is specified then
-- it designates a single client.
--
-- Note that both URI and Origin can be regular expressions.
procedure Send
(To : Recipient;
Message : String;
Except_Peer : String := "";
Timeout : Duration := Forever);
-- Send a message to the WebSocket designated by Origin and URI. Do not
-- send this message to the peer whose address is given by Except_Peer.
-- Except_Peer must be the address as reported by AWS.Net.Peer_Addr. It is
-- often needed to send a message to all registered sockets except the one
-- which has sent the message triggering a response.
procedure Send
(To : Recipient;
Message : Unbounded_String;
Except_Peer : String := "";
Timeout : Duration := Forever);
-- As above but with an Unbounded_String
procedure Send
(To : Recipient;
Message : String;
Request : AWS.Status.Data;
Timeout : Duration := Forever);
-- As above but filter out the client having set the given request
procedure Send
(To : Recipient;
Message : Unbounded_String;
Request : AWS.Status.Data;
Timeout : Duration := Forever);
-- As above but with an Unbounded_String
procedure Close
(To : Recipient;
Message : String;
Except_Peer : String := "";
Timeout : Duration := Forever;
Error : Error_Type := Normal_Closure);
-- Close connections
procedure Send
(Socket : in out Object'Class;
Message : String;
Is_Binary : Boolean := False;
Timeout : Duration := Forever);
-- 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'Class;
Message : Unbounded_String;
Is_Binary : Boolean := False;
Timeout : Duration := Forever);
-- Same as above but can be used for large messages. The message is
-- possibly sent fragmented.
procedure Send
(Socket : in out Object'Class;
Message : Stream_Element_Array;
Is_Binary : Boolean := True;
Timeout : Duration := Forever);
-- As above but for a Stream_Element_Array
procedure Close
(Socket : in out Object'Class;
Message : String;
Timeout : Duration := Forever;
Error : Error_Type := Normal_Closure);
private
-- implementation removed
end AWS.Net.WebSocket.Registry;
13.32 AWS.Net.WebSocket.Registry.Control
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2012, 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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
package AWS.Net.WebSocket.Registry.Control is
procedure Start;
-- Start the WebSockets servers
procedure Shutdown;
-- Shutdown the WebSockets servers
end AWS.Net.WebSocket.Registry.Control;
13.33 AWS.Parameters
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2000-2016, 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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
pragma Ada_2012;
with AWS.Containers.Tables;
with AWS.Resources.Streams.Memory;
package AWS.Parameters is
function URI_Format
(Parameter_List : List; Limit : Positive := Positive'Last) return String;
-- Returns the list of parameters in the URI format. This can be added
-- after the resource to form the complete URI. The format is:
-- "?name1=value1&name2=value2..."
-- If there is no parameter in the list, the empty string is returned.
-- Limit is maximum size of the output line, parameters name=value will be
-- returned unbroken in case of limit applied.
procedure Add
(Parameter_List : in out List; Name, Value : String; Decode : Boolean);
-- URL decode and add Name=Value pair into parameters
-- list. The parameters can start with a '?' (standard Web character
-- separator) which is just ignored.
procedure Add
(Parameter_List : in out List;
Parameters : in out Resources.Streams.Memory.Stream_Type'Class);
-- Same as above, but use different parameters source. Used to reduce
-- stack usage on big POST requests. This is the routine used by AWS for
-- parsing the POST parameters. This routine also control the maximum
-- number of parameter parsed as set by the corresponding configuration
-- option.
procedure Update
(Parameter_List : in out List; Name, Value : String; Decode : Boolean);
Too_Long_Parameter : exception;
-- Raised if the Add routine detects a too long parameter line when reading
-- parameters from Memory_Stream.
Too_Many_Parameters : exception;
-- Raised when the maximum number of parameters has been reached
private
-- implementation removed
end AWS.Parameters;
13.34 AWS.POP
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2003-2012, 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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
with Ada.Finalization;
with Ada.Strings.Unbounded;
with AWS.Headers;
with AWS.Net.Std;
with AWS.Resources.Streams;
with AWS.Utils;
package AWS.POP is
use Ada.Strings.Unbounded;
POP_Error : exception;
-- Raised by all routines when an error has been detected
-------------
-- Mailbox --
-------------
function Initialize
(Server_Name : String;
User : String;
Password : String;
Authenticate : Authenticate_Mode := Clear_Text;
Port : Positive := Default_POP_Port) return Mailbox;
-- Connect on the given Port to Server_Name and open User's Mailbox. This
-- mailbox object will be used to retrieve messages.
-------------
-- Message --
-------------
function Get
(Mailbox : POP.Mailbox;
N : Positive;
Remove : Boolean := False) return Message;
-- Retrieve Nth message from the mailbox, let the message on the mailbox
-- if Remove is False.
procedure Delete
(Mailbox : POP.Mailbox;
N : Positive);
-- Detele message number N from the mailbox
function Get_Header
(Mailbox : POP.Mailbox;
N : Positive) return Message;
-- Retrieve headers for the Nth message from the mailbox, let the message
-- on the mailbox. This is useful to build a quick summary of the mailbox.
generic
with procedure Action
(Message : POP.Message;
Index : Positive;
Quit : in out Boolean);
procedure For_Every_Message
(Mailbox : POP.Mailbox;
Remove : Boolean := False);
-- Calls Action for each message read on the mailbox, delete the message
-- from the mailbox if Remove is True. Set Quit to True to stop the
-- iterator. Index is the mailbox's message index.
generic
with procedure Action
(Message : POP.Message;
Index : Positive;
Quit : in out Boolean);
procedure For_Every_Message_Header (Mailbox : POP.Mailbox);
-- Calls Action for each message read on the mailbox. Only the headers are
-- read from the mailbox. Set Quit to True to stop the iterator. Index is
-- the mailbox's message index.
function Header
(Message : POP.Message;
Header : String) return String;
-- Returns header value for header named Header, returns the empty string
-- if such header does not exist.
----------------
-- Attachment --
----------------
function Get
(Message : POP.Message'Class;
Index : Positive) return Attachment;
-- Returns the Nth Attachment for Message, Raises Constraint_Error if
generic
with procedure Action
(Attachment : POP.Attachment;
Index : Positive;
Quit : in out Boolean);
procedure For_Every_Attachment (Message : POP.Message);
-- Calls action for every Attachment in Message. Stop iterator if Quit is
-- set to True, Quit is set to False by default.
function Content
(Attachment : POP.Attachment)
return AWS.Resources.Streams.Stream_Access;
-- Returns Attachment's content as a memory stream. Note that the stream
-- has already been decoded. Most attachments are MIME Base64 encoded.
private
-- implementation removed
end AWS.POP;
13.35 AWS.Resources
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2002-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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
with Ada.Calendar;
with Ada.Streams;
with AWS.Utils;
package AWS.Resources is
use Ada.Streams;
Resource_Error : exception;
procedure Open
(File : out File_Type;
Name : String;
Form : String := "");
-- Open file in mode In_File. Only reading from the file is supported.
-- This procedure open the in-memory (embedded) file if present, otherwise
-- the file on disk is opened. Note that if Name file is not found, it
-- checks for Name & ".gz" and unzipped the file content in this case.
procedure Open
(File : out File_Type;
Name : String;
Form : String := "";
GZip : in out Boolean);
-- Open file in mode In_File. Only reading from the file is supported.
-- This procedure open the in-memory (embedded) file if present, otherwise
-- the file on disk is opened. If GZip parameter is False this call is
-- equivalent to the Open routine above. If GZip is True this routine will
-- first check for the compressed version of the resource (Name & ".gz"),
-- if found GZip output value will remain True. If GZip value is True and
-- the compressed version of the resource does not exist it looks for
-- non-compressed version and set GZip value to False.
procedure Set_Index
(Resource : in out File_Type;
To : Stream_Element_Offset);
-- Set the position in the stream, next Read will start at the position
-- whose index is To. If To is outside the content the index is set to
-- Last + 1 to ensure that next End_Of_File will return True.
procedure Read
(Resource : in out File_Type;
Buffer : out Stream_Element_Array;
Last : out Stream_Element_Offset);
-- Returns a set of bytes from the file
procedure Get_Line
(Resource : in out File_Type;
Buffer : out String;
Last : out Natural);
-- Returns a line from the file. A line is a set of character terminated
-- by ASCII.LF (UNIX style EOL) or ASCII.CR+ASCII.LF (DOS style EOL).
private
-- implementation removed
end AWS.Resources;
13.36 AWS.Resources.Embedded
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2002-2013, 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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
pragma Ada_2012;
with AWS.Resources.Streams.Memory;
package AWS.Resources.Embedded is
use Ada;
procedure Open
(File : out File_Type;
Name : String;
Form : String := "";
GZip : in out Boolean);
-- Open resource from registered data
procedure Create
(File : out File_Type;
Buffer : Buffer_Access);
-- Create the resource directly from memory data
-- Return Both if both file Name and Name & ".gz" exists.
-- Return None if files neither Name nor Name & ".gz" exist.
procedure Register
(Name : String;
Content : Buffer_Access;
File_Time : Calendar.Time);
-- Register a new file named Name into the embedded resources. The file
-- content is pointed to by Content, the File_Time must be the last
-- modification time stamp for the file. If Name ends with ".gz" the
-- embedded resource registered as compressed. If a file is already
-- registered for this name, Content replace the previous one.
end AWS.Resources.Embedded;
13.37 AWS.Resources.Files
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2002-2012, 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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
with AWS.Utils;
package AWS.Resources.Files is
procedure Open
(File : out File_Type;
Name : String;
Form : String := "";
GZip : in out Boolean);
procedure Open
(File : out File_Type;
Name : String;
Form : String := "");
end AWS.Resources.Files;
13.38 AWS.Resources.Streams
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2002-2017, 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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
pragma Ada_2012;
package AWS.Resources.Streams is
procedure Read
(Resource : in out Stream_Type;
Buffer : out Stream_Element_Array;
Last : out Stream_Element_Offset) is abstract;
procedure Set_Index
(Resource : in out Stream_Type;
To : Stream_Element_Offset) is abstract;
-- Set the position in the stream, next Read will start at the position
-- whose index is To. If To is outside the content the index is set to
-- Last + 1 to ensure that next End_Of_File will return True.
procedure Create
(Resource : out File_Type;
Stream : Stream_Access) with Inline;
-- Create a resource file from user defined stream
private
-- implementation removed
end AWS.Resources.Streams;
13.39 AWS.Resources.Streams.Disk
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2003-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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
package AWS.Resources.Streams.Disk is
procedure Open
(File : out Stream_Type;
Name : String;
Form : String := "shared=no");
private
-- implementation removed
end AWS.Resources.Streams.Disk;
13.40 AWS.Resources.Streams.Disk.Once
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2003-2012, 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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
package AWS.Resources.Streams.Disk.Once is
end AWS.Resources.Streams.Disk.Once;
13.41 AWS.Resources.Streams.Memory
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2003-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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
pragma Ada_2012;
with AWS.Utils;
package AWS.Resources.Streams.Memory is
procedure Append
(Resource : in out Stream_Type;
Buffer : Stream_Element_Array;
Trim : Boolean := False);
-- Append Buffer into the memory stream
procedure Append
(Resource : in out Stream_Type;
Buffer : Stream_Element_Access);
-- Append static data pointed to Buffer into the memory stream as is.
procedure Append
(Resource : in out Stream_Type;
Buffer : Buffer_Access);
-- Append static data pointed to Buffer into the memory stream as is.
-- The stream would not try to free the memory on close.
private
-- implementation removed
end AWS.Resources.Streams.Memory;
13.42 AWS.Resources.Streams.Memory.ZLib
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2003-2013, 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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
pragma Ada_2012;
-- This API is used as for standard memory stream (see parent package), the
-- only difference is that the stream is compressing/decompressing on append.
with ZLib;
package AWS.Resources.Streams.Memory.ZLib is
procedure Deflate_Initialize
(Resource : in out Stream_Type;
Level : Compression_Level := ZL.Default_Compression;
Strategy : Strategy_Type := ZL.Default_Strategy;
procedure Inflate_Initialize
(Resource : in out Stream_Type;
Window_Bits : Window_Bits_Type := ZL.Default_Window_Bits;
Header : Header_Type := ZL.Default)
with Inline;
-- Initialize the decompression
private
-- implementation removed
end AWS.Resources.Streams.Memory.ZLib;
13.43 AWS.Resources.Streams.Pipe
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2007-2016, 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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
with GNAT.OS_Lib;
package AWS.Resources.Streams.Pipe is
use GNAT;
type On_Error_Callback is
access procedure (Status : Integer; Error : String);
procedure Open
(Pipe : out Stream_Type;
Command : String;
Args : OS_Lib.Argument_List;
Timeout : Integer := 10_000;
On_Error : On_Error_Callback := null);
-- Open the pipe and connect it to the given command's output. Args are
-- passed to the command. Timeout is given in milliseconds and corresponds
-- to the time waiting for output data before timeout. This timeout must be
-- adjusted to be compatible to the output activity of the Command process.
private
-- implementation removed
end AWS.Resources.Streams.Pipe;
13.44 AWS.Response
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2000-2015, 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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
pragma Ada_2012;
with Ada.Calendar;
with Ada.Streams;
with Ada.Strings.Unbounded;
with AWS.Headers;
with AWS.Messages;
with AWS.MIME;
with AWS.Net;
with AWS.Resources.Streams;
with AWS.Status;
package AWS.Response is
use Ada;
use Ada.Streams;
use Ada.Strings.Unbounded;
type Data_Mode is
(Header, -- Send only the HTTP header
Message, -- Send a standard HTTP message
File, -- Send a file
File_Once, -- Send a file once, delete it after sending
Stream, -- Send a stream
Socket_Taken, -- Socket has been taken from the server
WebSocket, -- Protocol switched to WebSocket
No_Data); -- No data, this is not a response
subtype Content_Length_Type
is Stream_Element_Offset range -1 .. Stream_Element_Offset'Last;
-----------------------
-- Data Constructors --
-----------------------
function Build
(Content_Type : String;
Message_Body : String;
Status_Code : Messages.Status_Code := Messages.S200;
Cache_Control : Messages.Cache_Option := Messages.Unspecified;
Encoding : Messages.Content_Encoding := Messages.Identity)
return Data
with Post => not Is_Empty (Build'Result)
and then Response.Status_Code (Build'Result) = Status_Code;
function Build
(Content_Type : String;
UString_Message : Unbounded_String;
Status_Code : Messages.Status_Code := Messages.S200;
Cache_Control : Messages.Cache_Option := Messages.Unspecified;
Encoding : Messages.Content_Encoding := Messages.Identity)
return Data
with Post => not Is_Empty (Build'Result)
and then Response.Status_Code (Build'Result) = Status_Code;
-- Return a message whose body is passed into Message_Body. The
-- Content_Type parameter is the MIME type for the message
-- body. Status_Code is the response status (see Messages.Status_Code
-- definition).
function Build
(Content_Type : String;
Message_Body : Stream_Element_Array;
Status_Code : Messages.Status_Code := Messages.S200;
Cache_Control : Messages.Cache_Option := Messages.Unspecified;
Encoding : Messages.Content_Encoding := Messages.Identity)
return Data
with Post => not Is_Empty (Build'Result)
and then Response.Status_Code (Build'Result) = Status_Code;
-- Idem above, but the message body is a stream element array
function File
(Content_Type : String;
Filename : String;
Status_Code : Messages.Status_Code := Messages.S200;
Cache_Control : Messages.Cache_Option := Messages.Unspecified;
Encoding : Messages.Content_Encoding := Messages.Identity;
Once : Boolean := False;
Disposition : Disposition_Mode := None;
User_Filename : String := "")
return Data
with Post => not Is_Empty (File'Result)
and then Response.Status_Code (File'Result) = Status_Code
and then (if Once
then Mode (File'Result) = File_Once
else Mode (File'Result) = File);
-- Returns a message whose message body is the content of the file. The
-- Content_Type must indicate the MIME type for the file. User_Filename
-- can be used to force the filename on the client side. This can be
-- different from the server side Filename. If Once is set to True the
-- file will be deleted after the download (this includes the case where
-- the download is suspended).
function Stream
(Content_Type : String;
Handle : not null access Resources.Streams.Stream_Type'Class;
Status_Code : Messages.Status_Code := Messages.S200;
Cache_Control : Messages.Cache_Option := Messages.No_Cache;
Encoding : Messages.Content_Encoding := Messages.Identity;
Server_Close : Boolean := True;
Disposition : Disposition_Mode := None;
User_Filename : String := "")
return Data
with Post => not Is_Empty (Stream'Result)
and then Response.Status_Code (Stream'Result) = Status_Code;
-- Returns a message whose message body is the content of the user defined
-- stream. The Content_Type must indicate the MIME type for the data
-- stream, Status_Code is the the header status code which should be send
-- back to client's browser. If Server_Close is set to False the server
-- will not close the stream after sending it, it is then user's
-- responsability to close the stream. User_Filename can be used to force
-- the filename on the client side. This can be different from the server
-- side filename (for file based stream) or can be used to name a non disk
-- based stream. Encoding mean additional encoding would be applied on top
-- of given Handler stream.
------------------------------
-- Redirection Constructors --
------------------------------
function URL
(Location : String;
Cache_Control : Messages.Cache_Option := Messages.Unspecified)
return Data
with Post => not Is_Empty (URL'Result)
and then Status_Code (URL'Result) = Messages.S302
and then Mode (URL'Result) = Header;
-- This ask the server for a redirection to the specified URL. This is
-- a temporary redirection, and the client browser should query the
-- same original URL next time.
function Moved
(Location : String;
Message : String := Default_Moved_Message;
Cache_Control : Messages.Cache_Option := Messages.Unspecified)
return Data
with Post => not Is_Empty (Moved'Result)
and then Status_Code (Moved'Result) = Messages.S301;
-- This send back a moved message (Messages.S301) with the specified
-- message body.
-- This is a permanent redirection, and the client browser is encouraged
-- to update links so that the next query for the URL goes directly to
-- the new location.
------------------------
-- Other Constructors --
------------------------
function Acknowledge
(Status_Code : Messages.Status_Code;
Message_Body : String := "";
Content_Type : String := MIME.Text_HTML) return Data
with Post =>
not Is_Empty (Acknowledge'Result)
and then Response.Status_Code (Acknowledge'Result) = Status_Code
and then (if Message_Body = ""
then Mode (Acknowledge'Result) = Header);
-- Returns a message to the Web browser. This routine must be used to
-- send back an error message to the Web browser. For example if a
-- requested resource cannot be served a message with status code S404
-- must be sent.
function Authenticate
(Realm : String;
Mode : Authentication_Mode := Basic;
Stale : Boolean := False;
Message : String := Default_Authenticate_Message)
return Data
with Post => not Is_Empty (Authenticate'Result)
and then Status_Code (Authenticate'Result) = Messages.S401;
-- Returns an authentication message (Messages.S401), the Web browser
-- will then ask for an authentication. Realm string will be displayed
-- by the Web Browser in the authentication dialog box.
--
-- API to retrieve response data
--
------------
-- Header --
------------
----------
-- Data --
----------
procedure Message_Body
(D : Data;
File : out AWS.Resources.File_Type);
-- Returns the message body as a stream
--------------------
-- Authentication --
--------------------
---------------
-- Resources --
---------------
procedure Create_Resource
(D : in out Data;
File : out AWS.Resources.File_Type;
GZip : Boolean)
with Inline;
-- Creates the resource object (either a file or in-memory object) for
-- the data to be sent to the client. The resource should be closed after
-- use.
-- GZip is true when the http client support GZip decoding,
-- if file or embedded resource is in the GZip format this routine would
-- define Content-Encoding header field value.
----------------
-- WebSockets --
----------------
private
-- implementation removed
end AWS.Response;
13.45 AWS.Server
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2000-2016, 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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
pragma Ada_2012;
with AWS.Config;
with AWS.Default;
with AWS.Dispatchers;
with AWS.Exceptions;
with AWS.Net.SSL;
with AWS.Response;
with AWS.Status;
with Ada.Task_Identification;
package AWS.Server is
---------------------------
-- Server initialization --
---------------------------
-- Note that starting a sercure server if AWS has not been configured to
-- support HTTPS will raise Program_Error.
procedure Start
(Web_Server : in out HTTP;
Callback : Response.Callback;
Config : AWS.Config.Object);
-- Start server using a full configuration object. With this routine it is
-- possible to control all features of the server. A simplified version of
-- Start is also provided below with the most common options.
procedure Start
(Web_Server : in out HTTP;
Dispatcher : Dispatchers.Handler'Class;
Config : AWS.Config.Object);
-- Idem, but using the dispatcher tagged type instead of callback. See
-- AWS.Services.Dispatchers and AWS.Dispatchers hierarchies for built-in
-- services and interface to build your own dispatcher models.
-- Note that a copy of the Dispatcher is keept into Web_Server. Any
-- changes done to the Dispatcher object will not be part of the Web
-- server dispatcher.
procedure Get_Message_Body;
-- If size of message body is bigger than Upload_Size_Limit configuration
-- parameter, server do not receive message body before calling user's
-- callback routine. If user decide to get the message body he should call
-- this routine.
procedure Start
(Web_Server : in out HTTP;
Name : String;
Callback : Response.Callback;
Max_Connection : Positive := Default.Max_Connection;
Admin_URI : String := Default.Admin_URI;
Port : Natural := Default.Server_Port;
Security : Boolean := False;
Session : Boolean := False;
Case_Sensitive_Parameters : Boolean := True;
Upload_Directory : String := Default.Upload_Directory;
Line_Stack_Size : Positive := Default.Line_Stack_Size);
-- Start the Web server. Max_Connection is the number of simultaneous
-- connections the server's will handle (the number of slots in AWS).
-- Name is just a string used to identify the server. This is used
-- for example in the administrative page. Admin_URI must be set to enable
-- the administrative status page. Callback is the procedure to call for
-- each resource requested. Port is the Web server port. If Security is
-- set to True the server will use an HTTPS/SSL connection. If Session is
-- set to True the server will be able to get a status for each client
-- connected. A session Id is used for that, on the client side it is a
-- cookie. Case_Sensitive_Parameters if set to False it means that the
-- parameters name will be handled without case sensitivity. Upload
------------------------
-- Server termination --
------------------------
--------------------------
-- Server configuration --
--------------------------
procedure Set_Unexpected_Exception_Handler
(Web_Server : in out HTTP;
Handler : Exceptions.Unexpected_Exception_Handler);
-- Set the unexpected exception handler. It is called whenever an
-- unrecoverable error has been detected. The default handler just display
-- (on standard output) an error message with the location of the
-- error. By changing this handler it is possible to log or display full
-- symbolic stack backtrace if needed.
procedure Set
(Web_Server : in out HTTP;
Dispatcher : Dispatchers.Handler'Class);
-- Dynamically associate a new dispatcher object to the server. With the
-- feature it is possible to change server behavior at runtime. The
-- complete set of callback procedures will be changed when calling this
-- routine. Note that any change in a dispatcher associated with a server
-- using Register or Unregister must be reset into the server using this
-- routine.
procedure Set_Security
(Web_Server : in out HTTP;
Certificate_Filename : String;
Security_Mode : Net.SSL.Method := Net.SSL.SSLv23_Server;
Key_Filename : String := "");
-- Set security option for AWS. Certificate_Filename is the name of a file
-- containing a certificate. Key_Filename is the name of the file
-- containing the key, if the empty string the key will be taken from the
-- certificate filename. This must be called before starting the secure
-- server otherwise the default security options or options set in the
-- config files will be used. After that the call will have no effect.
procedure Set_SSL_Config
(Web_Server : in out HTTP; SSL_Config : Net.SSL.Config);
-- Set the SSL configuration for this server
function SSL_Config
(Web_Server : in out HTTP) return not null access Net.SSL.Config;
-- Returns the access to SSL config of the server. Allow to change SSL
-- config on the already created server.
procedure Set_Socket_Constructor
(Web_Server : in out HTTP;
Socket_Constructor : Net.Socket_Constructor);
-- Set the socket constructor routine to use when creating new sockets on
-- the server. By calling this routine it is possible to replace the
-- default AWS communication layer used. The default constructor is
-- AWS.Net.Socket. Note that this routine must be called before starting
-- the server. It is also important to note that sockets returned by the
-- constructor must have the cache properly initialized. See AWS.Net.Cache
-- for more information.
---------------
-- Other API --
---------------
procedure Give_Back_Socket
(Web_Server : in out HTTP; Socket : Net.Socket_Type'Class);
-- Give the socket back to the server. Socket must have been taken from
-- the server using the Response.Socket_Taken routine in a callback.
procedure Give_Back_Socket
(Web_Server : in out HTTP;
Socket : not null access Net.Socket_Type'Class);
-- Idem.
-- Use Socket_Access to avoid memory reallocation for already allocated
-- sockets.
procedure Skip_Log_Record;
-- Disable logging only for the current processing request
procedure Add_Listening
type Task_Id_Array is
array (Positive range <>) of Ada.Task_Identification.Task_Id;
private
-- implementation removed
end AWS.Server;
13.46 AWS.Server.Hotplug
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2000-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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
with AWS.Hotplug;
package AWS.Server.Hotplug is
procedure Activate
(Web_Server : not null access HTTP;
Port : Positive;
Authorization_File : String;
procedure Shutdown;
-- Shutdown hotplug server
end AWS.Server.Hotplug;
13.47 AWS.Server.Log
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2003-2012, 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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
with AWS.Log;
package AWS.Server.Log is
------------------
-- Standard Log --
------------------
procedure Start
(Web_Server : in out HTTP;
Split_Mode : AWS.Log.Split_Mode := AWS.Log.None;
Filename_Prefix : String := "";
Auto_Flush : Boolean := False);
-- Activate server's logging activity. See AWS.Log. If Auto_Flush is True
-- the file will be flushed after all written data.
procedure Start
(Web_Server : in out HTTP;
Callback : AWS.Log.Callback;
Name : String);
-- Activate the Web_Server access log and direct all data to the Callback.
-- The Name String is returned when the Name function is called. It is a
-- simple identifier, that serves no other purpose than to give the
-- Callback a label.
-- an external writer is used to handle the access log, then the name of
-- that writer is returned. See the Start procedure for starting the access
-- log with a Callback.
---------------
-- Error Log --
---------------
procedure Start_Error
(Web_Server : in out HTTP;
Split_Mode : AWS.Log.Split_Mode := AWS.Log.None;
Filename_Prefix : String := "");
-- Activate server's logging activity. See AWS.Log
procedure Start_Error
(Web_Server : in out HTTP;
Callback : AWS.Log.Callback;
Name : String);
-- Activate the Web_Server error log and direct all data to the Callback.
-- The Name String is returned when the Error_Name function is called. It
-- is a simple identifier, that serves no other purpose than to give the
-- Callback a label.
end AWS.Server.Log;
13.48 AWS.Server.Push
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2000-2017, 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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
with Ada.Calendar;
with Ada.Streams;
with Ada.Strings.Unbounded;
with AWS.Containers.Tables;
with AWS.Default;
with AWS.Net;
with System;
generic
package AWS.Server.Push is
use Ada;
use Ada.Streams;
use Ada.Strings.Unbounded;
Client_Gone : exception;
-- Raised when a client is not responding
Closed : exception;
-- Raised when trying to register to a closed push server
Duplicate_Client_Id : exception;
-- Raised in trying to register an already registered client
procedure Register
(Server : in out Object;
Client_Id : Client_Key;
Socket : Net.Socket_Access;
Environment : Client_Environment;
Init_Data : Client_Output_Type;
Init_Content_Type : String := "";
Kind : Mode := Plain;
Duplicated_Age : Duration := Duration'Last;
Groups : Group_Set := Empty_Group;
Timeout : Duration := Default.Send_Timeout);
procedure Register
(Server : in out Object;
Client_Id : Client_Key;
Socket : Net.Socket_Type'Class;
Environment : Client_Environment;
Init_Data : Client_Output_Type;
Init_Content_Type : String := "";
Kind : Mode := Plain;
Duplicated_Age : Duration := Duration'Last;
Groups : Group_Set := Empty_Group;
Timeout : Duration := Default.Send_Timeout);
-- Same as above but with Socket_Type'Class parameter.
-- Is not recommended, use above one with Socket_Access parameter.
procedure Register
(Server : in out Object;
Client_Id : Client_Key;
Socket : Net.Socket_Type'Class;
Environment : Client_Environment;
Content_Type : String := "";
Kind : Mode := Plain;
Duplicated_Age : Duration := Duration'Last;
Groups : Group_Set := Empty_Group;
Timeout : Duration := Default.Send_Timeout);
-- Same as above but without sending initial data.
-- Content_Type applicable only when Kind parameter is Plain or Chunked,
-- in Multipart server push mode each server push message would have own
-- Content_Type defined.
-- Is not recommended, use above one with Socket_Access parameter.
procedure Unregister
(Server : in out Object;
Client_Id : Client_Key;
Close_Socket : Boolean := True);
-- Removes client Client_Id from server subscription list. The associated
-- client's socket will be closed if Close_Socket is True. No exception is
-- raised if Client_Id was not registered.
procedure Unregister_Clients
(Server : in out Object; Close_Sockets : Boolean := True);
-- Remove all registered clients from the server. Closes if Close_Sockets
-- is set to True (default) otherwise the sockets remain open. After this
-- call the sever will still in running mode. Does nothing if there is no
-- client registered.
procedure Subscribe
(Server : in out Object; Client_Id : Client_Key; Group_Id : String);
-- Subscribe client to the group
procedure Subscribe_Copy
(Server : in out Object; Source : String; Target : String);
-- Subscribe everybody in the group Source to the group Target.
-- If Source is empty then subscribe all clients to the group Target.
procedure Unsubscribe
(Server : in out Object; Client_Id : Client_Key; Group_Id : String);
-- Remove group from client's group list
procedure Unsubscribe_Copy
(Server : in out Object; Source : String; Target : String);
-- Unsubscribe everybody in the group Source from the group Target.
-- If Source is empty then unsubscribe all clients from the group Target.
procedure Send_To
(Server : in out Object;
Client_Id : Client_Key;
Data : Client_Output_Type;
Content_Type : String := "";
Thin_Id : String := "");
-- Push data to a specified client identified by Client_Id
-- Thin_Id is to be able to replace messages in the send client queue
-- with the newer one with the same Thin_Id.
procedure Send
(Server : in out Object;
Data : Client_Output_Type;
Group_Id : String := "";
Content_Type : String := "";
Thin_Id : String := "";
Client_Gone : access procedure (Client_Id : String) := null);
-- Push data to group of clients (broadcast) subscribed to the server.
-- If Group_Id is empty, data transferred to each client.
-- Call Client_Gone for each client with broken socket.
-- Thin_Id is to be able to replace messages in the send client queue
-- with the newer one with the same Thin_Id.
generic
with procedure Client_Gone (Client_Id : String);
procedure Send_G
(Server : in out Object;
Data : Client_Output_Type;
Group_Id : String := "";
Content_Type : String := "";
Thin_Id : String := "");
-- Same like before, but generic for back compatibility
procedure Info
(Server : in out Object;
Clients : out Natural;
Groups : out Natural;
Process : access procedure
(Client_Id : Client_Key;
Address : String;
State : String;
Environment : Client_Environment;
Kind : Mode;
Groups : Group_Set) := null);
-- Returns the number of registered clients and groups in the server.
-- Call Process routine for each client if defined.
-- Test internal integrity.
-- Shutdown routines put the server in a Closed mode. The routines below
-- provides a way to eventually close the socket, to send some
-- finalization data.
procedure Shutdown
(Server : in out Object; Close_Sockets : Boolean := True);
-- Unregistered all clients and close all associated connections (socket)
-- if Close_Socket is True. The server will be in Closed mode. After this
-- call any client trying to register will get the Closed exception. It is
-- possible to reactivate the server with Restart.
procedure Shutdown
(Server : in out Object;
Final_Data : Client_Output_Type;
Final_Content_Type : String := "");
-- Idem as above but it send Final_Data (as a Data_Content_Type mime
-- content) before closing connections.
procedure Info
(Size : out Natural;
Max_Size : out Natural;
Max_Size_DT : out Calendar.Time;
Counter : out Wait_Counter_Type);
-- Size would return number of currently waiting sockets.
-- Counter would return total number of waited sockets from start.
private
-- implementation removed
end AWS.Server.Push;
13.49 AWS.Server.Status
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2003-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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
with Ada.Calendar;
with AWS.Net.Acceptors;
with AWS.Templates;
package AWS.Server.Status is
end AWS.Server.Status;
13.50 AWS.Services.Callbacks
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2004-2017, 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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
with AWS.Response;
with AWS.Status;
package AWS.Services.Callbacks is
generic
Prefix : String; -- the prefix found in the URI
Directory : String; -- the directory where the file is
function File (Request : Status.Data) return Response.Data;
-- This is a callback function where URL:
-- http://<host>/<prefix>toto
-- references the file:
-- <directory>/toto
--
-- If the URL does not start with Prefix it returns a 404 error page.
-- This is designed to be use with AWS.Services.Dispatchers.URI.
end AWS.Services.Callbacks;
13.51 AWS.Services.Directory
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2000-2012, 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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
with AWS.Status;
with Templates_Parser;
-- This service can be used to browse a file system. The browsing mechanism
-- will gather information (filename, size, directory...) from a specified
-- directory name and will fill a translation table. This table will be used
-- with a template file to render the HTML document. You can design your own
-- browsing template file, here is a description of all tag variables defined
-- in the translation table:
--
-- URI (discrete)
-- The URI pointing to the directory parsed.
--
-- VERSION (discrete)
-- AWS version string.
--
-- IS_DIR_V (vector)
-- A list of booleans, indicate if Nth entry is a directory or not.
--
-- NAME_V (vector)
-- A list of filenames. Nth name is a directory if Nth entry in IS_DIR
-- is set to true.
--
-- SIZE_V (vector)
-- A list of sizes. Nth entry is the file size of the Nth entry in
-- NAMES.
--
-- TIME_V (vector)
-- A list of last modification times. Nth entry is is the last
-- modification time of the Nth entry in NAMES.
--
-- NAME_ORDR
-- Rule to either set ordering on name or to revert current name
-- ordering.
--
-- SNME_ORDR
-- Rule to either set ordering on name (case sensitive) or to revert
-- current name (case sensitive) ordering.
--
-- EXT_ORDR
-- Rule to either set ordering on extension or to revert current
-- extension ordering.
--
-- SEXT_ORDR
-- Rule to either set ordering on extension (case sensitive) or to
-- revert current extension (case sensitive) ordering.
--
-- MIME_ORDR
-- Rule to either set ordering on MIME type or to revert current MIME
-- type ordering.
--
-- DIR_ORDR
-- Rule to either set ordering on directory or to revert current
-- directory ordering.
--
-- SIZE_ORDR
-- Rule to either set ordering on size or to revert current size
-- ordering.
--
-- TIME_ORDR
-- Rule to either set ordering on time or to revert current time
-- ordering.
--
-- ORIG_ORDR
-- Rule to either set original ordering (file order as read on the file
-- system) or to revert current original ordering.
--
-- DIR_NAME_ORDR
-- Rule to either set ordering on directory/name or to revert current
-- directory/name ordering.
--
-- DIR_SNME_ORDR
-- Rule to either set ordering on directory/name (case sensitive) or to
-- revert current directory/name (case sensitive) ordering.
--
-- DIR_TIME_ORDR
-- Rule to either set ordering on directory/time or to revert current
-- directory/time ordering.
--
package AWS.Services.Directory is
use Templates_Parser;
function Browse
(Directory_Name : String;
Request : AWS.Status.Data) return Translate_Set;
-- Returns a translation table containing information parsed from
-- Directory_Name. This is supposed to be used with a directory template.
function Browse
(Directory_Name : String;
Template_Filename : String;
Request : AWS.Status.Data;
Translations : Translate_Set := Null_Set) return String;
-- Parses directory Directory_Name and use Templates_Parser to fill in the
-- template Template_Filename. It is possible to specified some specifics
-- tags in Translations.
end AWS.Services.Directory;
13.52 AWS.Services.Dispatchers
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2000-2013, 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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
pragma Ada_2012;
-- Timer (AWS.Services.Dispatchers.Timer)
-- to dispatch to a specific callback depending on the current time.
--
-- Linker (AWS.Services.Dispatchers.Linker)
-- to link two dispatchers together, if the first one retruns 404 tries
-- the second one.
end AWS.Services.Dispatchers;
13.53 AWS.Services.Dispatchers.Linker
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2005-2012, 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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
with AWS.Dispatchers;
with AWS.Response;
with AWS.Status;
package AWS.Services.Dispatchers.Linker is
procedure Register
(Dispatcher : in out Handler;
First, Second : AWS.Dispatchers.Handler'Class);
-- Set the dispatcher first and second handler. The First handler will be
-- looked for before the second.
private
-- implementation removed
end AWS.Services.Dispatchers.Linker;
13.54 AWS.Services.Dispatchers.Method
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2000-2012, 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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
with AWS.Dispatchers;
with AWS.Response;
with AWS.Status;
package AWS.Services.Dispatchers.Method is
procedure Register
(Dispatcher : in out Handler;
Method : Status.Request_Method;
Action : AWS.Dispatchers.Handler'Class);
-- Register callback to use for a specific request method
procedure Register
(Dispatcher : in out Handler;
Method : Status.Request_Method;
Action : Response.Callback);
-- Idem as above but take a callback procedure as parameter
procedure Unregister
(Dispatcher : in out Handler;
Method : Status.Request_Method);
-- Removes Method from the list of request method to handle
procedure Register_Default_Callback
(Dispatcher : in out Handler;
Action : AWS.Dispatchers.Handler'Class);
-- Register the default callback. This will be used if no request method
-- have been activated.
private
-- implementation removed
end AWS.Services.Dispatchers.Method;
13.55 AWS.Services.Dispatchers.URI
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2000-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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
with AWS.Dispatchers;
with AWS.Response;
with AWS.Status;
with AWS.Utils;
package AWS.Services.Dispatchers.URI is
procedure Register
(Dispatcher : in out Handler;
URI : String;
Action : AWS.Dispatchers.Handler'Class;
Prefix : Boolean := False);
-- Register URI to use the specified dispatcher. URI is the full string
-- that must match the resource requested (with the leading /). If Prefix
-- is True, only the URI prefix is checked.
procedure Register
(Dispatcher : in out Handler;
URI : String;
Action : Response.Callback;
procedure Register_Regexp
(Dispatcher : in out Handler;
URI : String;
Action : AWS.Dispatchers.Handler'Class);
-- Register URI to use the specified dispatcher. URI is a regular
-- expression that must match the resource requested (with the leading /).
procedure Register_Regexp
(Dispatcher : in out Handler;
URI : String;
Action : Response.Callback);
-- Idem as above but take a callback procedure as parameter
procedure Unregister
(Dispatcher : in out Handler;
URI : String);
-- Removes URI from the list. URI is either a name or a regexp and must
-- have exactly the value used with Register.
procedure Register_Default_Callback
(Dispatcher : in out Handler;
Action : AWS.Dispatchers.Handler'Class);
-- Register the default callback. This will be used if no URI match
-- the request.
private
-- implementation removed
end AWS.Services.Dispatchers.URI;
13.56 AWS.Services.Dispatchers.Virtual_Host
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2000-2012, 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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
with AWS.Dispatchers;
with AWS.Response;
with AWS.Status;
package AWS.Services.Dispatchers.Virtual_Host is
procedure Register
(Dispatcher : in out Handler;
Virtual_Hostname : String;
Hostname : String);
-- Register Virtual_Hostname to be a redirection to the specified
-- hostname.
procedure Register
(Dispatcher : in out Handler;
Virtual_Hostname : String;
Action : AWS.Dispatchers.Handler'Class);
-- Register Virtual_Hostname to use the specified callback
procedure Register
(Dispatcher : in out Handler;
Virtual_Hostname : String;
Action : Response.Callback);
-- Idem as above but take a callback procedure as parameter
procedure Unregister
(Dispatcher : in out Handler;
Virtual_Hostname : String);
-- Removes Virtual_Hostname from the list of virtual hostnames to handle
procedure Register_Default_Callback
(Dispatcher : in out Handler;
Action : AWS.Dispatchers.Handler'Class);
-- Register the default callback. This will be used if no Virtual_Hostname
-- match the request.
private
-- implementation removed
end AWS.Services.Dispatchers.Virtual_Host;
13.57 AWS.Services.Download
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2005-2012, 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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
-- This is a download manager service, can be used to avoid polluting the main
-- server slot with long downloads. A single task is used in this
-- implementation.
with AWS.Config;
with AWS.Dispatchers;
with AWS.Resources.Streams;
with AWS.Response;
with AWS.Services.Dispatchers.Linker;
with AWS.Status;
package AWS.Services.Download is
procedure Start
(Server_Dispatcher : AWS.Dispatchers.Handler'Class;
Main_Dispatcher : out Services.Dispatchers.Linker.Handler;
Max_Concurrent_Download : Positive := Config.Max_Concurrent_Download);
-- Start the download manager server. Server_Dispatcher is the dispatcher
-- for the Web server. Main_Dispatcher is the dispatcher that must be used
-- with the main server start routine. This dispatcher handles the standard
-- web server resources and the download manager ones.
-- Max_Concurrent_Download contains the number of simultaneous download
-- that can be handled, request past this limit are queued. Note that a
-- single task is used for this implementation. Using a download manager is
-- useful to avoid the standard Web server to be busy with long downloads.
procedure Stop;
function Build
(Request : Status.Data;
Name : String;
Resource : not null access Resources.Streams.Stream_Type'Class)
return Response.Data;
-- Queue a download request. If there is room on the download manager the
-- template page aws_download_manager_start.thtml is used to build the
-- answer otherwise the template page aws_download_manager_waiting.thtml is
-- used. Name is the resource name and will be the default name used on the
-- user side to save the file on disk. Resource is a stream on which the
-- data to be sent are read.
--
-- Templates tags description:
--
-- aws_download_manager_waiting.thtml
-- NAME the name of the resource as pass to build
-- RES_URI the resource URI unique to the download server
-- POSITION the position on the waiting queue
-- aws_download_manager_start.thtml
-- NAME the name of the resource as pass to build
-- RES_URI the resource URI unique to the download server
--
-- Note that both template pages must contain a refresh meta-tag:
--
-- <meta http-equiv="refresh" content="2">
end AWS.Services.Download;
13.58 AWS.Services.Page_Server
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2000-2013, 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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
with AWS.Messages;
with AWS.Response;
with AWS.Status;
package AWS.Services.Page_Server is
end AWS.Services.Page_Server;
13.59 AWS.Services.Split_Pages
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2003-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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
with Ada.Strings.Unbounded;
with AWS.Response;
with AWS.Templates;
package AWS.Services.Split_Pages is
use Ada.Strings.Unbounded;
Splitter_Error : exception;
function Get_Page_Ranges
(This : Splitter;
Table : Templates.Translate_Set) return Ranges_Table is abstract;
-- Get_Page_Ranges is called to define the range (in lines) of each split
-- page. Note that the ranges may overlap and need not cover the full
-- table.
function Get_Translations
(This : Splitter;
Page : Positive;
URIs : URI_Table;
Ranges : Ranges_Table) return Templates.Translate_Set is abstract;
-- Get_Translations builds the translation table for use with the splitter
function Parse
(Template : String;
Translations : Templates.Translate_Set;
Table : Templates.Translate_Set;
Split_Rule : Splitter'Class;
Cached : Boolean := True) return Response.Data;
function Parse
(Template : String;
Translations : Templates.Translate_Table;
Table : Templates.Translate_Table;
Split_Rule : Splitter'Class;
Cached : Boolean := True) return Response.Data;
-- Parse the Template file and split the result in multiple pages.
-- Translations is a standard Translate_Set used for all pages. Table
-- is the Translate_Set containing data for the table to split in
-- multiple pages. This table will be analysed and according to the
-- Split_Rule, a set of transient pages will be created.
-- If Cached is True the template will be cached (see Templates_Parser
-- documentation).
-- Each Split_Rule define a number of specific tags for use in the template
-- file.
function Parse
(Template : String;
Translations : Templates.Translate_Table;
Table : Templates.Translate_Table;
Max_Per_Page : Positive := 25;
Max_In_Index : Positive := 20;
Cached : Boolean := True) return Response.Data;
-- Compatibility function with previous version of AWS.
-- Uses the Uniform_Splitter
-- Note that the Max_In_Index parameter is ignored.
-- The same effect can be achieved by using the bounded_index.thtml
-- template for displaying the index.
private
-- implementation removed
end AWS.Services.Split_Pages;
13.60 AWS.Services.Split_Pages.Alpha
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2004-2012, 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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
package AWS.Services.Split_Pages.Alpha is
-- Split in (at most) 28 pages, one for empty fields, one for all fields
-- that start with a digit, and one for each different initial letter.
-- Note that leading spaces in the key field are ignored; this means that a
-- key field containing only spaces is treated as an empty field.
-- The key field is set by calling Set_Key. If no key is defined, or no
-- corresponding association is found in Table, or the association is not a
-- vector, Splitter_Error is raised.
-- The key field must be sorted, and all values must be empty or start with
-- a digit or letter (case ignored). Otherwise, Splitter_Error is raised.
-- Letters that do not appear in the key field are associated to the empty
-- string; an Href can be specified instead by calling Set_Default_Href.
--
-- Tags:
-- NEXT The href to the next page.
-- PREVIOUS The href to the previous page.
-- FIRST The href to the first page.
-- LAST The href to the last page.
-- PAGE_INDEX Position of the current page in the INDEXES_V vector
-- HREFS_V A vector tag containing a set of href to pages, or "" if
-- their is no page for the corresponding letter.
-- INDEXES_V A vector tag (synchronized with HREFS_V) containing ' '
-- and the letters 'A' .. 'Z'
--
-- HREFS_V and INDEXES_V can be used to create an index to the generated
-- pages.
private
-- implementation removed
end AWS.Services.Split_Pages.Alpha;
13.61 AWS.Services.Split_Pages.Alpha.Bounded
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2004-2012, 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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
package AWS.Services.Split_Pages.Alpha.Bounded is
-- Same as the alpha splitter, but pages larger than Max_Per_Page are
-- further splitted.
-- A secondary index is generated that gives the various pages for a given
-- letter.
--
-- Tags (in addition to those of the alpha splitter):
-- S_NEXT The href to the next page.
-- S_PREVIOUS The href to the previous page.
-- S_FIRST The href to the first page.
-- S_LAST The href to the last page.
-- S_PAGE_INDEX Position of the current page in the S_INDEXES_V vector
-- Note that for this splitter, this is also the page number.
-- S_HREFS_V A vector tag containing a set of href to the different
-- pages for the current letter.
-- S_INDEXES_V A vector tag (synchronized with S_HREFS_V) containing the
-- page numbers for the hrefs.
--
-- HREFS_V and INDEXES_V can be used to create an index to the generated
-- pages. S_HREFS_V and S_INDEXES_V can be used to create a secondary
-- alphabetical index that points directly to the corresponding element.
private
-- implementation removed
end AWS.Services.Split_Pages.Alpha.Bounded;
13.62 AWS.Services.Split_Pages.Uniform
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2004-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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
package AWS.Services.Split_Pages.Uniform is
Page : Positive;
URIs : URI_Table;
Ranges : Ranges_Table) return Templates.Translate_Set;
private
-- implementation removed
end AWS.Services.Split_Pages.Uniform;
13.63 AWS.Services.Split_Pages.Uniform.Alpha
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2004-2012, 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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
package AWS.Services.Split_Pages.Uniform.Alpha is
private
-- implementation removed
end AWS.Services.Split_Pages.Uniform.Alpha;
13.64 AWS.Services.Split_Pages.Uniform.Overlapping
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2004-2012, 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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
package AWS.Services.Split_Pages.Uniform.Overlapping is
-- Same as the uniform splitter, but pages (except the first one)
-- repeat Overlap lines from the previous page in addition to the
-- Max_Per_Page lines
--
-- Tags:
-- Same as the Uniform splitter
type Splitter
(Max_Per_Page : Positive;
Overlap : Natural) is new Uniform.Splitter with private;
private
-- implementation removed
end AWS.Services.Split_Pages.Uniform.Overlapping;
13.65 AWS.Services.Transient_Pages
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2003-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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
pragma Ada_2012;
with AWS.Config;
with AWS.Resources.Streams;
package AWS.Services.Transient_Pages is
procedure Register
(URI : String;
Resource : Resources.Streams.Stream_Access;
Lifetime : Duration := Config.Transient_Lifetime);
-- Register a new transient page, this page will be deleted after Lifetime
-- seconds.
private
-- implementation removed
end AWS.Services.Transient_Pages;
13.66 AWS.Services.Web_Block
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2007-2013, 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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
pragma Ada_2012;
end AWS.Services.Web_Block;
13.67 AWS.Services.Web_Block.Context
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2007-2015, 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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
pragma Ada_2012;
package AWS.Services.Web_Block.Context is
type Id is private;
-- An object Id, the Id depends only on the context content. Two context
-- with the very same content will have the same Id.
generic
type Data is private;
Null_Data : Data;
package Generic_Data is
procedure Set_Value
(Context : in out Object;
Name : String;
Value : Data)
with Post => Context.Exist (Name);
-- Set key/pair value for the SID
end Generic_Data;
private
-- implementation removed
end AWS.Services.Web_Block.Context;
13.68 AWS.Services.Web_Block.Registry
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2007-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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
with Ada.Strings.Unbounded;
with AWS.Containers.Tables;
with AWS.Messages;
with AWS.MIME;
with AWS.Response;
with AWS.Services.Web_Block.Context;
with AWS.Status;
with AWS.Templates;
package AWS.Services.Web_Block.Registry is
use Ada;
use Ada.Strings.Unbounded;
procedure Register
(Key : String;
Template : String;
Data_CB : Data_Callback;
Content_Type : String := MIME.Text_HTML;
Prefix : Boolean := False;
Context_Required : Boolean := False);
-- Key is a Lazy_Tag or template page name. Template is the corresponding
-- template file. Data_CB is the callback used to retrieve the translation
-- table to render the page. If Context_Required is True a proper context
-- must be present when rendering the page otherwise Context_Error callback
-- (see Build below) is called.
procedure Register
(Key : String;
Template_CB : Template_Callback;
Data_CB : Data_Callback;
Content_Type : String := MIME.Text_HTML;
Context_Required : Boolean := False);
-- Key is a Lazy_Tag or template page name. Template_CB is the callback
-- used to retrieve the corresponding template file name. Data_CB is the
-- callback used to retrieve the translation table to render the page.
procedure Register_Pattern_URL
(Prefix : String;
Regexp : String;
Template : String;
Data_CB : Data_With_Param_Callback;
Content_Type : String := MIME.Text_HTML;
Context_Required : Boolean := False);
-- Prefix is the prefix key to match
-- Then the rest of the url is a regular expression defined by Regexp
-- All regular-expression groups (inside parenthesis) is captured and pass
-- to the Data_CB in the Parameters vector
-- For instance, with:
-- Prefix = '/page/'
-- Regexp = '([0-9]+)/section-([a-z]+)/.*'
-- The url '/page/42/section-b/part2' will be matched and Data_CB will
-- be called with Parameters = <42, "b">
procedure Register_Pattern_URL
(Prefix : String;
Regexp : String;
Template_CB : Template_Callback;
Data_CB : Data_With_Param_Callback;
Content_Type : String := MIME.Text_HTML;
Context_Required : Boolean := False);
-- Same as above but takes a Template_Callback
function Parse
(Key : String;
Request : Status.Data;
Translations : Templates.Translate_Set;
Context : Web_Block.Context.Object := Web_Block.Context.Empty;
Context_Error : String := "") return Page;
-- Parse the Web page registered under Key. Context_Error is the key
-- of the registered template to use when a required context is not
-- present.
function Build
(Key : String;
Request : Status.Data;
Translations : Templates.Translate_Set;
Status_Code : Messages.Status_Code := Messages.S200;
Cache_Control : Messages.Cache_Option := Messages.Unspecified;
Context : access Web_Block.Context.Object := null;
Context_Error : String := "") return Response.Data;
-- Same as above but returns a standard Web page. If Context is set it
-- is the initial value and will be setup at the end to correspond to
-- the recorded new context.
function Get_Context
(Request : Status.Data) return Web_Block.Context.Object;
-- Gets the proper context object for this request. Note that if the
-- context object is modified outside of the Web_Block framework it must be
-- passed to the Build or Parse procedure above.
private
-- implementation removed
end AWS.Services.Web_Block.Registry;
13.69 AWS.Session
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2000-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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
pragma Ada_2012;
-- This is the API to handle session data for each client connected
with Ada.Calendar;
package AWS.Session is
type Id is private;
generic
type Data is private;
Null_Data : Data;
package Generic_Data is
function Get (SID : Id; Key : String) return Data with Inline;
-- Returns the Value for Key in the session SID or Null_Data if
-- key does not exist.
end Generic_Data;
---------------
-- Iterators --
---------------
generic
with procedure Action
(N : Positive;
SID : Id;
Time_Stamp : Ada.Calendar.Time;
Quit : in out Boolean);
procedure For_Every_Session;
-- Iterator which call Action for every active session. N is the SID
-- order. Time_Stamp is the time when SID was updated for the last
-- time. Quit is set to False by default, it is possible to control the
-- iterator termination by setting its value to True. Note that in the
-- Action procedure it is possible to use routines that read session's
-- data (Get, Exist) but any routines which modify the data will block
-- (i.e. Touch, Set, Remove, Delete will dead lock).
generic
with procedure Action
(N : Positive;
Key, Value : String;
Kind : Value_Kind;
Quit : in out Boolean);
procedure For_Every_Session_Data (SID : Id);
-- Iterator which returns all the key/value pair defined for session SID.
-- Quit is set to False by default, it is possible to control the iterator
-- termination by setting its value to True. Note that in the Action
-- procedure it is possible to use routines that read session's data (Get,
-- Exist) but any routines which modify the data will block (i.e. Touch,
-- Set, Remove, Delete will dead lock).
--------------
-- Lifetime --
--------------
----------------------
-- Session Callback --
----------------------
----------------
-- Session IO --
----------------
private
-- implementation removed
end AWS.Session;
13.70 AWS.SMTP
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2000-2017, 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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
pragma Ada_2012;
-- This library implement the Simple Mail Transfer Protocol. Only part of the
-- RFC 821 is covered. There is no support to send a message to a console for
-- example.
with AWS.Net;
package AWS.SMTP is
Server_Error : exception;
-- Raised when an unrecoverable error is found
Reply_Code_Error : exception;
-- Raised when a reply code error is not known
--------------
-- Receiver --
--------------
function Initialize
(Server_Name : String;
Port : Positive := Default_SMTP_Port;
Secure : Boolean := False;
Family : Net.Family_Type := Net.Family_Unspec;
Credential : access constant Authentication.Credential'Class := null;
Timeout : Duration := Net.Forever)
return Receiver;
-- Create a Server composed of the Name and the Port (default SMTP port
-- is 25), this server will be used to send SMTP message.
----------------
-- Reply_Code --
----------------
------------
-- Status --
------------
-----------------
-- E_Mail_Data --
-----------------
function Image
(E_Mail : E_Mail_Data;
Mode : Address_Mode := Full) return String;
-- Returns E_Mail only (Mode = Address), recipient name only (Mode = Name)
-- or Name and e-mail (Mode = Full).
private
-- implementation removed
end AWS.SMTP;
13.71 AWS.SMTP.Client
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2000-2017, 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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
--
-- This unit implements an API to send email messages. It is possible to send
-- simple email [RFC 821] and email with MIME attachments [RFC 2045 & 2049].
--
-- How to send an email:
--
-- 1) Initialize a Server to send the messages.
--
-- Wanadoo : SMTP.Receiver := SMTP.Client.Initialize ("smtp.wanadoo.fr");
--
-- Optionally, request Authentication
--
-- Auth : aliased SMTP.Authentication.Credential :=
-- SMTP.Authentication.Plain.Initialize ("id", "password");
--
-- Wanadoo : SMTP.Receiver :=
-- SMTP.Client.Initialize
-- ("smtp.wanadoo.fr", Credential => Auth'Access);
--
-- 2) Send a message via the server.
--
-- Result : SMTP.Status;
--
-- SMTP.Client.Send
-- (Server => Wanadoo,
-- From => SMTP.E_Mail ("Pascal Obry", "[email protected]"),
-- To => SMTP.E_Mail
with AWS.Attachments;
package AWS.SMTP.Client is
function Initialize
(Server_Name : String;
Port : Positive := Default_SMTP_Port;
Secure : Boolean := False;
Family : Net.Family_Type := Net.Family_Unspec;
Credential : access constant Authentication.Credential'Class := null;
Timeout : Duration := Net.Forever)
return Receiver renames SMTP.Initialize;
procedure Send
(Server : Receiver;
From : E_Mail_Data;
To : E_Mail_Data;
Subject : String;
Message : String;
Status : out SMTP.Status;
CC : Recipients := No_Recipient;
BCC : Recipients := No_Recipient;
To_All : Boolean := True);
-- Send a message via Server. The email is a simple message composed of a
-- subject and a text message body. Raise Server_Error in case of an
-- unrecoverable error (e.g. can't contact the server).
-- If To_All is False email is sent even if some email addresses
-- in recipient list are not correct.
procedure Send
(Server : Receiver;
From : E_Mail_Data;
To : E_Mail_Data;
Subject : String;
procedure Send
(Server : Receiver;
From : E_Mail_Data;
To : E_Mail_Data;
Subject : String;
Filename : Message_File;
Status : out SMTP.Status;
CC : Recipients := No_Recipient;
BCC : Recipients := No_Recipient;
To_All : Boolean := True);
-- Send filename content via Server. The email is a message composed of a
-- subject and a message body coming from a file. Raises Server_Error in
-- case of an unrecoverable error (e.g. can't contact the server). Raises
-- Constraint_Error if Filename cannot be opened.
--
-- Extentded interfaces to send a message to many recipients
--
procedure Send
(Server : Receiver;
From : E_Mail_Data;
To : Recipients;
Subject : String;
Message : String;
Status : out SMTP.Status;
CC : Recipients := No_Recipient;
BCC : Recipients := No_Recipient;
To_All : Boolean := True);
-- Send a message via Server. The mail is a simple message composed of a
-- subject and a text message body. Raise Server_Error in case of an
-- unrecoverable error (e.g. can't contact the server).
-- If To_All is False email is sent even if some email addresses
-- in recipient list are not correct.
procedure Send
(Server : Receiver;
From : E_Mail_Data;
To : Recipients;
Source : String;
Status : out SMTP.Status;
CC : Recipients := No_Recipient;
BCC : Recipients := No_Recipient;
procedure Send
(Server : Receiver;
From : E_Mail_Data;
To : Recipients;
Subject : String;
Message : String := "";
Attachments : Attachment_Set;
Status : out SMTP.Status;
CC : Recipients := No_Recipient;
BCC : Recipients := No_Recipient;
To_All : Boolean := True);
-- Send a message via Server. The email is a MIME message composed of a
-- subject, a message and a set of files MIME encoded. Raise Server_Error
-- in case of an unrecoverable error (e.g. can't contact the server).
-- Raises Constraint_Error if a file attachment cannot be opened.
-- If To_All is False email is sent even if some email addresses in
-- recipient list are not correct.
procedure Send
(Server : Receiver;
From : E_Mail_Data;
To : Recipients;
Subject : String;
Attachments : AWS.Attachments.List;
Status : out SMTP.Status;
CC : Recipients := No_Recipient;
BCC : Recipients := No_Recipient;
To_All : Boolean := True);
-- As above but takes an attachment list which support complex attachments
-- like multiplart/alternative.
private
-- implementation removed
end AWS.SMTP.Client;
13.72 AWS.Status
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2000-2016, 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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
pragma Ada_2012;
-- This package is used to keep the HTTP protocol status. Client can then
-- request the status for various values like the requested URI, the
-- Content_Length and the Session ID for example.
with Ada.Calendar;
with Ada.Real_Time;
with Ada.Streams;
with Ada.Strings.Unbounded;
with AWS.Attachments;
with AWS.Headers;
with AWS.Messages;
with AWS.Net;
with AWS.Parameters;
with AWS.Session;
with AWS.URL;
package AWS.Status is
use Ada;
use Ada.Streams;
use Ada.Strings.Unbounded;
type Request_Method is
(OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT, EXTENSION_METHOD);
-- EXTENSION_METHOD indicates that a method is an extension-method,
-- ie none of the eight method tokens predefined in the RFC 2616.
------------------
-- Request-Line --
------------------
function Parameter
(D : Data; Name : String; N : Positive := 1) return String with Inline;
------------
-- Header --
------------
function Is_Supported
(D : Data;
Encoding : Messages.Content_Encoding) return Boolean;
-- Returns True if the content encoding scheme is supported by the client
-------------------------------------------
-- Cross-Origin Resource Sharing Headers --
-------------------------------------------
----------------
-- Connection --
----------------
----------
-- Data --
----------
procedure Read_Body
(D : Data;
Buffer : out Stream_Element_Array;
Last : out Stream_Element_Offset)
with Inline;
-- Read a chunk of data from message body and put them into Buffer.
-----------------
-- Attachments --
-----------------
-------------
-- Session --
-------------
----------
-- SOAP --
----------
-----------
-- HTTPS --
-----------
function Check_Digest
(D : Data; Password : String) return Messages.Status_Code;
-- This function is used by the digest authentication to check if the
private
-- implementation removed
end AWS.Status;
13.73 AWS.Templates
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2000-2012, 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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
with Templates_Parser;
13.74 AWS.Translator
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2000-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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
pragma Ada_2012;
with Ada.Streams;
with Ada.Strings.Unbounded;
with AWS.Resources.Streams.Memory.ZLib;
with AWS.Utils;
package AWS.Translator is
use Ada.Streams;
use Ada.Strings.Unbounded;
------------
-- Base64 --
------------
--
-- Decoding does not have to have Base64_Mode parameter, because data
-- coding easy detected automatically.
procedure Base64_Encode
(Data : Unbounded_String;
B64_Data : out Base64_UString;
Mode : Base64_Mode := MIME)
with
Post =>
(Mode = MIME
and then
(for all K in 1 .. Length (B64_Data) =>
Element (B64_Data, K) not in '-' | '_'))
or else
(Mode = URL
and then
(for all K in 1 .. Length (B64_Data) =>
Element (B64_Data, K) not in '+' | '/'));
function Base64_Encode
(Data : Stream_Element_Array;
Mode : Base64_Mode := MIME) return Base64_String
with
Post =>
(Mode = MIME
and then
(for all C of Base64_Encode'Result => C not in '-' | '_'))
or else
(Mode = URL
and then
(for all C of Base64_Encode'Result => C not in '+' | '/'));
-- Encode Data using the base64 algorithm
function Base64_Encode
(Data : String; Mode : Base64_Mode := MIME) return Base64_String
with
Post =>
(Mode = MIME
and then
(for all C of Base64_Encode'Result => C not in '-' | '_'))
or else
(Mode = URL
and then
(for all C of Base64_Encode'Result => C not in '+' | '/'));
procedure Base64_Decode
(B64_Data : Base64_UString;
Data : out Unbounded_String);
function Base64_Decode
(B64_Data : Base64_String) return Stream_Element_Array;
-- Decode B64_Data using the base64 algorithm
--------
-- QP --
--------
------------------------------------
-- String to Stream_Element_Array --
------------------------------------
function To_String
(Data : Stream_Element_Array) return String with Inline;
-- Convert a Stream_Element_Array to a string. Note that as this routine
-- returns a String it should not be used with large array as this could
-- break the stack size limit. Use the routine below for large array.
function To_Stream_Element_Array
(Data : String) return Stream_Element_Array with Inline;
-- Convert a String to a Stream_Element_Array
function To_Unbounded_String
(Data : Stream_Element_Array) return Unbounded_String;
-- Convert a Stream_Element_Array to an Unbounded_String
--------------------------
-- Compress/Decompress --
--------------------------
function Compress
(Data : Stream_Element_Array;
Level : Compression_Level := Default_Compression;
Header : ZL.Header_Type := ZL.Default_Header)
return Utils.Stream_Element_Array_Access;
-- Returns Data compressed with a standard deflate algorithm based on the
-- zlib library. The result is dynamically allocated and must be
-- explicitly freed.
function Decompress
(Data : Stream_Element_Array;
Header : ZL.Header_Type := ZL.Default_Header)
return Utils.Stream_Element_Array_Access;
end AWS.Translator;
13.75 AWS.URL
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2000-2015, 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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
pragma Ada_2012;
with Ada.Strings.Maps;
with Ada.Strings.Unbounded;
with AWS.Parameters;
package AWS.URL is
use Ada;
URL_Error : exception;
function Parse
(URL : String;
Check_Validity : Boolean := True;
Normalize : Boolean := False) return Object;
-- Parse an URL and return an Object representing this URL. It is then
-- possible to extract each part of the URL with the services bellow.
-- Raises URL_Error if Check_Validity is true and the URL reference a
-- resource above the web root directory.
function Host
(URL : Object; IPv6_Brackets : Boolean := False) return String;
-- Returns the hostname in IPv6 breakets if necessary
function Abs_Path
(URL : Object;
Encode : Boolean := False) return String;
-- Returns the absolute path. This is the complete resource reference
-- without the query part.
function Query
(URL : Object;
Encode : Boolean := False) return String;
-- Returns the Query part of the URL or the empty string if none was
-- specified. Note that character '?' is not part of the Query and is
-- therefore not returned.
--
-- Below are extended API not part of the RFC 2616 URL specification
--
function Server_Name
(URL : Object; IPv6_Brackets : Boolean := False) return String
renames Host;
function Parameters
(URL : Object;
Encode : Boolean := False) return String;
-- Returns the Parameters (including the starting ? character). If Encode
-- is True then the URL will be encoded using the Encode routine.
function Pathname
(URL : Object;
Encode : Boolean := False) return String renames Abs_Path;
function Pathname_And_Parameters
(URL : Object;
Encode : Boolean := False) return String;
-- Returns the pathname and the parameters. This is equivalent to:
-- Pathname & Parameters.
function Parameter
(URL : Object; Name : String; N : Positive := 1) return String
with Inline;
-- Returns the Nth value associated with Key into Table. Returns
-- the emptry string if key does not exist.
--
-- URL Resolution
--
--
-- URL Encoding and Decoding
--
function Encode
(Str : String;
Encoding_Set : Strings.Maps.Character_Set := Default_Encoding_Set)
return String;
-- Encode Str into a URL-safe form. Many characters are forbiden into an
-- URL and needs to be encoded. A character is encoded by %XY where XY is
-- the character's ASCII hexadecimal code. For example a space is encoded
-- as %20.
private
-- implementation removed
end AWS.URL;
13.76 SOAP
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2000-2015, 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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
package SOAP is
SOAP_Error : exception;
-- Will be raised when an error occurs in the SOAP implementation. The
-- exception message will described the problem.
end SOAP;
13.77 SOAP.Client
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2000-2015, 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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
pragma Ada_2012;
with AWS.Client;
with SOAP.Message.Payload;
with SOAP.Message.Response;
with SOAP.WSDL.Schema;
package SOAP.Client is
function Call
(URL : String;
P : Message.Payload.Object;
SOAPAction : String := No_SOAPAction;
User : String := Not_Specified;
Pwd : String := Not_Specified;
Proxy : String := Not_Specified;
Proxy_User : String := Not_Specified;
Proxy_Pwd : String := Not_Specified;
Timeouts : AWS.Client.Timeouts_Values := AWS.Client.No_Timeout;
Asynchronous : Boolean := False;
Schema : WSDL.Schema.Definition := WSDL.Schema.Empty)
return Message.Response.Object'Class
with Pre => URL'Length > 0;
-- Send a SOAP HTTP request to URL address. The P is the Payload and
-- SOAPAction is the required HTTP field. If it is not specified then the
-- URI (URL resource) will be used for the SOAPAction field. The complete
-- format is "URL & '#' & Procedure_Name" (Procedure_Name is retrieved
-- from the Payload object.
--
-- If Asynchronous is set to True the response from the server may be
-- empty. In this specific case the success of the call depends on the
-- HTTP status code.
function Call
(Connection : AWS.Client.HTTP_Connection;
SOAPAction : String;
P : Message.Payload.Object;
Asynchronous : Boolean := False;
Schema : WSDL.Schema.Definition := WSDL.Schema.Empty)
return Message.Response.Object'Class
with Pre => AWS.Client.Host (Connection)'Length > 0;
-- Idem as above, but use an already opened connection
end SOAP.Client;
13.78 SOAP.Dispatchers
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2003-2015, 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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
with AWS.Dispatchers;
with AWS.Response;
with AWS.Status;
with SOAP.Message.Payload;
with SOAP.WSDL.Schema;
package SOAP.Dispatchers is
function Schema
(Dispatcher : Handler;
SOAPAction : String)
return WSDL.Schema.Definition;
-- Returns the schema for the given SOAPAction
type SOAP_Callback is
access function (SOAPAction : String;
Payload : Message.Payload.Object;
Request : AWS.Status.Data)
return AWS.Response.Data;
-- This is the SOAP Server callback type. SOAPAction is the HTTP header
-- SOAPAction value, Payload is the parsed XML payload, request is the
-- HTTP request status.
function Dispatch_SOAP
(Dispatcher : Handler;
SOAPAction : String;
Payload : Message.Payload.Object;
Request : AWS.Status.Data)
return AWS.Response.Data is abstract;
-- This dispatch function is called for SOAP requests
function Dispatch_HTTP
(Dispatcher : Handler;
Request : AWS.Status.Data)
return AWS.Response.Data is abstract;
-- This dispatch function is called for standard HTTP requests
private
-- implementation removed
end SOAP.Dispatchers;
13.79 SOAP.Dispatchers.Callback
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2003-2015, 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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
with SOAP.Message;
with SOAP.WSDL.Schema;
package SOAP.Dispatchers.Callback is
function Create
(HTTP_Callback : AWS.Response.Callback;
SOAP_Callback : Dispatchers.SOAP_Callback;
Schema : WSDL.Schema.Definition :=
WSDL.Schema.Empty) return Handler;
-- Build a dispatcher for the specified callback
private
-- implementation removed
end SOAP.Dispatchers.Callback;
13.80 SOAP.Message
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2000-2015, 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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
with Ada.Strings.Unbounded;
with SOAP.Name_Space;
with SOAP.Parameters;
with SOAP.WSDL.Schema;
package SOAP.Message is
use Ada.Strings.Unbounded;
function XML_Image
(M : Object;
Schema : WSDL.Schema.Definition := WSDL.Schema.Empty)
return Unbounded_String;
-- Returns the XML image for the wrapper and parameters. This is designed
-- to be used by Payload and Response object.
procedure Set_Name_Space
(M : in out Object'Class;
NS : SOAP.Name_Space.Object);
-- Set message's Namespace
procedure Set_Wrapper_Name
(M : in out Object'Class;
Name : String);
-- Set message's wrapper name
procedure Set_Parameters
(M : in out Object'Class;
P_Set : SOAP.Parameters.List);
-- Set message's parameters
private
-- implementation removed
end SOAP.Message;
13.81 SOAP.Message.XML
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2000-2015, 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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
pragma Ada_2012;
with AWS.Client;
with SOAP.Message.Payload;
with SOAP.Message.Response;
with SOAP.WSDL.Schema;
package SOAP.Message.XML is
function Load_Payload
(XML : aliased String;
Envelope : Boolean := True;
Schema : WSDL.Schema.Definition := WSDL.Schema.Empty)
return Message.Payload.Object;
-- Build a Payload object by parsing the XML payload string.
-- If Envelope is False, the message could consists only from body
-- with arbitrary named root tag without mandatory SOAP Envelope wrapper.
function Load_Payload
(XML : Unbounded_String;
Envelope : Boolean := True;
Schema : WSDL.Schema.Definition := WSDL.Schema.Empty)
return Message.Payload.Object;
-- Build a Payload object by parsing the XML payload string
function Load_Response
(Connection : AWS.Client.HTTP_Connection;
Envelope : Boolean := True;
Schema : WSDL.Schema.Definition := WSDL.Schema.Empty)
return Message.Response.Object'Class;
-- Build a Response object (either a standard response or an error
-- response) by parsing the HTTP client connection output.
-- If Envelope is False, the message could consists only from body
-- with arbitrary named root tag without mandatory SOAP Envelope wrapper.
function Load_Response
(XML : aliased String;
Envelope : Boolean := True;
Schema : WSDL.Schema.Definition := WSDL.Schema.Empty)
return Message.Response.Object'Class;
-- Build a Response object (either a standard response or an error
-- response) by parsing the XML response string.
-- If Envelope is False, the message could consists only from body
-- with arbitrary named root tag without mandatory SOAP Envelope wrapper.
function Load_Response
(XML : Unbounded_String;
Envelope : Boolean := True;
Schema : WSDL.Schema.Definition := WSDL.Schema.Empty)
return Message.Response.Object'Class;
-- As above but using an Unbounded_String
function Image
(O : Object'Class;
Schema : WSDL.Schema.Definition := WSDL.Schema.Empty) return String;
-- Returns XML representation of object O
function Image
(O : Object'Class;
Schema : WSDL.Schema.Definition :=
WSDL.Schema.Empty) return Unbounded_String;
-- Idem as above but returns an Unbounded_String instead of a String
end SOAP.Message.XML;
13.82 SOAP.Parameters
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2000-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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
pragma Ada_2012;
with Ada.Calendar;
with Ada.Strings.Unbounded;
with SOAP.Types;
package SOAP.Parameters is
use Ada.Strings.Unbounded;
with Inline;
-- Returns parameter named Name in P as a Unsigned_Short value. Raises
-- Types.Data_Error if this parameter does not exist or is not an
-- Unsigned_Short.
------------------
-- Constructors --
------------------
----------------
-- Validation --
----------------
private
-- implementation removed
end SOAP.Parameters;
13.83 SOAP.Types
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2001-2017, 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. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- 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/>. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
------------------------------------------------------------------------------
pragma Ada_2012;
with Ada.Calendar;
with Ada.Finalization;
with Ada.Strings.Unbounded;
with SOAP.Name_Space;
with SOAP.WSDL.Schema;
package SOAP.Types is
use Ada;
use Ada.Strings.Unbounded;
Data_Error : exception;
-- Raised when a variable has not the expected type
procedure XML_Image
(O : Object;
Result : in out Unbounded_String;
Encoding : Encoding_Style := WSDL.Schema.Encoded;
Schema : WSDL.Schema.Definition := WSDL.Schema.Empty);
-- Returns O value encoded for use by the Payload object or Response
-- object. The generated characters are appened to Result.
--------------
-- Any Type --
--------------
function Any
(V : Object'Class;
Name : String := "item";
Type_Name : String := "";
NS : Name_Space.Object := Name_Space.No_Name_Space)
return XSD_Any_Type;
-----------
-- Array --
-----------
function A
(V : Object_Set;
Name : String;
Type_Name : String := "";
NS : Name_Space.Object := Name_Space.No_Name_Space)
return SOAP_Array;
-- Type_Name of the array's elements, if not specified it will be computed
-- based on element's name.
----------
-- Set --
----------
function Set
(V : Object_Set;
Name : String;
Type_Name : String := "";
NS : SOAP.Name_Space.Object := SOAP.Name_Space.No_Name_Space)
return SOAP_Set;
-- Type_Name of the array's elements, if not specified it will be computed
-- based on element's name.
------------
-- Base64 --
------------
function B64
(V : String;
Name : String := "item";
Type_Name : String := XML_Base64;
NS : Name_Space.Object := Name_Space.No_Name_Space)
return SOAP_Base64;
-------------
-- Boolean --
-------------
function B
(V : Boolean;
Name : String := "item";
Type_Name : String := XML_Boolean;
NS : Name_Space.Object := Name_Space.No_Name_Space)
return XSD_Boolean;
function V (O : XSD_Boolean) return Boolean;
----------
-- Byte --
----------
function B
(V : Byte;
Name : String := "item";
Type_Name : String := XML_Byte;
NS : Name_Space.Object := Name_Space.No_Name_Space)
return XSD_Byte;
function V (O : XSD_Byte) return Byte;
------------
-- Double --
------------
function D
(V : Long_Float;
Name : String := "item";
Type_Name : String := XML_Double;
NS : Name_Space.Object := Name_Space.No_Name_Space)
return XSD_Double;
-----------
-- Float --
-----------
function F
(V : Float;
Name : String := "item";
Type_Name : String := XML_Float;
NS : Name_Space.Object := Name_Space.No_Name_Space)
return XSD_Float;
function V (O : XSD_Float) return Float;
-------------
-- Integer --
-------------
function I
(V : Integer;
Name : String := "item";
Type_Name : String := XML_Int;
NS : Name_Space.Object := Name_Space.No_Name_Space)
return XSD_Integer;
function V (O : XSD_Integer) return Integer;
----------
-- Long --
----------
function L
(V : Long;
Name : String := "item";
Type_Name : String := XML_Long;
NS : Name_Space.Object := Name_Space.No_Name_Space)
return XSD_Long;
function V (O : XSD_Long) return Long;
----------
-- Null --
----------
------------
-- Record --
------------
function R
(V : Object_Set;
Name : String;
Type_Name : String := "";
NS : Name_Space.Object := Name_Space.No_Name_Space)
return SOAP_Record;
-- If Type_Name is omitted then the type name is the name of the record.
-- Type_Name must be specified for item into an array for example.
-----------
-- Short --
-----------
function S
(V : Short;
Name : String := "item";
Type_Name : String := XML_Short;
NS : Name_Space.Object := Name_Space.No_Name_Space)
return XSD_Short;
function V (O : XSD_Short) return Short;
------------
-- String --
------------
function S
(V : String;
Name : String := "item";
Type_Name : String := XML_String;
NS : Name_Space.Object := Name_Space.No_Name_Space)
return XSD_String;
function S
(V : Unbounded_String;
Name : String := "item";
Type_Name : String := XML_String;
NS : Name_Space.Object := Name_Space.No_Name_Space)
return XSD_String;
-----------------
-- TimeInstant --
-----------------
function T
(V : Local_Time;
Name : String := "item";
-------------------
-- Unsigned_Long --
-------------------
function UL
(V : Unsigned_Long;
Name : String := "item";
Type_Name : String := XML_Unsigned_Long;
NS : Name_Space.Object := Name_Space.No_Name_Space)
return XSD_Unsigned_Long;
function V (O : XSD_Unsigned_Long) return Unsigned_Long;
------------------
-- Unsigned_Int --
------------------
function UI
(V : Unsigned_Int;
Name : String := "item";
Type_Name : String := XML_Unsigned_Int;
NS : Name_Space.Object := Name_Space.No_Name_Space)
return XSD_Unsigned_Int;
function V (O : XSD_Unsigned_Int) return Unsigned_Int;
--------------------
-- Unsigned_Short --
--------------------
function US
(V : Unsigned_Short;
Name : String := "item";
Type_Name : String := XML_Unsigned_Short;
NS : Name_Space.Object := Name_Space.No_Name_Space)
return XSD_Unsigned_Short;
function V (O : XSD_Unsigned_Short) return Unsigned_Short;
-------------------
-- Unsigned_Byte --
-------------------
function UB
(V : Unsigned_Byte;
Name : String := "item";
Type_Name : String := XML_Unsigned_Byte;
NS : Name_Space.Object := Name_Space.No_Name_Space)
return XSD_Unsigned_Byte;
function V (O : XSD_Unsigned_Byte) return Unsigned_Byte;
-----------------
-- Enumeration --
-----------------
function E
(V : String;
Type_Name : String;
Name : String := "item";
NS : Name_Space.Object := Name_Space.No_Name_Space)
return SOAP_Enumeration;
---------
-- Get --
---------
-- Unsigned_Byte.
----------------
-- Name space --
----------------
procedure Set_Name_Space
(O : in out Object'Class;
NS : Name_Space.Object);
-- Set the name space for object O
private
-- implementation removed
end SOAP.Types;
A AWS.Net.SSL.Certificate, 195
ABORTABLE_V, 87 AWS.Net.Std, 3
ACCEPT_QUEUE_SIZE, 87 AWS.Net.WebSocket, 198
Accept_Queue_Size, 16 AWS.Net.WebSocket.Registry, 202
ACCEPTOR_LENGTH, 87 AWS.Net.WebSocket.Registry.Control, 205
ACTIVITY_COUNTER_V, 87 AWS.Parameters, 206
ACTIVITY_TIME_STAMP_V, 87 AWS.POP, 208
ada2wsdl, 63 AWS.Resources, 212
ada2wsdl limitations, 69 AWS.Resources.Embedded, 215
ADMIN, 87 AWS.Resources.Files, 217
Admin_Password, 16 AWS.Resources.Streams, 219
Admin_URI, 9, 16 AWS.Resources.Streams.Disk, 221
Ajax, 42 AWS.Resources.Streams.Disk.Once, 223
authentication, 23 AWS.Resources.Streams.Memory, 224
AWS.Attachments, 96 AWS.Resources.Streams.Memory.ZLib, 226
AWS.Client, 100 AWS.Resources.Streams.Pipe, 228
AWS.Client.Hotplug, 110 AWS.Response, 230
AWS.Communication, 112 AWS.Server, 237
AWS.Communication.Client, 113 AWS.Server.Hotplug, 242
AWS.Communication.Server, 114 AWS.Server.Log, 244
AWS.Config, 116 AWS.Server.Push, 246
AWS.Config.Ini, 124 AWS.Server.Status, 252
AWS.Config.Set, 125 AWS.Services.Callbacks, 254
AWS.Containers.Tables, 133 AWS.Services.Directory, 255
AWS.Cookie, 136 AWS.Services.Dispatchers, 258
AWS.Default, 139 AWS.Services.Dispatchers.Linker, 260
AWS.Dispatchers, 142 AWS.Services.Dispatchers.Method, 261
AWS.Dispatchers.Callback, 144 AWS.Services.Dispatchers.URI, 263
AWS.Exceptions, 145 AWS.Services.Dispatchers.Virtual_Host, 265
AWS.Headers, 147 AWS.Services.Download, 267
AWS.Headers.Values, 149 AWS.Services.Page_Server, 269
aws.ini, 16 AWS.Services.Split_Pages, 271
AWS.Jabber, 152 AWS.Services.Split_Pages.Alpha, 273
AWS.LDAP.Client, 153 AWS.Services.Split_Pages.Alpha.Bounded, 275
AWS.Log, 159 AWS.Services.Split_Pages.Alpha.Uniform, 277
AWS.Messages, 163 AWS.Services.Split_Pages.Alpha.Uniform.Alpha, 279
AWS.MIME, 170 AWS.Services.Split_Pages.Alpha.Uniform.Overlapping,
AWS.Net, 174 281
AWS.Net.Buffered, 182 AWS.Services.Transient_Pages, 282
AWS.Net.Log, 185 AWS.Services.Web_Block, 283
AWS.Net.Log.Callbacks, 187 AWS.Services.Web_Block.Context, 284
AWS.Net.SSL, 189 AWS.Services.Web_Block.Registry, 286
344
AWS Documentation, Release 18.0
AWS.Session, 289 D
AWS.SMTP, 293 digest, 23
AWS.SMTP.Client, 296 Directory browser, 37
AWS.Status, 300 Directory_Browser_Page, 17
AWS.Templates, 307 dispatcher, 37, 38
AWS.Translator, 308 dispatcher API, 144
AWS.URL, 312 Dispatchers, 37
aws_action_clear.tjs, 42 Dispatchers callback, 37
aws_action_replace.tjs, 42 Dispatchers Linker, 38
awsascb, 73 Dispatchers method, 37
awsres, 86 Dispatchers SOAP, 38
Dispatchers Timer, 38
B Dispatchers Transient pages, 38
basic, 23 Dispatchers URI, 38
Building, 4 Dispatchers virtual host, 38
Building resources, 85 Distributing, 12
Down_Image, 17
C Download Manager, 40
CA, 32 draft 302, 93
CA certificate, 31
Callback, 9, 10, 37, 144 E
Callback procedure, 10 ERROR_LOG, 87
CASE_SENSITIVE_PARAMETERS, 87 ERROR_LOG_FILE, 87
Case_Sensitive_Parameters, 9, 16 ERROR_LOG_FILENAME_PREFIX, 87
certificate, 30 ERROR_LOG_SPLIT_MODE, 87
Certificate (string), 16 exception handler, 34
Certificate Authority, 32 Exceptions, 145
Certificate_Required, 17 Exceptions handler, 145
CHECK_URL_VALIDITY, 87 Exchange_Certificate, 17
Check_URL_Validity, 17
CIPHER_PRIORITIES, 88 F
Cipher_Priorities (string), 17 File upload, 24
CLEANER_CLIENT_DATA_TIMEOUT, 87 FORCE_CLIENT_DATA_TIMEOUT, 87
Cleaner_Client_Data_Timeout, 17 Force_Client_Data_Timeout, 18
CLEANER_CLIENT_HEADER_TIMEOUT, 87 FORCE_CLIENT_HEADER_TIMEOUT, 87
Cleaner_Client_Header_Timeout, 17 Force_Client_Header_Timeout, 18
CLEANER_SERVER_RESPONSE_TIMEOUT, 87 FORCE_SERVER_RESPONSE_TIMEOUT, 87
Cleaner_Server_Response_Timeout, 17 Force_Server_Response_Timeout, 18
CLEANER_WAIT_FOR_CLIENT_TIMEOUT, 87 FORCE_WAIT_FOR_CLIENT_TIMEOUT, 88
Cleaner_Wait_For_Client_Timeout, 17 Force_Wait_For_Client_Timeout, 18
Client, 25, 69 Form parameters, 11
client, 36 FREE_SLOTS_KEEP_ALIVE_LIMIT, 88
client certificate, 31, 33 Free_Slots_Keep_Alive_Limit, 18
client HTTP, 35
Client protocol, 35 G
Communication, 25
GNAT, 3
Config_Directory, 17
GNU/Ada, 3
Configuration options, 16
GNUTLS, 3
Cookies, 22
GNUTLS build, 4
CRL, 17, 33
CRL_File, 17 H
cross-platforms, 4
Hello world, 10
CURRENT_CONNECTIONS, 87
hotplug, 26
Index 345
AWS Documentation, Release 18.0
Hotplug_Port, 18 Max_Concurrent_Download, 19
HTML File Upload, 91 MAX_CONNECTION, 88
HTTP Authentication, 93 Max_Connection, 9, 19
HTTP declaration, 8 Max_POST_Parameters, 19
HTTP state, 22 Max_WebSocket, 19
HTTP/1.0, 91 Max_WebSocket_Handler, 19
HTTP/1.1, 92 method, 37
HTTPS, 30 MIME, 92
MIME_Types, 19
I
IMAP/POP, 92 O
ini file, 16 OpenLDAP, 3
Installing, 6 OpenSSL, 3
OpenSSL build, 4
J
Jabber, 83 P
Jabber Binding, 152 Page server, 11, 39
Jabber message, 83 pages, 39, 40
Jabber presence, 83 Parameters, 11
Parameters Get, 12
K Parameters Get_Name, 12
Key, 18 Payload, 60
KEYS_M, 88 PEER_NAME_V, 88
PHASE_V, 88
L POP, 78, 91
LDAP, 81 Port, 9
LDAP Binding, 153 Post Office Protocol, 78
LDAP Directory, 81 program_name.ini, 16
LibreSSL, 3 Push, 27
LibreSSL build, 4
Lightweight Directory Access Protocol, 81 R
LINE_STACK_SIZE, 88 RECEIVE_TIMEOUT, 88
Line_Stack_Size, 18 Receive_Timeout, 19
linker, 38 References, 91
LOG, 88 Resources, 85
Log.Flush, 28 resources, 10
Log.Start, 28 Retrieving e-mail, 78
Log.Start_Error, 28 REUSE_ADDRESS, 88
Log.Stop, 28 Reuse_Address, 19
Log.Stop_Error, 28 Revocation, 33
Log_Extended_Fields, 18 RFC 0821, 91
LOG_FILE, 88 RFC 1867, 91
LOG_FILE_DIRECTORY, 88 RFC 1939, 91
Log_File_Directory, 18 RFC 1945, 91
LOG_FILENAME_PREFIX, 88 RFC 2049, 92
Log_Filename_Prefix, 17, 18 RFC 2109, 92
LOG_MODE, 88 RFC 2195, 92
Log_Split_Mode, 17, 18 RFC 2554, 92
LOGO, 88 RFC 2616, 92
Logo_Image, 18 RFC 2617, 93
logs, 28
S
M Secure server, 30
MAX_CONCURRENT_DOWNLOAD, 88 SECURITY, 88
346 Index
AWS Documentation, Release 18.0
Index 347
AWS Documentation, Release 18.0
348 Index