summaryrefslogtreecommitdiff
path: root/misc/pascal/tests/src/803-redirect.pas
blob: d53acc1e149a27fa88d9eb826e6318a603a1372c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
program prices(input, output);
const
   MaxBuffer = 256;
   BASE = 'http://www.irietools.com/';
var
   buffer : string[MaxBuffer];
   NewLocation : string;

   procedure Init;
   begin
      NewLocation := BASE
   end;

   procedure GenerateHTTPHeader;
   begin
      writeln('Content-type: text/html');
      writeln;
   end;

   procedure GetCGIData;
   var
      RequestMethod : string;

      procedure GetRequest;
      begin (* GetRequest *)
         buffer := getenv('QUERY_STRING')
      end; (* GetRequest *)

      procedure PostRequest;
      var
         len, i : 0..maxint;
         err : integer;
         ContentLength : string;
         c : char;
      begin (* PostRequest *)
         buffer := '';
         ContentLength := getenv('CONTENT_LENGTH');
         if ContentLength <> '' then
            val(ContentLength, len, err)
         else
            len := 0;
         if len <= MaxBuffer then
            for i := 1 to len do
               begin
                  read(c);
                  buffer := buffer + c
               end
      end; (* PostRequest *)

   begin (* GetCGIData *)
      RequestMethod := getenv('REQUEST_METHOD');
      if RequestMethod = 'GET' then
         GetRequest
      else
         PostRequest
   end; (* GetCGIData *)

   procedure ProcessCGIData;
   var
      i, num, p : integer;
      EncodedVariable, DecodedVariable, name, value : string;

      procedure ProcessNameValuePair(var name, value : string);
      begin
         if (name = 'lstnavigation') or (name = 'navigation') or (name = 'goto') then
            begin
               if value <> '[none]' then
                  if lowercase(copy(value, 1, 5)) = 'http:' then
                     NewLocation := value
                  else
                     NewLocation := BASE + value
            end
         else
            ; (* do nothing we have an undefined form element *)            
      end;

   begin (* ProcessCGIData *)
      num := CountWords(buffer, '&');
      for i := 1 to num do
         begin
            EncodedVariable := CopyWord(buffer, i, '&');
            DecodedVariable := URLDecode(EncodedVariable);
            p := pos('=', DecodedVariable);
            if p > 0 then
               begin
                  name := lowercase(trim(copy(DecodedVariable, 1, p-1)));
                  value := lowercase(trim(copy(DecodedVariable, p+1)));
                  ProcessNameValuePair(name, value);
               end
         end
   end; (* ProcessCGIData *)

   procedure GenerateResponse;

      procedure GenerateHTMLHeader;
      begin
         writeln('<html>');
         writeln('<head>');
         writeln('<meta name="Description" content="Redirect New Location">');

         writeln('<meta http-equiv="Refresh" content="0;URL=', NewLocation, '">');

         writeln('<title>Redirect to New Location</title>');
         writeln('</head>');
      end;

      procedure GenerateHTMLFooter;
      begin
         writeln('<hr>');
         writeln('<p>');
         writeln('Redirect 1.0 Copyright &copy; 1999-2001, Stuart King<br>');
         writeln('Home page <a href="http://www.irietools.com/">www.irietools.com</a>');
         writeln('</p>');
         writeln('</body>');
         writeln('</html>');
      end;

   begin (* GenerateResponse *)
      GenerateHTMLHeader;
      writeln('<body bgcolor="#FFE8E8">');
      writeln('<p>You should be automatically taken to the next page.</p>');
      writeln('<p>However if your browser does not support redirection ');
      writeln('click <a href="', NewLocation, '">here</a></p>');
      GenerateHTMLFooter;
   end; (* GenerateResponse *)

begin
   GenerateHTTPHeader;

   Init;

   GetCGIData;

   ProcessCGIData;

   GenerateResponse;
end.