File : aws-status.adb
------------------------------------------------------------------------------
-- Ada Web Server --
-- --
-- Copyright (C) 2000-2003 --
-- ACT-Europe --
-- --
-- Authors: Dmitriy Anisimkov - Pascal Obry --
-- --
-- This library is free software; you can redistribute it and/or modify --
-- it under the terms of the GNU General Public License as published by --
-- the Free Software Foundation; either version 2 of the License, 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. See the GNU --
-- General Public License for more details. --
-- --
-- You should have received a copy of the GNU General Public License --
-- along with this library; if not, write to the Free Software Foundation, --
-- Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. --
-- --
-- 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. --
------------------------------------------------------------------------------
-- $Id: aws-status.adb,v 1.1 2003/10/05 20:00:02 Jano Exp $
with Ada.Strings;
with AWS.Digest;
with AWS.Headers.Values;
with AWS.Messages;
package body AWS.Status is
use Ada.Strings;
--------------------------
-- Authorization_CNonce --
--------------------------
function Authorization_CNonce (D : in Data) return String is
begin
return To_String (D.Auth_CNonce);
end Authorization_CNonce;
------------------------
-- Authorization_Mode --
------------------------
function Authorization_Mode (D : in Data) return Authorization_Type is
begin
return D.Auth_Mode;
end Authorization_Mode;
------------------------
-- Authorization_Name --
------------------------
function Authorization_Name (D : in Data) return String is
begin
return To_String (D.Auth_Name);
end Authorization_Name;
----------------------
-- Authorization_NC --
----------------------
function Authorization_NC (D : in Data) return String is
begin
return To_String (D.Auth_NC);
end Authorization_NC;
-------------------------
-- Authorization_Nonce --
-------------------------
function Authorization_Nonce (D : in Data) return String is
begin
return To_String (D.Auth_Nonce);
end Authorization_Nonce;
----------------------------
-- Authorization_Password --
----------------------------
function Authorization_Password (D : in Data) return String is
begin
return To_String (D.Auth_Password);
end Authorization_Password;
-----------------------
-- Authorization_QOP --
-----------------------
function Authorization_QOP (D : in Data) return String is
begin
return To_String (D.Auth_QOP);
end Authorization_QOP;
-------------------------
-- Authorization_Realm --
-------------------------
function Authorization_Realm (D : in Data) return String is
begin
return To_String (D.Auth_Realm);
end Authorization_Realm;
----------------------------
-- Authorization_Response --
----------------------------
function Authorization_Response (D : in Data) return String is
begin
return To_String (D.Auth_Response);
end Authorization_Response;
-----------------
-- Binary_Data --
-----------------
function Binary_Data (D : in Data) return Stream_Element_Array is
begin
return D.Binary_Data.all;
end Binary_Data;
------------------
-- Check_Digest --
------------------
function Check_Digest (D : in Data; Password : in String) return Boolean is
function Get_Nonce return String;
-- returns Nonce for the Digest authentication without "qop"
-- parameter, or [nonce]:[nc]:[cnonce]:[qop] for the Digest
-- authentication with qop parameter.
-- It is just for convinience to implement RFC 2617 3.2.2.1.
---------------
-- Get_Nonce --
---------------
function Get_Nonce return String is
Nonce : constant String := Authorization_Nonce (D);
QOP : constant String := Authorization_QOP (D);
begin
if QOP = "" then
return Nonce;
else
return Nonce
& ':' & Authorization_NC (D)
& ':' & Authorization_CNonce (D)
& ':' & QOP;
end if;
end Get_Nonce;
begin
return
Authorization_Response (D)
=
AWS.Digest.Create_Digest
(Username => Authorization_Name (D),
Realm => Authorization_Realm (D),
Password => Password,
Nonce => Get_Nonce,
Method => Request_Method'Image (D.Method),
URI => URI (D));
end Check_Digest;
----------------
-- Connection --
----------------
function Connection (D : in Data) return String is
begin
return Headers.Get (D.Header, Messages.Connection_Token);
end Connection;
--------------------
-- Content_Length --
--------------------
function Content_Length (D : in Data) return Natural is
begin
return D.Content_Length;
end Content_Length;
------------------
-- Content_Type --
------------------
function Content_Type (D : in Data) return String is
begin
return Headers.Get (D.Header, Messages.Content_Type_Token);
end Content_Type;
-----------------
-- Has_Session --
-----------------
function Has_Session (D : in Data) return Boolean is
use type AWS.Session.ID;
begin
return D.Session_ID /= AWS.Session.No_Session;
end Has_Session;
------------
-- Header --
------------
function Header (D : in Data) return Headers.List is
begin
return D.Header;
end Header;
----------
-- Host --
----------
function Host (D : in Data) return String is
begin
return Headers.Get (D.Header, Messages.Host_Token);
end Host;
------------------
-- HTTP_Version --
------------------
function HTTP_Version (D : in Data) return String is
begin
return To_String (D.HTTP_Version);
end HTTP_Version;
-----------------------
-- If_Modified_Since --
-----------------------
function If_Modified_Since (D : in Data) return String is
begin
return Headers.Get (D.Header, Messages.If_Modified_Since_Token);
end If_Modified_Since;
-------------
-- Is_SOAP --
-------------
function Is_SOAP (D : in Data) return Boolean is
begin
return D.SOAP_Action;
end Is_SOAP;
----------------
-- Keep_Alive --
----------------
function Keep_Alive (D : in Data) return Boolean is
begin
return D.Keep_Alive;
end Keep_Alive;
------------
-- Method --
------------
function Method (D : in Data) return Request_Method is
begin
return D.Method;
end Method;
------------------------
-- Multipart_Boundary --
------------------------
function Multipart_Boundary (D : in Data) return String is
use Headers;
begin
-- Get the Boundary value from the Contant_Type header value.
-- We do not need to have the boundary in the Status.Data preparsed,
-- becouse the AWS is not using function Multipart_Boundary internally.
return Values.Search
(Get (D.Header, Messages.Content_Type_Token),
"Boundary", Case_Sensitive => False);
end Multipart_Boundary;
----------------
-- Parameters --
----------------
function Parameters (D : in Data) return AWS.Parameters.List is
begin
return D.Parameters;
end Parameters;
-------------
-- Payload --
-------------
function Payload (D : in Data) return String is
begin
return To_String (D.Payload);
end Payload;
--------------
-- Peername --
--------------
function Peername (D : in Data) return String is
begin
return To_String (D.Peername);
end Peername;
-------------
-- Referer --
-------------
function Referer (D : in Data) return String is
begin
return Headers.Get (D.Header, Messages.Referer_Token);
end Referer;
-------------
-- Session --
-------------
function Session (D : in Data) return AWS.Session.ID is
begin
return D.Session_ID;
end Session;
---------------------
-- Session_Created --
---------------------
function Session_Created (D : in Data) return Boolean is
begin
return D.Session_Created;
end Session_Created;
----------------
-- SOAPAction --
----------------
function SOAPAction (D : in Data) return String is
Result : constant String :=
Headers.Get (D.Header, Messages.SOAPAction_Token);
begin
if Result'First < Result'Last
and then Result (Result'First) = '"'
and then Result (Result'Last) = '"'
then
return Result (Result'First + 1 .. Result'Last - 1);
else
return Result;
end if;
end SOAPAction;
------------
-- Socket --
------------
function Socket (D : in Data) return Net.Socket_Type'Class is
begin
return D.Socket.all;
end Socket;
---------
-- URI --
---------
function URI (D : in Data) return String is
begin
return URL.URL (D.URI);
end URI;
function URI (D : in Data) return URL.Object
is
begin
return D.URI;
end URI;
----------------
-- User_Agent --
----------------
function User_Agent (D : in Data) return String is
begin
return Headers.Get (D.Header, Messages.User_Agent_Token);
end User_Agent;
end AWS.Status;