1#ifndef __CGI_CHH__
2#define __CGI_CHH__
3#include files.chh
4\
5%define(translateCRLF,str,
6    %sgsub([%schr(13)][%schr(10)],%str,%'\n')
7)\
8\
9%define(cgiGetParameters,
10%locals(result,lst,contype,conparm,line,regs,value,name,qstring,
11    %<result=%hash()>\
12    %if(%hcontains(%env,CONTENT_TYPE),
13        %<lst=%ssplit(%'[ \n\t]*;[ \n\t]*',%env{CONTENT_TYPE})>\
14        %<contype=%lst[0]>\
15        %ldelete(%&lst,0)\
16        %<conparm=%hash()>\
17        %foreach(str,%lst,
18            %<lst=%ssplit(=,%str)>\
19            %if(%[%llength(%lst)==2],
20                %<conparm{%lst[0]}=%lst[1]>
21            )
22        )
23    ,
24        %<contype=application/x-www-form-urlencoded>
25    )\
26    %case(%contype,
27        %list(application/x-www-form-urlencoded),
28            %if(%[%slength(%env{QUERY_STRING}) > 0],
29                %<qstring=%env{QUERY_STRING}>
30            ,
31                %<qstring=%frest(%stdin)>
32            )\
33            %foreach(str,%ssplit(&,%qstring),
34                %<lst=%ssplit(=,%str)>\
35                %if(%[%llength(%lst)==2],
36                    %<result{%lst[0]}=%w3urldecode(%lst[1])>
37                )
38            ),
39        %list(multipart/form-data),
40            %<regs=%list()>\
41            %<line=%translateCRLF(%fgets(%stdin))>\
42            %while(%and(%not(%feof(%stdin)),%equal(%line,--%conparm{boundary}%'\n')),
43                 %<line=%translateCRLF(%fgets(%stdin))>\
44                 %if(%[%smatch(%'^Content-Disposition: form-data; name=\"([^\"]+)\"(; filename=\"([^\"]+)\")?',%line,%&regs) != -1],
45                     %<name=%regs[1]>\
46                     %if(%slength(%regs[2]),
47                         %<value=%hash(filename,%regs[3])>\
48                         %<line=%translateCRLF(%fgets(%stdin))>\
49                         %if(%not(%smatch(%'^Content-Type: (.+)',%line,%&regs)),
50                             %<value{type}=%regs[1]>\
51                             %<line=%fgets(%stdin)>
52                         )\
53                         %<line=%translateCRLF(%fgets(%stdin))>\
54                         %<value{content}=%while(%smatch(^--%conparm{boundary},%line),%line%<line=%translateCRLF(%fgets(%stdin))>)>\
55                         %<value{content}=%ssub(%value{content},0,%[%slength(%value{content})-1])>
56                     ,
57                         %<line=%fgets(%stdin)>\
58                         %<line=%translateCRLF(%fgets(%stdin))>\
59                         %<value=%while(%smatch(^--%conparm{boundary},%line),%line%<line=%translateCRLF(%fgets(%stdin))>)>\
60                         %<value=%ssub(%value,0,%[%slength(%value)-1])>
61                     )\
62                     %<result{%name}=%&value>
63                 )
64            )
65    )\
66    %&result
67))\
68#endif
69