Files
aws/regtests/0192_client_headers/client_headers.adb
Pascal Obry eeb5dedd3f Ensure that the AWS version is always ending with vx.x.
This makes this test more stable across all version naming.

For RC11-007.
2018-12-14 07:25:15 +01:00

183 lines
5.7 KiB
Ada

------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2008-2018, AdaCore --
-- --
-- This 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 software 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. See the GNU --
-- General Public License for more details. --
-- --
-- You should have received a copy of the GNU General Public License --
-- distributed with this software; see file COPYING3. If not, go --
-- to http://www.gnu.org/licenses for a complete copy of the license. --
------------------------------------------------------------------------------
with Ada.Streams;
with Ada.Strings.Fixed;
with Ada.Strings.Maps;
with Ada.Strings.Unbounded;
with Ada.Text_IO;
with AWS.Client;
with AWS.Config.Set;
with AWS.Headers;
with AWS.Messages;
with AWS.MIME;
with AWS.Net.Log;
with AWS.Parameters;
with AWS.Response;
with AWS.Server.Status;
with AWS.Status;
with AWS.Translator;
with AWS.Utils;
procedure Client_Headers is
use Ada;
use Ada.Streams;
use Ada.Strings.Unbounded;
use AWS;
WS : Server.HTTP;
--------
-- CB --
--------
function CB (Request : Status.Data) return Response.Data is
H : constant Headers.List := Status.Header (Request);
procedure Output (Header : String);
-- Output corresping header value
------------
-- Output --
------------
procedure Output (Header : String) is
begin
if Headers.Exist (H, Header) then
declare
Pattern : constant String := "AWS (Ada Web Server) v";
Value : Unbounded_String :=
To_Unbounded_String
(Strings.Fixed.Translate
(Headers.Get (H, Header),
Strings.Maps.To_Mapping
("0123456789", "xxxxxxxxxx")));
Idx : constant Natural :=
Strings.Unbounded.Index (Value, Pattern);
K : Natural;
begin
loop
K := Index (Value, "xx.");
exit when K = 0;
Replace_Slice (Value, K, K + 2, "x.");
end loop;
loop
K := Index (Value, ":xx");
exit when K = 0;
Replace_Slice (Value, K, K + 2, ":x");
end loop;
if Idx /= 0 then
Replace_Slice
(Value, Idx + Pattern'Length, Length (Value), "");
Append (Value, "x.x");
end if;
Text_IO.Put_Line (Header & ": " & To_String (Value));
end;
else
Text_IO.Put_Line (Header & ": NOT FOUND");
end if;
end Output;
begin
Text_IO.Put_Line (">>>>> " & Status.URI (Request));
Output (Messages.User_Agent_Token);
Output (Messages.Accept_Language_Token);
Output (Messages.Accept_Encoding_Token);
Output (Messages.Accept_Token);
Output (Messages.Host_Token);
Output (Messages.Range_Token);
Output (Messages.If_Modified_Since_Token);
Text_IO.New_Line;
return Response.Build (MIME.Text_HTML, "ok");
end CB;
----------
-- Dump --
----------
procedure Dump
(Direction : Net.Log.Data_Direction;
Socket : Net.Socket_Type'Class;
Data : Stream_Element_Array;
Last : Stream_Element_Offset)
is
use type Net.Log.Data_Direction;
begin
if Direction = Net.Log.Sent then
Text_IO.Put_Line
("********** " & Net.Log.Data_Direction'Image (Direction));
Text_IO.Put_Line
(Translator.To_String (Data (Data'First .. Last)));
Text_IO.New_Line;
end if;
end Dump;
R : Response.Data;
H : Headers.List;
HC : Headers.List;
CFG : Config.Object;
HTTP : AWS.Client.HTTP_Connection;
begin
Config.Set.Server_Name (CFG, "Client Headers");
Config.Set.Server_Port (CFG, 0);
Config.Set.Protocol_Family (CFG, "Family_Inet");
Server.Start (WS, CB'Unrestricted_Access, CFG);
-- AWS.Net.Log.Start (Dump'Unrestricted_Access);
HC.Add (Messages.Accept_Encoding_Token, "GZIP");
AWS.Client.Create (HTTP, Server.Status.Local_URL (WS));
AWS.Client.Set_Headers (HTTP, HC);
AWS.Client.Get (HTTP, R, "/1");
AWS.Client.Head (HTTP, R, "/2");
AWS.Client.Post (HTTP, R, URI => "/3", Data => "V=1");
H.Add (Messages.Accept_Language_Token, "fr");
H.Add (Messages.If_Modified_Since_Token, "yesterday :)");
H.Add (Messages.Accept_Encoding_Token, "DEFLATE");
AWS.Client.Get (HTTP, R, "/4", Headers => H);
H.Add (Messages.User_Agent_Token, "Very_Secret");
AWS.Client.Head (HTTP, R, "/5", Headers => H);
H.Update (Messages.User_Agent_Token, "Or_Not");
H.Add (Messages.Host_Token, "me");
AWS.Client.Post (HTTP, R, URI => "/6", Data => "V=2", Headers => H);
Server.Shutdown (WS);
Text_IO.Put_Line ("shutdown");
end Client_Headers;