|
|
| version 1.27, 2001/04/17 19:00:27 | version 1.30, 2001/04/19 16:40:05 |
|---|---|
| Line 102 static void append_env_pair(const Hash:: | Line 102 static void append_env_pair(const Hash:: |
| Hash& hash=*static_cast<Hash *>(info); | Hash& hash=*static_cast<Hash *>(info); |
| hash.put(key, &static_cast<Value *>(value)->as_string()); | hash.put(key, &static_cast<Value *>(value)->as_string()); |
| } | } |
| /// ^exec[file-name] | |
| /// ^exec[file-name;env hash] | static void pass_cgi_header_attribute(Array::Item *value, void *info) { |
| /// ^exec[file-name;env hash;cmd;line;arg;s] | String& string=*static_cast<String *>(value); |
| /// @test header to $fields. waits for header '\' tricks | Hash& hash=*static_cast<Hash *>(info); |
| int colon_pos=string.pos(":", 1); | |
| if(colon_pos>0) | |
| hash.put(string.mid(0, colon_pos), | |
| new(string.pool()) VString(string.mid(colon_pos+1, string.size()))); | |
| } | |
| /** | |
| ^exec[file-name] | |
| ^exec[file-name;env hash] | |
| ^exec[file-name;env hash;cmd;line;arg;s] | |
| @todo fix `` in perl - they produced flipping consoles and no output to perl | |
| */ | |
| static void _cgi(Request& r, const String& method_name, MethodParams *params) { | static void _cgi(Request& r, const String& method_name, MethodParams *params) { |
| Pool& pool=r.pool(); | Pool& pool=r.pool(); |
| Line 177 static void _cgi(Request& r, const Strin | Line 188 static void _cgi(Request& r, const Strin |
| const String in(pool, r.post_data, r.post_size); | const String in(pool, r.post_data, r.post_size); |
| String out(pool); | String out(pool); |
| String& err=*new(pool) String(pool); | String& err=*new(pool) String(pool); |
| int exit_code=pa_exec(script_name, &env, argv, | // out.APPEND_CONST("content-type:text/plain\nheader:test-header\n\ntest-body"); |
| in, out, err); | int exit_code=pa_exec(script_name, &env, argv, in, out, err); |
| VFile& self=*static_cast<VFile *>(r.self); | VFile& self=*static_cast<VFile *>(r.self); |
| // construct with 'out' body and header | // construct with 'out' body and header |
| int delim_size; | int delim_size; |
| int pos=out.pos("\n\n", delim_size=2); | const char *eol_marker="\r\n"; size_t eol_marker_size=2; |
| if(pos<0) | int pos=out.pos("\r\n\r\n", delim_size=4); |
| pos=out.pos("\r\n\r\n", delim_size=4); | if(pos<0) { |
| eol_marker="\n"; eol_marker_size=1; | |
| pos=out.pos("\n\n", delim_size=2); | |
| } | |
| if(pos<0) { | if(pos<0) { |
| delim_size=0; // calm down, compiler | delim_size=0; // calm down, compiler |
| PTHROW(0, 0, | PTHROW(0, 0, |
| Line 200 static void _cgi(Request& r, const Strin | Line 214 static void _cgi(Request& r, const Strin |
| // body | // body |
| self.set(false/*not tainted*/, body.cstr(String::UL_AS_IS), body.size()); | self.set(false/*not tainted*/, body.cstr(String::UL_AS_IS), body.size()); |
| // todo header to $fields. waits for header '\' tricks | // header to $fields |
| { | |
| Array rows(pool); | |
| header.split(rows, 0, eol_marker, eol_marker_size, String::UL_CLEAN); | |
| rows.for_each(pass_cgi_header_attribute, &self.fields()); | |
| } | |
| // $exit-code | // $exit-code |
| self.fields().put( | self.fields().put( |