annotate gcc/ada/libgnat/g-cgi.adb @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children 1830386684a0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 ------------------------------------------------------------------------------
kono
parents:
diff changeset
2 -- --
kono
parents:
diff changeset
3 -- GNAT COMPILER COMPONENTS --
kono
parents:
diff changeset
4 -- --
kono
parents:
diff changeset
5 -- G N A T . C G I --
kono
parents:
diff changeset
6 -- --
kono
parents:
diff changeset
7 -- B o d y --
kono
parents:
diff changeset
8 -- --
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
9 -- Copyright (C) 2001-2018, AdaCore --
111
kono
parents:
diff changeset
10 -- --
kono
parents:
diff changeset
11 -- GNAT is free software; you can redistribute it and/or modify it under --
kono
parents:
diff changeset
12 -- terms of the GNU General Public License as published by the Free Soft- --
kono
parents:
diff changeset
13 -- ware Foundation; either version 3, or (at your option) any later ver- --
kono
parents:
diff changeset
14 -- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
kono
parents:
diff changeset
15 -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
kono
parents:
diff changeset
16 -- or FITNESS FOR A PARTICULAR PURPOSE. --
kono
parents:
diff changeset
17 -- --
kono
parents:
diff changeset
18 -- As a special exception under Section 7 of GPL version 3, you are granted --
kono
parents:
diff changeset
19 -- additional permissions described in the GCC Runtime Library Exception, --
kono
parents:
diff changeset
20 -- version 3.1, as published by the Free Software Foundation. --
kono
parents:
diff changeset
21 -- --
kono
parents:
diff changeset
22 -- You should have received a copy of the GNU General Public License and --
kono
parents:
diff changeset
23 -- a copy of the GCC Runtime Library Exception along with this program; --
kono
parents:
diff changeset
24 -- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see --
kono
parents:
diff changeset
25 -- <http://www.gnu.org/licenses/>. --
kono
parents:
diff changeset
26 -- --
kono
parents:
diff changeset
27 -- GNAT was originally developed by the GNAT team at New York University. --
kono
parents:
diff changeset
28 -- Extensive contributions were provided by Ada Core Technologies Inc. --
kono
parents:
diff changeset
29 -- --
kono
parents:
diff changeset
30 ------------------------------------------------------------------------------
kono
parents:
diff changeset
31
kono
parents:
diff changeset
32 with Ada.Text_IO;
kono
parents:
diff changeset
33 with Ada.Strings.Fixed;
kono
parents:
diff changeset
34 with Ada.Characters.Handling;
kono
parents:
diff changeset
35 with Ada.Strings.Maps;
kono
parents:
diff changeset
36
kono
parents:
diff changeset
37 with GNAT.OS_Lib;
kono
parents:
diff changeset
38 with GNAT.Table;
kono
parents:
diff changeset
39
kono
parents:
diff changeset
40 package body GNAT.CGI is
kono
parents:
diff changeset
41
kono
parents:
diff changeset
42 use Ada;
kono
parents:
diff changeset
43
kono
parents:
diff changeset
44 Valid_Environment : Boolean := True;
kono
parents:
diff changeset
45 -- This boolean will be set to False if the initialization was not
kono
parents:
diff changeset
46 -- completed correctly. It must be set to true there because the
kono
parents:
diff changeset
47 -- Initialize routine (called during elaboration) will use some of the
kono
parents:
diff changeset
48 -- services exported by this unit.
kono
parents:
diff changeset
49
kono
parents:
diff changeset
50 Current_Method : Method_Type;
kono
parents:
diff changeset
51 -- This is the current method used to pass CGI parameters
kono
parents:
diff changeset
52
kono
parents:
diff changeset
53 Header_Sent : Boolean := False;
kono
parents:
diff changeset
54 -- Will be set to True when the header will be sent
kono
parents:
diff changeset
55
kono
parents:
diff changeset
56 -- Key/Value table declaration
kono
parents:
diff changeset
57
kono
parents:
diff changeset
58 type String_Access is access String;
kono
parents:
diff changeset
59
kono
parents:
diff changeset
60 type Key_Value is record
kono
parents:
diff changeset
61 Key : String_Access;
kono
parents:
diff changeset
62 Value : String_Access;
kono
parents:
diff changeset
63 end record;
kono
parents:
diff changeset
64
kono
parents:
diff changeset
65 package Key_Value_Table is new Table (Key_Value, Positive, 1, 1, 50);
kono
parents:
diff changeset
66
kono
parents:
diff changeset
67 -----------------------
kono
parents:
diff changeset
68 -- Local subprograms --
kono
parents:
diff changeset
69 -----------------------
kono
parents:
diff changeset
70
kono
parents:
diff changeset
71 procedure Check_Environment;
kono
parents:
diff changeset
72 pragma Inline (Check_Environment);
kono
parents:
diff changeset
73 -- This procedure will raise Data_Error if Valid_Environment is False
kono
parents:
diff changeset
74
kono
parents:
diff changeset
75 procedure Initialize;
kono
parents:
diff changeset
76 -- Initialize CGI package by reading the runtime environment. This
kono
parents:
diff changeset
77 -- procedure is called during elaboration. All exceptions raised during
kono
parents:
diff changeset
78 -- this procedure are deferred.
kono
parents:
diff changeset
79
kono
parents:
diff changeset
80 --------------------
kono
parents:
diff changeset
81 -- Argument_Count --
kono
parents:
diff changeset
82 --------------------
kono
parents:
diff changeset
83
kono
parents:
diff changeset
84 function Argument_Count return Natural is
kono
parents:
diff changeset
85 begin
kono
parents:
diff changeset
86 Check_Environment;
kono
parents:
diff changeset
87 return Key_Value_Table.Last;
kono
parents:
diff changeset
88 end Argument_Count;
kono
parents:
diff changeset
89
kono
parents:
diff changeset
90 -----------------------
kono
parents:
diff changeset
91 -- Check_Environment --
kono
parents:
diff changeset
92 -----------------------
kono
parents:
diff changeset
93
kono
parents:
diff changeset
94 procedure Check_Environment is
kono
parents:
diff changeset
95 begin
kono
parents:
diff changeset
96 if not Valid_Environment then
kono
parents:
diff changeset
97 raise Data_Error;
kono
parents:
diff changeset
98 end if;
kono
parents:
diff changeset
99 end Check_Environment;
kono
parents:
diff changeset
100
kono
parents:
diff changeset
101 ------------
kono
parents:
diff changeset
102 -- Decode --
kono
parents:
diff changeset
103 ------------
kono
parents:
diff changeset
104
kono
parents:
diff changeset
105 function Decode (S : String) return String is
kono
parents:
diff changeset
106 Result : String (S'Range);
kono
parents:
diff changeset
107 K : Positive := S'First;
kono
parents:
diff changeset
108 J : Positive := Result'First;
kono
parents:
diff changeset
109
kono
parents:
diff changeset
110 begin
kono
parents:
diff changeset
111 while K <= S'Last loop
kono
parents:
diff changeset
112 if K + 2 <= S'Last
kono
parents:
diff changeset
113 and then S (K) = '%'
kono
parents:
diff changeset
114 and then Characters.Handling.Is_Hexadecimal_Digit (S (K + 1))
kono
parents:
diff changeset
115 and then Characters.Handling.Is_Hexadecimal_Digit (S (K + 2))
kono
parents:
diff changeset
116 then
kono
parents:
diff changeset
117 -- Here we have '%HH' which is an encoded character where 'HH' is
kono
parents:
diff changeset
118 -- the character number in hexadecimal.
kono
parents:
diff changeset
119
kono
parents:
diff changeset
120 Result (J) := Character'Val
kono
parents:
diff changeset
121 (Natural'Value ("16#" & S (K + 1 .. K + 2) & '#'));
kono
parents:
diff changeset
122 K := K + 3;
kono
parents:
diff changeset
123
kono
parents:
diff changeset
124 -- Plus sign is decoded as a space
kono
parents:
diff changeset
125
kono
parents:
diff changeset
126 elsif S (K) = '+' then
kono
parents:
diff changeset
127 Result (J) := ' ';
kono
parents:
diff changeset
128 K := K + 1;
kono
parents:
diff changeset
129
kono
parents:
diff changeset
130 else
kono
parents:
diff changeset
131 Result (J) := S (K);
kono
parents:
diff changeset
132 K := K + 1;
kono
parents:
diff changeset
133 end if;
kono
parents:
diff changeset
134
kono
parents:
diff changeset
135 J := J + 1;
kono
parents:
diff changeset
136 end loop;
kono
parents:
diff changeset
137
kono
parents:
diff changeset
138 return Result (Result'First .. J - 1);
kono
parents:
diff changeset
139 end Decode;
kono
parents:
diff changeset
140
kono
parents:
diff changeset
141 -------------------------
kono
parents:
diff changeset
142 -- For_Every_Parameter --
kono
parents:
diff changeset
143 -------------------------
kono
parents:
diff changeset
144
kono
parents:
diff changeset
145 procedure For_Every_Parameter is
kono
parents:
diff changeset
146 Quit : Boolean;
kono
parents:
diff changeset
147
kono
parents:
diff changeset
148 begin
kono
parents:
diff changeset
149 Check_Environment;
kono
parents:
diff changeset
150
kono
parents:
diff changeset
151 for K in 1 .. Key_Value_Table.Last loop
kono
parents:
diff changeset
152
kono
parents:
diff changeset
153 Quit := False;
kono
parents:
diff changeset
154
kono
parents:
diff changeset
155 Action (Key_Value_Table.Table (K).Key.all,
kono
parents:
diff changeset
156 Key_Value_Table.Table (K).Value.all,
kono
parents:
diff changeset
157 K,
kono
parents:
diff changeset
158 Quit);
kono
parents:
diff changeset
159
kono
parents:
diff changeset
160 exit when Quit;
kono
parents:
diff changeset
161
kono
parents:
diff changeset
162 end loop;
kono
parents:
diff changeset
163 end For_Every_Parameter;
kono
parents:
diff changeset
164
kono
parents:
diff changeset
165 ----------------
kono
parents:
diff changeset
166 -- Initialize --
kono
parents:
diff changeset
167 ----------------
kono
parents:
diff changeset
168
kono
parents:
diff changeset
169 procedure Initialize is
kono
parents:
diff changeset
170
kono
parents:
diff changeset
171 Request_Method : constant String :=
kono
parents:
diff changeset
172 Characters.Handling.To_Upper
kono
parents:
diff changeset
173 (Metavariable (CGI.Request_Method));
kono
parents:
diff changeset
174
kono
parents:
diff changeset
175 procedure Initialize_GET;
kono
parents:
diff changeset
176 -- Read CGI parameters for a GET method. In this case the parameters
kono
parents:
diff changeset
177 -- are passed into QUERY_STRING environment variable.
kono
parents:
diff changeset
178
kono
parents:
diff changeset
179 procedure Initialize_POST;
kono
parents:
diff changeset
180 -- Read CGI parameters for a POST method. In this case the parameters
kono
parents:
diff changeset
181 -- are passed with the standard input. The total number of characters
kono
parents:
diff changeset
182 -- for the data is passed in CONTENT_LENGTH environment variable.
kono
parents:
diff changeset
183
kono
parents:
diff changeset
184 procedure Set_Parameter_Table (Data : String);
kono
parents:
diff changeset
185 -- Parse the parameter data and set the parameter table
kono
parents:
diff changeset
186
kono
parents:
diff changeset
187 --------------------
kono
parents:
diff changeset
188 -- Initialize_GET --
kono
parents:
diff changeset
189 --------------------
kono
parents:
diff changeset
190
kono
parents:
diff changeset
191 procedure Initialize_GET is
kono
parents:
diff changeset
192 Data : constant String := Metavariable (Query_String);
kono
parents:
diff changeset
193 begin
kono
parents:
diff changeset
194 Current_Method := Get;
kono
parents:
diff changeset
195
kono
parents:
diff changeset
196 if Data /= "" then
kono
parents:
diff changeset
197 Set_Parameter_Table (Data);
kono
parents:
diff changeset
198 end if;
kono
parents:
diff changeset
199 end Initialize_GET;
kono
parents:
diff changeset
200
kono
parents:
diff changeset
201 ---------------------
kono
parents:
diff changeset
202 -- Initialize_POST --
kono
parents:
diff changeset
203 ---------------------
kono
parents:
diff changeset
204
kono
parents:
diff changeset
205 procedure Initialize_POST is
kono
parents:
diff changeset
206 Content_Length : constant Natural :=
kono
parents:
diff changeset
207 Natural'Value (Metavariable (CGI.Content_Length));
kono
parents:
diff changeset
208 Data : String (1 .. Content_Length);
kono
parents:
diff changeset
209
kono
parents:
diff changeset
210 begin
kono
parents:
diff changeset
211 Current_Method := Post;
kono
parents:
diff changeset
212
kono
parents:
diff changeset
213 if Content_Length /= 0 then
kono
parents:
diff changeset
214 Text_IO.Get (Data);
kono
parents:
diff changeset
215 Set_Parameter_Table (Data);
kono
parents:
diff changeset
216 end if;
kono
parents:
diff changeset
217 end Initialize_POST;
kono
parents:
diff changeset
218
kono
parents:
diff changeset
219 -------------------------
kono
parents:
diff changeset
220 -- Set_Parameter_Table --
kono
parents:
diff changeset
221 -------------------------
kono
parents:
diff changeset
222
kono
parents:
diff changeset
223 procedure Set_Parameter_Table (Data : String) is
kono
parents:
diff changeset
224
kono
parents:
diff changeset
225 procedure Add_Parameter (K : Positive; P : String);
kono
parents:
diff changeset
226 -- Add a single parameter into the table at index K. The parameter
kono
parents:
diff changeset
227 -- format is "key=value".
kono
parents:
diff changeset
228
kono
parents:
diff changeset
229 Count : constant Positive :=
kono
parents:
diff changeset
230 1 + Strings.Fixed.Count (Data, Strings.Maps.To_Set ("&"));
kono
parents:
diff changeset
231 -- Count is the number of parameters in the string. Parameters are
kono
parents:
diff changeset
232 -- separated by ampersand character.
kono
parents:
diff changeset
233
kono
parents:
diff changeset
234 Index : Positive := Data'First;
kono
parents:
diff changeset
235 Amp : Natural;
kono
parents:
diff changeset
236
kono
parents:
diff changeset
237 -------------------
kono
parents:
diff changeset
238 -- Add_Parameter --
kono
parents:
diff changeset
239 -------------------
kono
parents:
diff changeset
240
kono
parents:
diff changeset
241 procedure Add_Parameter (K : Positive; P : String) is
kono
parents:
diff changeset
242 Equal : constant Natural := Strings.Fixed.Index (P, "=");
kono
parents:
diff changeset
243
kono
parents:
diff changeset
244 begin
kono
parents:
diff changeset
245 if Equal = 0 then
kono
parents:
diff changeset
246 raise Data_Error;
kono
parents:
diff changeset
247
kono
parents:
diff changeset
248 else
kono
parents:
diff changeset
249 Key_Value_Table.Table (K) :=
kono
parents:
diff changeset
250 Key_Value'(new String'(Decode (P (P'First .. Equal - 1))),
kono
parents:
diff changeset
251 new String'(Decode (P (Equal + 1 .. P'Last))));
kono
parents:
diff changeset
252 end if;
kono
parents:
diff changeset
253 end Add_Parameter;
kono
parents:
diff changeset
254
kono
parents:
diff changeset
255 -- Start of processing for Set_Parameter_Table
kono
parents:
diff changeset
256
kono
parents:
diff changeset
257 begin
kono
parents:
diff changeset
258 Key_Value_Table.Set_Last (Count);
kono
parents:
diff changeset
259
kono
parents:
diff changeset
260 for K in 1 .. Count - 1 loop
kono
parents:
diff changeset
261 Amp := Strings.Fixed.Index (Data (Index .. Data'Last), "&");
kono
parents:
diff changeset
262
kono
parents:
diff changeset
263 Add_Parameter (K, Data (Index .. Amp - 1));
kono
parents:
diff changeset
264
kono
parents:
diff changeset
265 Index := Amp + 1;
kono
parents:
diff changeset
266 end loop;
kono
parents:
diff changeset
267
kono
parents:
diff changeset
268 -- add last parameter
kono
parents:
diff changeset
269
kono
parents:
diff changeset
270 Add_Parameter (Count, Data (Index .. Data'Last));
kono
parents:
diff changeset
271 end Set_Parameter_Table;
kono
parents:
diff changeset
272
kono
parents:
diff changeset
273 -- Start of processing for Initialize
kono
parents:
diff changeset
274
kono
parents:
diff changeset
275 begin
kono
parents:
diff changeset
276 if Request_Method = "GET" then
kono
parents:
diff changeset
277 Initialize_GET;
kono
parents:
diff changeset
278
kono
parents:
diff changeset
279 elsif Request_Method = "POST" then
kono
parents:
diff changeset
280 Initialize_POST;
kono
parents:
diff changeset
281
kono
parents:
diff changeset
282 else
kono
parents:
diff changeset
283 Valid_Environment := False;
kono
parents:
diff changeset
284 end if;
kono
parents:
diff changeset
285
kono
parents:
diff changeset
286 exception
kono
parents:
diff changeset
287 when others =>
kono
parents:
diff changeset
288
kono
parents:
diff changeset
289 -- If we have an exception during initialization of this unit we
kono
parents:
diff changeset
290 -- just declare it invalid.
kono
parents:
diff changeset
291
kono
parents:
diff changeset
292 Valid_Environment := False;
kono
parents:
diff changeset
293 end Initialize;
kono
parents:
diff changeset
294
kono
parents:
diff changeset
295 ---------
kono
parents:
diff changeset
296 -- Key --
kono
parents:
diff changeset
297 ---------
kono
parents:
diff changeset
298
kono
parents:
diff changeset
299 function Key (Position : Positive) return String is
kono
parents:
diff changeset
300 begin
kono
parents:
diff changeset
301 Check_Environment;
kono
parents:
diff changeset
302
kono
parents:
diff changeset
303 if Position <= Key_Value_Table.Last then
kono
parents:
diff changeset
304 return Key_Value_Table.Table (Position).Key.all;
kono
parents:
diff changeset
305 else
kono
parents:
diff changeset
306 raise Parameter_Not_Found;
kono
parents:
diff changeset
307 end if;
kono
parents:
diff changeset
308 end Key;
kono
parents:
diff changeset
309
kono
parents:
diff changeset
310 ----------------
kono
parents:
diff changeset
311 -- Key_Exists --
kono
parents:
diff changeset
312 ----------------
kono
parents:
diff changeset
313
kono
parents:
diff changeset
314 function Key_Exists (Key : String) return Boolean is
kono
parents:
diff changeset
315 begin
kono
parents:
diff changeset
316 Check_Environment;
kono
parents:
diff changeset
317
kono
parents:
diff changeset
318 for K in 1 .. Key_Value_Table.Last loop
kono
parents:
diff changeset
319 if Key_Value_Table.Table (K).Key.all = Key then
kono
parents:
diff changeset
320 return True;
kono
parents:
diff changeset
321 end if;
kono
parents:
diff changeset
322 end loop;
kono
parents:
diff changeset
323
kono
parents:
diff changeset
324 return False;
kono
parents:
diff changeset
325 end Key_Exists;
kono
parents:
diff changeset
326
kono
parents:
diff changeset
327 ------------------
kono
parents:
diff changeset
328 -- Metavariable --
kono
parents:
diff changeset
329 ------------------
kono
parents:
diff changeset
330
kono
parents:
diff changeset
331 function Metavariable
kono
parents:
diff changeset
332 (Name : Metavariable_Name;
kono
parents:
diff changeset
333 Required : Boolean := False) return String
kono
parents:
diff changeset
334 is
kono
parents:
diff changeset
335 function Get_Environment (Variable_Name : String) return String;
kono
parents:
diff changeset
336 -- Returns the environment variable content
kono
parents:
diff changeset
337
kono
parents:
diff changeset
338 ---------------------
kono
parents:
diff changeset
339 -- Get_Environment --
kono
parents:
diff changeset
340 ---------------------
kono
parents:
diff changeset
341
kono
parents:
diff changeset
342 function Get_Environment (Variable_Name : String) return String is
kono
parents:
diff changeset
343 Value : OS_Lib.String_Access := OS_Lib.Getenv (Variable_Name);
kono
parents:
diff changeset
344 Result : constant String := Value.all;
kono
parents:
diff changeset
345 begin
kono
parents:
diff changeset
346 OS_Lib.Free (Value);
kono
parents:
diff changeset
347 return Result;
kono
parents:
diff changeset
348 end Get_Environment;
kono
parents:
diff changeset
349
kono
parents:
diff changeset
350 Result : constant String :=
kono
parents:
diff changeset
351 Get_Environment (Metavariable_Name'Image (Name));
kono
parents:
diff changeset
352
kono
parents:
diff changeset
353 -- Start of processing for Metavariable
kono
parents:
diff changeset
354
kono
parents:
diff changeset
355 begin
kono
parents:
diff changeset
356 Check_Environment;
kono
parents:
diff changeset
357
kono
parents:
diff changeset
358 if Result = "" and then Required then
kono
parents:
diff changeset
359 raise Parameter_Not_Found;
kono
parents:
diff changeset
360 else
kono
parents:
diff changeset
361 return Result;
kono
parents:
diff changeset
362 end if;
kono
parents:
diff changeset
363 end Metavariable;
kono
parents:
diff changeset
364
kono
parents:
diff changeset
365 -------------------------
kono
parents:
diff changeset
366 -- Metavariable_Exists --
kono
parents:
diff changeset
367 -------------------------
kono
parents:
diff changeset
368
kono
parents:
diff changeset
369 function Metavariable_Exists (Name : Metavariable_Name) return Boolean is
kono
parents:
diff changeset
370 begin
kono
parents:
diff changeset
371 Check_Environment;
kono
parents:
diff changeset
372
kono
parents:
diff changeset
373 if Metavariable (Name) = "" then
kono
parents:
diff changeset
374 return False;
kono
parents:
diff changeset
375 else
kono
parents:
diff changeset
376 return True;
kono
parents:
diff changeset
377 end if;
kono
parents:
diff changeset
378 end Metavariable_Exists;
kono
parents:
diff changeset
379
kono
parents:
diff changeset
380 ------------
kono
parents:
diff changeset
381 -- Method --
kono
parents:
diff changeset
382 ------------
kono
parents:
diff changeset
383
kono
parents:
diff changeset
384 function Method return Method_Type is
kono
parents:
diff changeset
385 begin
kono
parents:
diff changeset
386 Check_Environment;
kono
parents:
diff changeset
387 return Current_Method;
kono
parents:
diff changeset
388 end Method;
kono
parents:
diff changeset
389
kono
parents:
diff changeset
390 --------
kono
parents:
diff changeset
391 -- Ok --
kono
parents:
diff changeset
392 --------
kono
parents:
diff changeset
393
kono
parents:
diff changeset
394 function Ok return Boolean is
kono
parents:
diff changeset
395 begin
kono
parents:
diff changeset
396 return Valid_Environment;
kono
parents:
diff changeset
397 end Ok;
kono
parents:
diff changeset
398
kono
parents:
diff changeset
399 ----------------
kono
parents:
diff changeset
400 -- Put_Header --
kono
parents:
diff changeset
401 ----------------
kono
parents:
diff changeset
402
kono
parents:
diff changeset
403 procedure Put_Header
kono
parents:
diff changeset
404 (Header : String := Default_Header;
kono
parents:
diff changeset
405 Force : Boolean := False)
kono
parents:
diff changeset
406 is
kono
parents:
diff changeset
407 begin
kono
parents:
diff changeset
408 if Header_Sent = False or else Force then
kono
parents:
diff changeset
409 Check_Environment;
kono
parents:
diff changeset
410 Text_IO.Put_Line (Header);
kono
parents:
diff changeset
411 Text_IO.New_Line;
kono
parents:
diff changeset
412 Header_Sent := True;
kono
parents:
diff changeset
413 end if;
kono
parents:
diff changeset
414 end Put_Header;
kono
parents:
diff changeset
415
kono
parents:
diff changeset
416 ---------
kono
parents:
diff changeset
417 -- URL --
kono
parents:
diff changeset
418 ---------
kono
parents:
diff changeset
419
kono
parents:
diff changeset
420 function URL return String is
kono
parents:
diff changeset
421
kono
parents:
diff changeset
422 function Exists_And_Not_80 (Server_Port : String) return String;
kono
parents:
diff changeset
423 -- Returns ':' & Server_Port if Server_Port is not "80" and the empty
kono
parents:
diff changeset
424 -- string otherwise (80 is the default sever port).
kono
parents:
diff changeset
425
kono
parents:
diff changeset
426 -----------------------
kono
parents:
diff changeset
427 -- Exists_And_Not_80 --
kono
parents:
diff changeset
428 -----------------------
kono
parents:
diff changeset
429
kono
parents:
diff changeset
430 function Exists_And_Not_80 (Server_Port : String) return String is
kono
parents:
diff changeset
431 begin
kono
parents:
diff changeset
432 if Server_Port = "80" then
kono
parents:
diff changeset
433 return "";
kono
parents:
diff changeset
434 else
kono
parents:
diff changeset
435 return ':' & Server_Port;
kono
parents:
diff changeset
436 end if;
kono
parents:
diff changeset
437 end Exists_And_Not_80;
kono
parents:
diff changeset
438
kono
parents:
diff changeset
439 -- Start of processing for URL
kono
parents:
diff changeset
440
kono
parents:
diff changeset
441 begin
kono
parents:
diff changeset
442 Check_Environment;
kono
parents:
diff changeset
443
kono
parents:
diff changeset
444 return "http://"
kono
parents:
diff changeset
445 & Metavariable (Server_Name)
kono
parents:
diff changeset
446 & Exists_And_Not_80 (Metavariable (Server_Port))
kono
parents:
diff changeset
447 & Metavariable (Script_Name);
kono
parents:
diff changeset
448 end URL;
kono
parents:
diff changeset
449
kono
parents:
diff changeset
450 -----------
kono
parents:
diff changeset
451 -- Value --
kono
parents:
diff changeset
452 -----------
kono
parents:
diff changeset
453
kono
parents:
diff changeset
454 function Value
kono
parents:
diff changeset
455 (Key : String;
kono
parents:
diff changeset
456 Required : Boolean := False)
kono
parents:
diff changeset
457 return String
kono
parents:
diff changeset
458 is
kono
parents:
diff changeset
459 begin
kono
parents:
diff changeset
460 Check_Environment;
kono
parents:
diff changeset
461
kono
parents:
diff changeset
462 for K in 1 .. Key_Value_Table.Last loop
kono
parents:
diff changeset
463 if Key_Value_Table.Table (K).Key.all = Key then
kono
parents:
diff changeset
464 return Key_Value_Table.Table (K).Value.all;
kono
parents:
diff changeset
465 end if;
kono
parents:
diff changeset
466 end loop;
kono
parents:
diff changeset
467
kono
parents:
diff changeset
468 if Required then
kono
parents:
diff changeset
469 raise Parameter_Not_Found;
kono
parents:
diff changeset
470 else
kono
parents:
diff changeset
471 return "";
kono
parents:
diff changeset
472 end if;
kono
parents:
diff changeset
473 end Value;
kono
parents:
diff changeset
474
kono
parents:
diff changeset
475 -----------
kono
parents:
diff changeset
476 -- Value --
kono
parents:
diff changeset
477 -----------
kono
parents:
diff changeset
478
kono
parents:
diff changeset
479 function Value (Position : Positive) return String is
kono
parents:
diff changeset
480 begin
kono
parents:
diff changeset
481 Check_Environment;
kono
parents:
diff changeset
482
kono
parents:
diff changeset
483 if Position <= Key_Value_Table.Last then
kono
parents:
diff changeset
484 return Key_Value_Table.Table (Position).Value.all;
kono
parents:
diff changeset
485 else
kono
parents:
diff changeset
486 raise Parameter_Not_Found;
kono
parents:
diff changeset
487 end if;
kono
parents:
diff changeset
488 end Value;
kono
parents:
diff changeset
489
kono
parents:
diff changeset
490 begin
kono
parents:
diff changeset
491
kono
parents:
diff changeset
492 Initialize;
kono
parents:
diff changeset
493
kono
parents:
diff changeset
494 end GNAT.CGI;