mirror of
https://github.com/AdaCore/aws.git
synced 2026-02-12 12:29:46 -08:00
183 lines
5.7 KiB
Ada
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;
|