Diffstat (limited to 'lib/sitecing_interface_cgi.cc') (more/less context) (ignore whitespace changes)
-rw-r--r-- | lib/sitecing_interface_cgi.cc | 34 |
1 files changed, 30 insertions, 4 deletions
diff --git a/lib/sitecing_interface_cgi.cc b/lib/sitecing_interface_cgi.cc index 5c3d295..f2bd093 100644 --- a/lib/sitecing_interface_cgi.cc +++ b/lib/sitecing_interface_cgi.cc | |||
@@ -4,7 +4,7 @@ | |||
4 | namespace sitecing { | 4 | namespace sitecing { |
5 | 5 | ||
6 | sitecing_interface_cgi::sitecing_interface_cgi(sitespace *s) | 6 | sitecing_interface_cgi::sitecing_interface_cgi(sitespace *s) |
7 | : sitecing_interface(&prebuffer), ss(s), cgigw(NULL) { | 7 | : outs(&prebuffer), sitecing_interface(&outs), ss(s), cgigw(NULL), headers_flushed(false) { |
8 | } | 8 | } |
9 | 9 | ||
10 | void sitecing_interface_cgi::prepare(kingate::cgi_gateway *cg) { | 10 | void sitecing_interface_cgi::prepare(kingate::cgi_gateway *cg) { |
@@ -12,14 +12,40 @@ namespace sitecing { | |||
12 | headers.clear(); | 12 | headers.clear(); |
13 | headers["Content-Type"] = "text/html"; | 13 | headers["Content-Type"] = "text/html"; |
14 | prebuffer.str(""); | 14 | prebuffer.str(""); |
15 | headers_flushed = false; | ||
16 | set_buffering(true); | ||
15 | } | 17 | } |
16 | 18 | ||
17 | void sitecing_interface_cgi::flush() { | 19 | void sitecing_interface_cgi::flush(bool keep_buffering) { |
18 | assert(cgigw); | 20 | assert(cgigw); |
21 | flush_headers(); | ||
22 | if(is_buffering()) { | ||
23 | streampos count = prebuffer.pubseekoff(0,ios_base::cur,ios_base::out); | ||
24 | cgigw->out().write(prebuffer.str().c_str(),count); | ||
25 | prebuffer.str(""); | ||
26 | } | ||
27 | cgigw->out().flush(); | ||
28 | set_buffering(keep_buffering); | ||
29 | } | ||
30 | |||
31 | void sitecing_interface_cgi::set_buffering(bool do_buffer) { | ||
32 | if(!do_buffer) | ||
33 | flush_headers(); | ||
34 | outs.rdbuf(do_buffer?&prebuffer:cgigw->out().rdbuf()); | ||
35 | } | ||
36 | |||
37 | bool sitecing_interface_cgi::is_buffering() { | ||
38 | return outs.rdbuf()==&prebuffer; | ||
39 | } | ||
40 | |||
41 | void sitecing_interface_cgi::flush_headers() { | ||
42 | assert(cgigw); | ||
43 | if(headers_flushed) | ||
44 | return; | ||
19 | for(headers_t::const_iterator i=headers.begin();i!=headers.end();i++) | 45 | for(headers_t::const_iterator i=headers.begin();i!=headers.end();i++) |
20 | cgigw->out() << i->first << ": " << i->second << "\n"; | 46 | cgigw->out() << i->first << ": " << i->second << "\n"; |
21 | (cgigw->out() << "\n").write(prebuffer.str().c_str(),prebuffer.tellp()); | 47 | cgigw->out() << "\n"; |
22 | cgigw->out().flush(); | 48 | headers_flushed = true; |
23 | } | 49 | } |
24 | 50 | ||
25 | } | 51 | } |